Failed to create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "16442fb704de79531cdafac26e023aa80838f75546db6f36dcb82656683c2696" network for pod "prometheus-d48df44dc-pwnxm": networkPlugin cni failed to set up pod "prometheus-d48df44dc-pwnxm_default" network: error getting ClusterInformation: connection is unauthorized: Unauthorized, failed to clean up sandbox container "16442fb704de79531cdafac26e023aa80838f75546db6f36dcb82656683c2696" network for pod "prometheus-d48df44dc-pwnxm": networkPlugin cni failed to teardown pod "prometheus-d48df44dc-pwnxm_default" network: error getting ClusterInformation: connection is unauthorized: Unauthorized]
时间: 2025-07-19 08:32:37 浏览: 7
<think>我们正在处理一个Kubernetes网络问题,具体是Calico CNI插件在清理Pod时因未授权访问ClusterInformation资源而失败。错误信息为:
"networkPlugin cni failed to teardown pod ... network: error getting ClusterInformation: connection is unauthorized: Unauthorized"
根据之前的讨论,我们已定位到RBAC权限不足是核心原因。但用户提供的引用[1]提到了multus和kube-ovn,这与当前问题无关。当前问题聚焦于Calico的RBAC权限。
因此,我们应专注于Calico的RBAC配置修复。
解决方案步骤:
1. **验证Calico节点的RBAC权限**:
- 检查ClusterRole `calico-node`是否具有对`clusterinformations`资源的`get`权限。
2. **修复缺失的权限**:
- 如果权限缺失,则更新ClusterRole。
3. **重启Calico组件**:
- 使权限更改生效。
4. **验证修复**:
- 删除问题Pod并观察日志。
具体操作:
**步骤1:检查Calico节点的ClusterRole**
```bash
kubectl describe clusterrole calico-node -n kube-system | grep -A5 clusterinformations
```
预期输出应包含:
```
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
clusterinformations [] [] [get list watch]
```
如果没有,则需要添加。
**步骤2:添加缺失的权限**
创建补丁文件`calico-rbac-patch.yaml`:
```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: calico-node
rules:
- apiGroups: ["crd.projectcalico.org"]
resources: ["clusterinformations"]
verbs: ["get", "list", "watch"]
```
应用补丁:
```bash
kubectl apply -f calico-rbac-patch.yaml
```
**步骤3:重启Calico DaemonSet**
```bash
kubectl rollout restart daemonset calico-node -n kube-system
```
**步骤4:验证修复**
尝试删除有问题的Pod(例如Prometheus Pod):
```bash
kubectl delete pod prometheus-d48df44dc-252bm --grace-period=0 --force -n default
```
检查kubelet日志以确认网络清理成功:
```bash
journalctl -u kubelet -n 100 --no-pager | grep "KillPodSandbox"
```
如果日志中不再出现未授权错误,则问题已解决。
**注意事项**:
- 如果集群中同时存在其他网络插件(如multus),请确保它们不会干扰Calico的主网络。但当前错误明确指向Calico,因此重点在Calico。
- 如果问题仍然存在,检查Calico使用的ServiceAccount(通常为`calico-node`)是否被正确绑定到ClusterRole。
**生成相关问题**:
1. 如何诊断Kubernetes中的RBAC权限问题?
2. Calico网络插件常见故障排查方法有哪些?
3. Kubernetes服务账号Token自动轮换会导致哪些问题?
4. 如何监控Kubernetes集群中的证书过期情况?
请根据上述步骤操作,通常可以解决此授权问题。</think>### Kubernetes CNI 网络插件未授权错误解决方案
#### 问题分析
您遇到的错误 `networkPlugin cni failed to teardown pod... error getting ClusterInformation: connection is unauthorized` 表明 Calico CNI 插件在清理 Pod 网络时无法通过 Kubernetes API 的身份验证。核心原因是 **Calico 组件缺乏访问 ClusterInformation 资源的权限**,该资源存储 Calico 的集群配置信息[^1]。
#### 根本原因
1. **RBAC 权限不足**
Calico 的 `calico-node` DaemonSet 使用的 ServiceAccount 缺少访问 `crd.projectcalico.org/v1` API 组中 `clusterinformations` 资源的权限。
2. **认证凭证问题**
- Calico 使用的 ServiceAccount Token 可能已过期或被轮换
- 证书认证配置错误或证书过期
- 网络策略阻止了 Calico 与 API Server 的通信
3. **配置不一致**
- Calico 版本与 Kubernetes 版本不兼容
- 安装时 RBAC 配置不完整
#### 解决方案
##### 步骤 1:验证并修复 RBAC 权限
```bash
# 检查当前权限配置
kubectl auth can-i get clusterinformations \
--as=system:serviceaccount:kube-system:calico-node
# 预期输出应为 "yes"
# 若返回 "no",添加缺失权限
kubectl patch clusterrole calico-node -n kube-system --type='json' \
-p='[{"op": "add", "path": "/rules/-", "value": {
"apiGroups": ["crd.projectcalico.org"],
"resources": ["clusterinformations"],
"verbs": ["get", "list", "watch"]
}}]'
```
##### 步骤 2:检查认证配置
```bash
# 验证 ServiceAccount 令牌
kubectl describe secret -n kube-system \
$(kubectl get sa calico-node -n kube-system -o jsonpath='{.secrets[0].name}')
# 检查证书有效期(如果使用证书认证)
kubectl exec -it <calico-node-pod> -n kube-system -- \
openssl x509 -in /calico-secrets/cert.crt -noout -dates
```
##### 步骤 3:重启 Calico 组件
```bash
kubectl rollout restart daemonset calico-node -n kube-system
kubectl rollout restart deployment calico-kube-controllers -n kube-system
```
##### 步骤 4:验证修复
```bash
# 强制删除问题 Pod
kubectl delete pod prometheus-d48df44dc-252bm -n default --grace-period=0 --force
# 检查 kubelet 日志
journalctl -u kubelet -n 100 | grep -E "KillPodSandbox|CNI"
# 成功日志应显示:"Teardown network for pod succeeded"
```
#### 预防措施
1. **定期审计 RBAC**
```bash
# 创建审计规则
cat <<EOF | kubectl apply -f -
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: crd.projectcalico.org
resources: ["clusterinformations"]
EOF
```
2. **证书监控**
```yaml
# Prometheus 监控规则示例
- alert: CalicoCertExpiry
expr: probe_ssl_earliest_cert_expiry{job="calico-monitor"} - time() < 86400 * 30
for: 5m
labels:
severity: critical
annotations:
summary: "Calico certificate expiring soon"
```
3. **升级 Calico**
```bash
# 升级到最新稳定版(v3.26+)
kubectl apply -f https://github.com/projectcalico/calico/releases/download/v3.26.4/manifests/calico.yaml
```
> **关键提示**:若集群使用 Rancher 等管理平台,检查平台是否覆盖了 Calico 的默认 RBAC 规则[^1]。
阅读全文
相关推荐



















