【解决】k8s使用flannel网络插件的问题整理

问题1: 拉取镜像失败ImagePullBackOff

问题排查

1、查看所有pod的状态

bash 复制代码
kubectl get pods --all-namespaces

kube-flannel的两个pod状态为ImagePullBackOff,由于镜像拉取异常导致

2、查看pod启动日志,获取更详细的信息

kubectl logs -n 命名空间namespace 容器名称pod-name

bash 复制代码
 kubectl logs -n kube-flannel kube-flannel-ds-4rf8k -c kube-flannel

报错Failed to check br netfilter: stat /proc/sys/net/bridge/bridge-nf-call-iptables: no such file or directory

错误通常表示内核模块 br_netfilter 未加载或未正确配置。br_netfilter 模块用于在桥接网络中启用 iptables 规则,这是 Kubernetes 网络插件Flannel 正常工作的必要条件

github文档-README.md

Flannel 需要 br_netfilter 模块才能启动,从 1.30 版本开始,kubeadm 不再检查该模块是否已安装,如果缺少该模块,Flannel 将无法正确启动。

解决

加载 br_netfilter 模块

bash 复制代码
sudo modprobe br_netfilter

编辑 /etc/modules-load.d/br_netfilter.conf 文件,确保在系统启动时加载 br_netfilter 模块:

bash 复制代码
echo "br_netfilter" | sudo tee /etc/modules-load.d/br_netfilter.conf

配置以启用桥接网络的 iptables 规则

bash 复制代码
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1 # 开启路由转发
net.bridge.bridge-nf-call-ip6tables = 1 # 开启桥流量监控
net.bridge.bridge-nf-call-iptables = 1 # 开启桥流量监控
EOF

生效

bash 复制代码
sudo sysctl --system  

重启kubelet和containerd

bash 复制代码
systemctl daemon-reload
systemctl restart kubelet
systemctl restart containerd

问题2: pod启动失败CrashLoopBackOff

问题排查

1、 查看pod状态

bash 复制代码
kubectl get pods -n kube-flannel

2、查看日志输出

bash 复制代码
kubectl logs -n kube-flannel  kube-flannel-ds-4hlrk

报错Error registering network: failed to acquire lease: node "xxx" pod cidr not assigned

大概意思就是:flannel网络插件在尝试为节点注册网络时,Kubernetes无法为其分配一个Pod CIDR(Pod网络的IP地址范围)。这通常是由于集群的网络配置没有正确地设置CIDR范围。

官方文档中明确指出,必须在kubeadm init的时候设置 --pod-network-cidr=10.244.0.0/16

github文档-kubernetes.md

解决

1、在networking中增加podSubnet: 10.244.0.0/16配置

bash 复制代码
kubectl edit cm kubeadm-config -n kube-system

2、修改 controller-manager 静态 pod 的启动参数,在command中增加 --allocate-node-cidrs=true--cluster-cidr=10.244.0.0/16

bash 复制代码
vi /etc/kubernetes/manifests/kube-controller-manager.yaml
yaml 复制代码
- --allocate-node-cidrs=true
- --cluster-cidr=10.244.0.0/16

检查配置生效

bash 复制代码
kubectl cluster-info dump | grep -m 1 cluster-cidr

重启kubelet、containerd

bash 复制代码
systemctl daemon-reload
systemctl restart kubelet
systemctl restart containerd

稍等一会,重新查看pod状态

bash 复制代码
kubectl get pods -A
相关推荐
engchina8 小时前
WSL Ubuntu で Kubernetes v1.34.2 + Docker 環境を構築する
ubuntu·docker·kubernetes
Gold Steps.12 小时前
OpenEBS — 云原生 CNS 高性能存储
云原生·kubernetes·存储
广州中轴线19 小时前
OpenStack on Kubernetes 生产部署实战(十三)
容器·kubernetes·openstack
切糕师学AI20 小时前
Helm Chart 是什么?
云原生·kubernetes·helm chart
广州中轴线21 小时前
OpenStack on Kubernetes 生产部署实战(十七)
容器·kubernetes·openstack
研究司马懿1 天前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
Harvey9031 天前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
陈桴浮海1 天前
Kustomize实战:从0到1实现K8s多环境配置管理与资源部署
云原生·容器·kubernetes
张小凡vip1 天前
Kubernetes--k8s中部署redis数据库服务
redis·kubernetes
Hello.Reader2 天前
Flink Kubernetes HA(高可用)实战原理、前置条件、配置项与数据保留机制
贪心算法·flink·kubernetes