问题描述:

某日rancher 上出现某个之前连接的节点Unavailable了,按照惯例删除重建

粘贴执行创建cattle-agent 命令

curl --insecure -sfL https://192.168.110.125/v3/import/bpf7pn4bt4vsnpnvzfxg25nscc4lmxgdcs22fvxw89tblqvb8kwtp8_c-m-xmccvlnt.yaml | kubectl apply -f -

报错

(base) [root@feiteng ~]# curl --insecure -sfL https://192.168.110.125/v3/import/bpf7pn4bt4vsnpnvzfxg25nscc4lmxgdcs22fvxw89tblqvb8kwtp8_c-m-xmccvlnt.yaml | kubectl apply -f -
clusterrole.rbac.authorization.k8s.io/proxy-clusterrole-kubeapiserver unchanged
clusterrolebinding.rbac.authorization.k8s.io/proxy-role-binding-kubernetes-master unchanged
Warning: Detected changes to resource cattle-system which is currently being deleted.
namespace/cattle-system unchanged
clusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding unchanged
clusterrole.rbac.authorization.k8s.io/cattle-admin unchanged
Error from server (Forbidden): error when creating "STDIN": serviceaccounts "cattle" is forbidden: unable to create new content in namespace cattle-system because it is being terminated
Error from server (Forbidden): error when creating "STDIN": secrets "cattle-credentials-493e6d9" is forbidden: unable to create new content in namespace cattle-system because it is being terminated
Error from server (Forbidden): error when creating "STDIN": deployments.apps "cattle-cluster-agent" is forbidden: unable to create new content in namespace cattle-system because it is being terminated
Error from server (Forbidden): error when creating "STDIN": services "cattle-cluster-agent" is forbidden: unable to create new content in namespace cattle-system because it is being terminated

查了下问题说错误信息表明你在尝试创建一个名为 cattle-cluster-agent 的部署时遇到了问题。具体来说,错误原因是:

  • Forbidden: 你没有权限执行该操作。
  • namespace cattle-system because it is being terminated: 这个命名空间(cattle-system)正在被终止,因此无法在其中创建新的内容。

给出的解决方式很暴力就是删除重建

删除重建一般步骤

  1. 如果资源正在删除等待终止完成:如果命名空间正在终止,可能需要等待一段时间,直到它完全被删除。

  2. 强制删除命名空间:如果命名空间长时间处于终止状态,可能需要强制删除它:

    kubectl delete namespace cattle-system --grace-period=0 --force
    
  3. 重新创建命名空间:一旦 cattle-system 命名空间被删除,你可以再次创建它:

    kubectl create namespace cattle-system
    
  4. 重新部署:最后,重新尝试创建 cattle-cluster-agent 部署。

但是执行带--force的强制删除确阻塞住了,执行几次都必需crl+D退出

此时kubectl delete namespace cattle-system --grace-period=0 --force 命令卡住,可能是因为命名空间中有资源未能正常清理。以下是一些处理方法:

解决无法删除ns方法

1. 检查资源状态

首先,检查 cattle-system 命名空间中有哪些资源仍在运行,使用以下命令:

kubectl get all -n cattle-system

2. 手动删除资源

如果有资源仍在运行,尝试手动删除这些资源。可以使用以下命令逐个删除:

kubectl delete pod --all -n cattle-system
kubectl delete svc --all -n cattle-system
kubectl delete deployment --all -n cattle-system
# 以及其他资源类型

3. 强制删除命名空间

如果以上步骤仍然没有解决问题,可以尝试通过直接编辑命名空间的状态来强制删除它:

  1. 获取命名空间的详细信息

    kubectl get namespace cattle-system -o json > ns.json
    
  2. 编辑 JSON 文件:打开 ns.json 文件,找到 "spec": { "finalizers": [...] } 部分,删除 finalizers 字段及其内容。

  3. 更新命名空间

kubectl replace --raw "/api/v1/namespaces/cattle-system/finalize" -f ns.json

执行完成查看 cattle-system 空间已经删除了

再次创建出现下面错误

Error while applying agent YAML, it will be retried automatically: exit status 1, Error from server (InternalError): an error on the server ("unable to create impersonator account: error setting up impersonation for user u-jjmvklx27n: impersonation: error creating secret for service account cattle-impersonation-u-jjmvklx27n") has prevented the request from succeeding

问题分析

错误含义
  • "This cluster is currently Provisioning":表示集群仍在配置过程中,Rancher 尚未完成与下游集群的连接。
  • "unable to create impersonator account":Rancher 使用模拟(impersonation)机制为用户(如 u-itpncp567y)创建临时的服务账号(如 cattle-impersonation-u-itpncp567y)和相关密钥(secret),以便代理用户操作 Kubernetes API。但创建密钥失败,导致请求无法完成。
  • "error creating secret for service account":表明在 cattle-impersonation-system 命名空间中为服务账号创建密钥时出错。
可能原因
  1. RBAC 权限不足
    • cattle-cluster-agent 使用的服务账号 cattle(位于 cattle-system 命名空间)可能缺乏创建服务账号或密钥的权限。
  2. 资源配额限制
    • cattle-impersonation-system 命名空间可能有资源配额(如 secret 数量限制),导致无法创建新密钥。
  3. Kubernetes API 问题
    • 下游集群的 API 服务器可能不稳定或配置错误,导致 Rancher 无法完成操作。

解决步骤

1. 检查 cattle-cluster-agent 的日志

获取更多错误细节:

kubectl logs -n cattle-system deployment/cattle-cluster-agent

  • 查找与 impersonation、secret 或 cattle-impersonation-u-itpncp567y 相关的具体错误。
  • 如果日志显示权限问题(Forbidden),可能是 RBAC 配置错误。
2. 验证 cattle 服务账号权限

cattle-cluster-agent 使用 cattle 服务账号,检查其权限:

kubectl get clusterrolebinding -o wide | grep cattle
  • 通常应看到类似 cattle-admin-binding,绑定到 cattle 服务账号和 cluster-admin 角色。
  • 如果缺失或权限不足,修复 RBAC:

    apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cattle-admin-binding subjects: - kind: ServiceAccount name: cattle namespace: cattle-system roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io

  • kubectl apply -f cattle-admin-binding.yaml
3. 检查 cattle-impersonation-system 命名空间

确认是否存在目标服务账号和密钥:

kubectl get serviceaccount -n cattle-impersonation-system cattle-impersonation-u-itpncp567y

kubectl get secret -n cattle-impersonation-system | grep cattle-impersonation-u-itpncp567y

  • 如果服务账号存在但没有关联密钥,尝试删除并让 Rancher 重试:

kubectl delete serviceaccount -n cattle-impersonation-system cattle-impersonation-u-itpncp567y

  • 如果密钥存在但状态异常,删除:

kubectl delete secret -n cattle-impersonation-system cattle-impersonation-u-itpncp567y-token-<hash>

4. 检查资源配额

查看 cattle-impersonation-system 命名空间是否有配额限制:

kubectl get resourcequota -n cattle-impersonation-system

kubectl describe resourcequota -n cattle-impersonation-system

按照面前流程删除 cattle-impersonation-system

重新创建, 没有Provisioning 错误

附一个处理脚本

#!/bin/bash

# 定义要删除的命名空间列表
NAMESPACES=("cattle-system" "cattle-impersonation-system")

# 循环处理每个命名空间
for ns in "${NAMESPACES[@]}"; do
    echo "开始处理命名空间: $ns"

    # 尝试常规强制删除
    echo "尝试常规强制删除..."

    if kubectl get namespace "$ns" &>/dev/null; then
        echo "常规删除失败,执行深度清理..."

        # 导出命名空间的JSON描述
        kubectl get namespace "$ns" -o json > "ns-$ns.json"

        # 删除finalizers字段
        sed -i '/"finalizers": \[/,/\]/d' "ns-$ns.json"

        # 替换命名空间的finalize配置
        kubectl replace --raw "/api/v1/namespaces/$ns/finalize" -f "ns-$ns.json"

        # 再次强制删除
        kubectl delete namespace "$ns" --grace-period=0 --force

        # 清理临时文件
        rm -f "ns-$ns.json"

        # 检查是否删除成功
        sleep 5
        if kubectl get namespace "$ns" &>/dev/null; then
            echo "警告: 命名空间 $ns 仍然存在,请检查集群状态"
        else
            echo "成功删除命名空间: $ns"
        fi
    else
        echo "成功删除命名空间: $ns"
    fi
    echo "------------------------"
done

echo "所有操作完成"

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐