本文永久链接: https://www.xtplayer.cn/rke2/rke2-restore-or-update-the-rancher2-connection-info-json-file/
对于以下场景,我们需要进行 /var/lib/rancher/agent/rancher2_connection_info.json 文件更新或者恢复。
- 当 rancher url 对应的 CA 文件修改后,rancher-system-agent 服务会因为无法通过 CA 校验而无法连接 Rancher API。
- 某些情况下导致
/var/lib/rancher/agent/rancher2_connection_info.json 文件丢失,需要进行配置文件恢复。
方法一,通过 rancher api 获取 rancher2_connection_info.json
- 获取
CATTLE_TOKEN :如果这里设置用户 API KEY 会报 500 错误。需要进入集群管理,点击目标集群,点击节点注册,在节点注册命令中获取此 token。如果是类似 elemental 创建的 rke2 集群,可能无法从 rancher ui 上获取节点注册命令。这种情况可以通过 Rancher API 获取 token,浏览器访问 <rancher-url>/v1/management.cattle.io.clusterregistrationtokens/<cluster_id>/default-token 接口可以看到节点注册命令,其中有 token 信息。或者在 local 集群中执行 kubectl get clusterregistrationtokens.management.cattle.io -n <cluster_id> default-token -oyaml 可以查看到节点注册信息。其中的 <cluster_id> 可以在 rancher ui 获取,点击 rancher ui 左上角的目标集群,然后在浏览器地址栏中可以查看到集群 ID,通常为 c 开头的字符串,比如 dashboard/c/c-m-pfx6cfqv/explorer#cluster-events,其中 c-m-pfx6cfqv 为集群 ID。
- 保存以下脚本内容到需要更新或者恢复 rancher2_connection_info.json 文件的节点,比如设置脚本名称为
retrieve_connection_info.sh。
- 修改脚本中的
CATTLE_SERVER_URL CATTLE_TOKEN,
- 最后执行
bash retrieve_connection_info.sh。
#!/bin/bash set -e
CATTLE_SERVER_URL=https://10.201.170.123:8443
CATTLE_TOKEN=hlqb8jsw4xdx6pfxxxxxxxxxxxxxx CATTLE_AGENT_VAR_DIR=/var/lib/rancher/agent
CURL_LOG="-sS"
mkdir -p ${CATTLE_AGENT_VAR_DIR}
if [ -f ${CATTLE_AGENT_VAR_DIR}/rancher2_connection_info.json ]; then BACKUP_FILE="${CATTLE_AGENT_VAR_DIR}/rancher2_connection_info-$(date +%Y%m%d_%H%M%S).json" cp ${CATTLE_AGENT_VAR_DIR}/rancher2_connection_info.json ${BACKUP_FILE} echo "Backup created: ${BACKUP_FILE}" fi
if [ -f "/etc/rancher/agent/cattle-id" ]; then CATTLE_ID=$(cat /etc/rancher/agent/cattle-id) echo "Using cattle-id: ${CATTLE_ID}"
HTTP_CODE=$(curl -kL --connect-timeout 60 --max-time 60 --write-out "%{http_code}\n" ${CURL_LOG} \ -H "Authorization: Bearer ${CATTLE_TOKEN}" \ -H "X-Cattle-Id: ${CATTLE_ID}" \ "${CATTLE_SERVER_URL}/v3/connect/agent" \ -o ${CATTLE_AGENT_VAR_DIR}/rancher2_connection_info.json.tmp)
if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "201" ] || [ "$HTTP_CODE" = "204" ]; then if [ -s ${CATTLE_AGENT_VAR_DIR}/rancher2_connection_info.json.tmp ]; then mv ${CATTLE_AGENT_VAR_DIR}/rancher2_connection_info.json.tmp ${CATTLE_AGENT_VAR_DIR}/rancher2_connection_info.json chmod 600 ${CATTLE_AGENT_VAR_DIR}/rancher2_connection_info.json echo "Connection info updated successfully" echo "Restarting rancher-system-agent service..." systemctl restart rancher-system-agent journalctl -xef -u rancher-system-agent.service else echo "Warning: Failed to update connection info, downloaded file is empty" >&2 exit 1 fi else echo "Failed to update connection info, HTTP code: ${HTTP_CODE}" >&2 exit 1 fi else echo "Warning: /etc/rancher/agent/cattle-id not found" >&2 fi
|
方法二,通过在 local 集群执行 kubectl 命令获取 rancher2_connection_info.json
- 定义 local 集群的 kubeconfig 配置文件路径和 rancher url 地址。
- 在集群管理中,进入目标集群获取异常节点的 id。这里的节点 id 一般是 custom 打头,比如 custom-b087403164cd。
- NAMESPACE 保存默认。
export KUBECONFIG=/home/hxl/local-kubeconfig.yaml export RANCHER_URL=https://10.201.170.123:8443
export NODE_NAME=custom-b087403164cd export NAMESPACE=fleet-default
export RANCHER_CACERT=$( kubectl get settings.management.cattle.io cacerts -o jsonpath='{.value}' | base64 -w 0 ) export TOKEN=$( kubectl -n fleet-default get secrets -l cattle.io/service-account.name=${NODE_NAME}-machine-plan -o jsonpath='{.items[0].data.token}' | base64 -d )
KUBE_CONFIG=$(cat <<EOF apiVersion: v1 clusters: - cluster: certificate-authority-data: ${RANCHER_CACERT} server: ${RANCHER_URL} name: agent contexts: - context: cluster: agent user: agent name: agent current-context: agent kind: Config preferences: {} users: - name: agent user: token: ${TOKEN} EOF )
cat > rancher2_connection_info.json.tmp <<EOF { "kubeConfig": "$(echo "${KUBE_CONFIG}" | sed 's/"/\\"/g' | awk '{printf "%s\\n", $0}' | sed 's/$/\\n/' | tr -d '\n')", "namespace": "${NAMESPACE}", "secretName": "${NODE_NAME}-machine-plan" } EOF
|