Warning FailedCreatePodSandBox 8m42s (x2284 over 48m) kubelet, node2 (combined from similar events): Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "c5715a778d0539a13bab0a3d1654b95ee0155a2771cb9270b6434be4342e197c" network for pod "nginx-6867cdf567-s4zb9": networkPlugin cni failed to set up pod "nginx-6867cdf567-s4zb9_default" network: loadFlannelSubnetEnv failed: open /run/flannel/subnet.env: no such file or directory Normal SandboxChanged 3m42s (x2579 over 48m) kubelet, node2 Pod sandbox changed, it will be killed and re-created.
时间: 2025-03-28 15:12:02 浏览: 116
### Kubernetes 中 Flannel 网络插件相关 `FailedCreatePodSandBox` 错误解决方案
当遇到 Kubernetes 集群中的 Pod 处于 `Creating` 或者 `CrashLoopBackOff` 状态时,通过运行命令 `kubectl describe pod <pod-name>` 可能会显示类似于以下错误:
```
NetworkPlugin cni failed to set up pod "<pod-name>" network: open /run/flannel/subnet.env: no such file or directory
```
此问题通常与 Flannel CNI 插件配置有关。以下是可能的原因以及对应的解决方法。
---
#### **原因分析**
1. 缺少 `/run/flannel/subnet.env` 文件。
- 此文件由 Flannel 创建并用于分配子网给各节点。如果该文件缺失,则表明 Flannel 的初始化未完成或失败[^1]。
2. 节点上的网络接口冲突。
- 如果在重新部署 Flannel 后仍然报错 `"cni0" already has an IP address different from ...`,则可能是旧的网络配置残留导致新配置无法生效[^2]。
3. 手动创建的 `subnet.env` 文件内容不正确。
- 若手动创建了 `/run/flannel/subnet.env` 文件,但其参数设置不符合实际需求(如子网范围与其他组件冲突),也会引发上述错误[^3]。
---
#### **解决方法**
##### 方法一:检查并修复缺少的 `subnet.env` 文件
- 登录到出现问题的节点,确认是否存在 `/run/flannel/subnet.env` 文件:
```bash
ls /run/flannel/
```
- 如果不存在该文件,可以从其他正常工作的节点复制过来:
```bash
scp user@<other-node>:/run/flannel/subnet.env /run/flannel/subnet.env
```
- 如果没有可用节点提供备份文件,可以手动创建一个临时版本:
```bash
cat <<EOF >/run/flannel/subnet.env
FLANNEL_NETWORK=10.10.0.0/16
FLANNEL_SUBNET=10.10.<node-id>.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF
```
替换 `<node-id>` 为当前节点唯一编号,确保不会和其他节点重复。
##### 方法二:删除冲突的网络接口
- 当重新应用 Flannel 配置后仍提示 `"cni0"` 接口存在冲突时,需清理旧的网络配置:
```bash
ifconfig cni0 down
ip link delete cni0
```
- 清理完成后重启 kubelet 和 docker 服务以使更改生效:
```bash
systemctl restart kubelet
systemctl restart docker
```
##### 方法三:重新安装 Flannel 组件
- 使用官方 YAML 文件重新部署 Flannel:
```bash
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
```
- 注意观察日志输出,确保新的 Flannel 实例成功启动且无异常。
##### 方法四:验证集群网络配置一致性
- 检查所有节点是否具有相同的 CIDR 设置:
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-flannel-cfg
namespace: kube-system
data:
net-conf.json: |
{
"Network": "10.10.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
```
- 修改以上配置后重新同步至所有节点,并再次尝试启动受影响的 Pods。
---
#### **代码示例**
以下是一个简单的脚本,帮助自动化部分操作流程:
```bash
#!/bin/bash
NODE_ID=$1
SUBNET="10.10.${NODE_ID}.1/24"
echo "FLANNEL_NETWORK=10.10.0.0/16" > /run/flannel/subnet.env
echo "FLANNEL_SUBNET=${SUBNET}" >> /run/flannel/subnet.env
echo "FLANNEL_MTU=1450" >> /run/flannel/subnet.env
echo "FLANNEL_IPMASQ=true" >> /run/flannel/subnet.env
ifconfig cni0 down || true
ip link delete cni0 || true
systemctl restart kubelet
systemctl restart docker
```
保存为 `fix_flannel.sh` 并赋予可执行权限:
```bash
chmod +x fix_flannel.sh
./fix_flannel.sh <your-node-id>
```
---
###
阅读全文
相关推荐
















