本文永久链接: 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

  1. 获取 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。
  2. 保存以下脚本内容到需要更新或者恢复 rancher2_connection_info.json 文件的节点,比如设置脚本名称为 retrieve_connection_info.sh
  3. 修改脚本中的 CATTLE_SERVER_URL CATTLE_TOKEN
  4. 最后执行 bash retrieve_connection_info.sh
#!/bin/bash
set -e # 遇到错误立即退出

CATTLE_SERVER_URL=https://10.201.170.123:8443
# 注意: 需要进入集群管理,点击目标集群,点击节点注册,在节点注册命令中获取此 token。获取用户 API KEY 会报 500 错误。
CATTLE_TOKEN=hlqb8jsw4xdx6pfxxxxxxxxxxxxxx
CATTLE_AGENT_VAR_DIR=/var/lib/rancher/agent
# 如果启用 debug, 添加 v 参数
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"
# 重启 rancher-system-agent 服务
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

  1. 定义 local 集群的 kubeconfig 配置文件路径和 rancher url 地址。
  2. 在集群管理中,进入目标集群获取异常节点的 id。这里的节点 id 一般是 custom 打头,比如 custom-b087403164cd。
  3. 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 )

# Generate the kubeconfig content with expanded variables
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
)

# Output the JSON
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