解决rancher-agent创建serviceaccounts “cattle“ is forbidden: unable to create new content in namespace
某日rancher 上出现某个之前连接的节点Unavailable了,按照惯例删除重建粘贴执行创建cattle-agent 命令报错查了下问题说错误信息表明你在尝试创建一个名为的部署时遇到了问题。给出的解决方式很暴力就是删除重建。
问题描述:
某日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
)正在被终止,因此无法在其中创建新的内容。
给出的解决方式很暴力就是删除重建
删除重建一般步骤
-
如果资源正在删除等待终止完成:如果命名空间正在终止,可能需要等待一段时间,直到它完全被删除。
-
强制删除命名空间:如果命名空间长时间处于终止状态,可能需要强制删除它:
kubectl delete namespace cattle-system --grace-period=0 --force
-
重新创建命名空间:一旦
cattle-system
命名空间被删除,你可以再次创建它:kubectl create namespace cattle-system
-
重新部署:最后,重新尝试创建
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. 强制删除命名空间
如果以上步骤仍然没有解决问题,可以尝试通过直接编辑命名空间的状态来强制删除它:
-
获取命名空间的详细信息:
kubectl get namespace cattle-system -o json > ns.json
-
编辑 JSON 文件:打开
ns.json
文件,找到"spec": { "finalizers": [...] }
部分,删除finalizers
字段及其内容。 -
更新命名空间:
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 命名空间中为服务账号创建密钥时出错。
可能原因
- RBAC 权限不足:
- cattle-cluster-agent 使用的服务账号 cattle(位于 cattle-system 命名空间)可能缺乏创建服务账号或密钥的权限。
- 资源配额限制:
- cattle-impersonation-system 命名空间可能有资源配额(如 secret 数量限制),导致无法创建新密钥。
- 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 "所有操作完成"
更多推荐
所有评论(0)