解决k8s集群环境 容器组 报 network: open /run/flannel/subnet.env: no such file or directory

 k8s集群环境   由于机器显卡故障,导致节点连接失败,出现大量1000多个 pending 容器, 查看容器

 容器组里 报

  network is not ready: [runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker:  network plugin is not ready: cni config uninitialized]   

 network: open /run/flannel/subnet.env: no such file or directory

 看网上一些方法 是把其他机器   /run/flannel/subnet.env 考到这台机器 试过后,虽然能恢复,

 但一头栽进 容器内部无法连外网,一直找为啥容器无法连外网,这个坑。。。。

折腾了一大圈,最后教训是 让k8s自己恢复  网络

 在master 节点 执行  

    kubectl apply -f kube-flannel.yml

    稍等可以看到该节点 的   kube-flannel-xxxx   部署正常,其余的坐等k8s 自己恢复即可

  

<think>好的,用户现在遇到了一个错误信息:“calico network: open /run/flannel/subnet.env: no such file or directory”。我需要分析这个问题出现的原因,并给出解决方案。 首先,用户之前的提问是关于/etc/cni/net.d中缺少10-calico.conflist文件的问题,现在又出现了与Flannel相关的错误。这说明用户可能在同一个Kubernetes集群中同时使用了Calico和Flannel,或者之前安装过Flannel但未完全清理,导致残留文件影响Calico的正常运行。 接下来,我需要思考为什么Calico会尝试访问Flannel的配置文件。Calico通常不会依赖Flannelsubnet.env文件,除非用户配置了Calico以某种方式与Flannel集成,比如使用Canal(Calico和Flannel的结合方案)。如果用户错误地配置了Calico,或者安装过程中混用了两者的配置,可能会导致这种情况。 另一个可能性是用户之前安装过Flannel,后来切换到Calico,但未正确清理Flannel的残留文件,尤其是kube-flannel的DaemonSet可能还在运行,导致Flannel试图创建自己的CNI配置,而Calico则尝试读取这些已经不存在的文件。 此外,检查用户的环境是否有手动配置的CNI插件或网络策略,可能错误地引用了Flannel的路径。或者,在安装Calico时使用的manifest文件中可能包含了对Flannel的依赖,例如在配置中错误地指定了subnet.env的位置。 接下来,我需要确定解决步骤。首先,用户需要确认是否同时安装了Flannel和Calico,或者是否有残留的Flannel组件。然后,彻底清理Flannel的相关文件和服务,包括删除DaemonSet、配置文件等。之后,重新安装Calico,确保没有残留配置干扰。 另外,需要检查Calico的安装配置是否正确,特别是网络配置部分,是否错误地指向了Flannelsubnet.env文件。如果是这样,需要修正Calico的配置文件,使用正确的CIDR配置。 可能用户在使用kubeadm初始化集群时指定了pod-network-cidr,但未正确配置Calico来使用该CIDR,导致Calico试图从Flannel的配置文件中获取CIDR信息,但该文件不存在。 总结下来,解决步骤可能包括: 1. 检查是否有Flannel残留组件并清理。 2. 确认Calico的配置是否正确,特别是Pod网络的CIDR设置。 3. 清理CNI配置目录,重新安装Calico。 4. 确保没有其他CNI插件干扰。 需要详细指导用户执行这些步骤,并提供具体的命令,例如如何删除Flannel的DaemonSet,如何修改Calico的manifest文件以指定正确的CIDR,以及如何清理CNI配置目录。 同时,需要提醒用户在安装Calico之前确保所有其他CNI插件已彻底卸载,避免配置冲突。另外,检查kubelet的日志和Calico的Pod日志有助于进一步诊断问题。 最后,验证网络功能是否恢复正常,例如部署测试Pod并检查其状态,确保网络连通性。</think>### **问题分析** 当 Calico 错 `open /run/flannel/subnet.env: no such file or directory` 时,通常是因为 **Calico 配置中错误地依赖了 Flannel 的配置文件**,但 Flannel 并未安装或已卸载。以下是详细解释和解决方案: --- ### **1. 问题根源** - **Flannel 残留配置干扰**: Calico 的某些安装配置(如 `calico.yaml`)可能默认尝试与 Flannel 集成(例如使用 **Canal 模式**,即 Calico 负责策略,Flannel 负责网络)。如果 Flannel 未正确部署,会导致 Calico 因缺失 Flannel 的配置文件而错。 - **错误的手动配置**: 用户可能修改了 Calico 的 CNI 配置,直接引用了 `/run/flannel/subnet.env` 中的环境变量(如 `NETWORK` 或 `SUBNET`)。 --- ### **2. 分步解决方案** #### **步骤 1:确认是否混合使用 Flannel 和 Calico** 检查集群中是否残留 Flannel 组件: ```bash kubectl get pods -n kube-system | grep flannel kubectl get daemonset -n kube-system | grep flannel ``` - **若存在 Flannel Pod**:需彻底卸载 Flannel: ```bash kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` --- #### **步骤 2:清理 Flannel 残留文件** 手动删除 Flannel 生成的文件: ```bash sudo rm -rf /run/flannel # 删除 Flannel 运行时目录 sudo rm -f /etc/cni/net.d/*-flannel.conflist # 清理 Flannel 的 CNI 配置 ``` --- #### **步骤 3:修正 Calico 配置** 如果使用的是 **Canal 模式**(Calico+Flannel),需切换为纯 Calico 模式: 1. **下载 Calico 官方 manifest 文件**: ```bash curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O ``` 2. **修改配置**: 在 `calico.yaml` 中搜索 `flannel` 相关配置并删除或注释以下字段: ```yaml # 删除 Flannel 相关的环境变量和卷挂载(示例): - name: WAIT_FOR_DATASTORE value: "true" # - name: FLANNEL_SUBNET_FILE # value: "/run/flannel/subnet.env" # volumes: # - name: flannel-cfg # hostPath: # path: /run/flannel ``` 3. **重新部署 Calico**: ```bash kubectl apply -f calico.yaml ``` --- #### **步骤 4:显式指定 Calico 的 Pod 网段** 如果集群初始化时已指定 `--pod-network-cidr`(如 `10.244.0.0/16`),需在 Calico 配置中显式声明该网段: 1. **编辑 `calico.yaml`**: 搜索 `CALICO_IPV4POOL_CIDR` 并取消注释: ```yaml - name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16" # 与 kubeadm 的 --pod-network-cidr 一致 ``` 2. **应用更新后的配置**: ```bash kubectl apply -f calico.yaml ``` --- ### **3. 验证修复** 1. **检查 Calico Pod 状态**: ```bash kubectl get pods -n kube-system | grep calico-node ``` 2. **确认 CNI 配置文件生成**: ```bash ls -l /etc/cni/net.d/ # 应存在 10-calico.conflist,而非 Flannel 文件 ``` 3. **部署测试 Pod**: ```bash kubectl run nginx --image=nginx --restart=Never kubectl get pod nginx -w # 观察是否进入 Running 状态 ``` --- ### **4. 常见场景及修复** #### **场景 1:误用 Canal 模式** - **现象**:直接使用 `canal.yaml` 部署,但未安装 Flannel。 - **修复**: 改用纯 Calico 模式,或同时安装 Flannel(不推荐混合使用)。 #### **场景 2:kubeadm 初始化参数冲突** - **现象**:使用 `kubeadm init --pod-network-cidr=10.244.0.0/16` 初始化集群,但未在 Calico 中配置相同 CIDR。 - **修复**: 在 Calico 的 `CALICO_IPV4POOL_CIDR` 中显式指定该 CIDR。 --- ### **5. 总结** | **原因** | **关键操作** | |---------------------------|------------------------------------------| | Flannel 残留配置或 Canal 模式 | 卸载 Flannel,修正 Calico 配置 | | Calico 未指定 Pod 网段 | 显式配置 `CALICO_IPV4POOL_CIDR` | | 文件路径错误引用 | 清理 `/run/flannel` 目录及相关 CNI 配置 | 若问题仍未解决,提供以下信息进一步排查: ```bash # 1. Calico 节点日志 kubectl logs -n kube-system <calico-node-pod-name> # 2. kubelet 日志 journalctl -u kubelet --since "10 minutes ago" ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值