network for pod "calico-kube-controllers-7d779f59db-kgkxd": networkPlugin cni failed to set up pod "calico-kube-controllers-7d779f59db-kgkxd_kube-system" network: open /run/flannel/subnet.env: no such file or directory
时间: 2025-07-10 20:48:55 浏览: 10
<think>好的,我现在需要帮助用户解决他们遇到的Calico网络插件问题,具体是关于Pod "calico-kube-controllers-7d779f59db-kgkxd" 的网络设置失败,错误信息是找不到`/run/flannel/subnet.env`文件。首先,我需要分析这个问题的可能原因,并给出解决方案。
首先,用户的问题中提到`networkPlugin cni failed to set up pod`,并且错误是`open /run/flannel/subnet.env: no such file or directory`。这表明Calico在尝试访问Flannel的配置文件,但该文件不存在。这通常发生在混合使用Calico和Flannel的情况下,或者之前的Flannel安装没有完全清理干净。
接下来,我需要考虑可能的原因。首先,用户可能同时安装了Calico和Flannel,这两个CNI插件可能会冲突,因为它们各自管理网络的方式不同。其次,可能在安装Calico之前,集群中曾经使用过Flannel,但卸载不彻底,残留了某些配置或文件,导致Calico错误地引用了Flannel的配置。第三,Calico的配置文件可能错误地指向了Flannel的路径,或者配置错误,导致它试图读取Flannel的文件。
然后,我需要制定解决方案。首先,检查是否同时安装了Flannel和Calico,如果存在这种情况,需要彻底卸载其中一个。其次,清理残留的Flannel文件和配置,包括删除Flannel的DaemonSet、配置文件以及`/run/flannel`目录。然后,重新安装Calico,并确保配置正确。此外,还需要检查Calico的配置是否正确,特别是与网络相关的配置,如IP池设置是否正确,是否与其他插件冲突。最后,验证Pod的状态和网络是否恢复正常。
在思考过程中,还需要考虑用户可能的环境情况。例如,用户可能是在迁移CNI插件,从Flannel切换到Calico,或者在安装Calico时未能正确清理之前的Flannel安装。另外,用户可能使用的是特定版本的Kubernetes或Calico,需要确认是否存在版本兼容性问题,或者配置文件是否有变动。
可能的验证步骤包括:检查集群中当前运行的CNI插件,查看是否存在Flannel的残留资源,检查节点上的`/run/flannel`目录是否存在,以及确认Calico的安装配置是否正确。此外,查看Calico的日志可以帮助进一步诊断问题,例如使用`kubectl logs`命令查看相关Pod的日志。
还需要注意一些细节,例如在卸载Flannel时,不仅要删除Deployment或DaemonSet,还要删除CRD、配置文件以及CNI二进制文件,以确保完全清除。同时,在重新安装Calico时,应使用与Kubernetes版本兼容的Calico版本,并按照官方文档正确配置。
总结起来,解决这个问题的关键步骤是:确认并卸载Flannel残留,清理相关文件,重新安装和配置Calico,最后验证网络是否正常工作。此外,提供一些预防措施,比如在切换CNI插件时确保彻底清理旧插件,可以帮助用户避免类似问题再次发生。</think>---
### **问题分析**
错误信息 `open /run/flannel/subnet.env: no such file or directory` 表明 **Calico 尝试读取 Flannel 的配置文件**,但该文件不存在。通常是因为:
1. **混合部署了 Calico 和 Flannel**(冲突的 CNI 插件)
2. **残留 Flannel 配置未清理干净**
3. **Calico 配置错误**(误指向 Flannel 路径)
---
### **逐步解决方案**
#### **1. 检查是否同时存在 Flannel 和 Calico**
```bash
# 查看集群中的 CNI 插件组件
kubectl get pods -n kube-system | grep -E "flannel|calico"
```
- **若输出包含 Flannel Pod**:需卸载 Flannel。
- **若仅有 Calico Pod**:继续排查残留配置。
---
#### **2. 彻底卸载 Flannel 残留**
如果集群曾使用 Flannel,需清理其残留资源:
```bash
# 删除 Flannel 的 DaemonSet 和 ConfigMap
kubectl delete daemonset kube-flannel-ds -n kube-system
kubectl delete configmap kube-flannel-cfg -n kube-system
# 删除节点上的 Flannel 配置文件和 CNI 插件二进制文件
sudo rm -rf /etc/cni/net.d/10-flannel.conflist /run/flannel
sudo rm -f /opt/cni/bin/flannel*
# 重启 kubelet 服务
sudo systemctl restart kubelet
```
---
#### **3. 重新安装 Calico**
确保 Calico 安装配置正确(**推荐使用官方 Manifest**):
```bash
# 下载 Calico 官方配置文件(适配 Kubernetes 版本)
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O
# 修改配置(可选):检查 IP 池 CIDR 是否与集群冲突
sed -i 's/192.168.0.0\/16/10.244.0.0\/16/' calico.yaml # 按需替换 CIDR
# 应用配置
kubectl apply -f calico.yaml
```
---
#### **4. 验证 Calico 组件状态**
```bash
# 检查 Calico Pod 是否全部 Running
kubectl get pods -n kube-system -l k8s-app=calico-node
# 查看 calico-kube-controllers 日志(排查具体错误)
kubectl logs -n kube-system calico-kube-controllers-7d779f59db-kgkxd
```
---
#### **5. 检查网络配置一致性**
确保所有节点上的 CNI 配置目录 `/etc/cni/net.d` 仅包含 Calico 的配置文件(如 `10-calico.conflist`),**无 Flannel 残留文件**。
---
### **常见问题补充**
#### **1. 为什么 Calico 会读取 Flannel 的路径?**
- **历史原因**:若集群曾安装 Flannel,某些残留的 CNI 配置可能未被清除,导致 kubelet 错误调用插件。
- **配置冲突**:Calico 的 CNI 配置文件可能错误引用了 Flannel 的路径(需检查 `/etc/cni/net.d`)。
#### **2. 如何避免 CNI 插件冲突?**
- **严格遵循卸载流程**:切换 CNI 插件时,先彻底卸载旧插件(包括配置文件、二进制文件、DaemonSet)。
- **使用单一 CNI 插件**:禁止同时部署多个 CNI 插件(如 Calico + Flannel)。
---
### **关键命令总结**
| 步骤 | 命令 | 目的 |
|------|------|------|
| 清理 Flannel | `kubectl delete daemonset kube-flannel-ds -n kube-system` | 删除 Flannel 核心组件 |
| 删除残留文件 | `sudo rm -rf /etc/cni/net.d/10-flannel* /run/flannel` | 清理节点配置 |
| 重装 Calico | `kubectl apply -f calico.yaml` | 部署纯净的 Calico |
---
### **后续监控**
1. 观察 Pod `calico-kube-controllers` 是否恢复正常。
2. 检查新创建的 Pod 能否分配 IP 并通信。
3. 若问题依旧,**收集诊断信息**:
```bash
# 导出 Calico 全部资源状态
calicoctl get nodes -o wide
calicoctl get ippool -o yaml
```
---
**提示**:如果问题仍存在,请提供以下信息进一步排查:
- `kubectl describe pod calico-kube-controllers-7d779f59db-kgkxd -n kube-system`
- 节点上 `/etc/cni/net.d/` 目录内容
- kubelet 日志(`journalctl -u kubelet -n 100`)
阅读全文
相关推荐


















