【解决】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
相关推荐
闲云野鹤在人间7 小时前
Kubernetes Service 与 kube-proxy 详解
云原生·容器·kubernetes
我不会起名字3228 小时前
节点 NotReady:kubelet 与容器运行时的 4 步排查
云原生·kubernetes·kubelet·排查
闲云自留地9 小时前
K8s Service 全解:服务发现、四种类型、会话保持、金丝雀发布一篇通
容器·kubernetes·服务发现
fb_1234515 小时前
K8s 网络通关手册:Ingress-Nginx 生产级路由 + Calico 三种隧道模式 + NetworkPolicy 白名单实战
网络·nginx·kubernetes
KIDULT°16 小时前
K8s 网络进阶实战:Ingress-Nginx、Calico 与 NetworkPolicy 实验 + 排坑记录
网络·nginx·云原生·kubernetes
fengkai454516 小时前
7、Kubernetes的Ingress&Network&Scheduler
运维·kubernetes·k8s·ingress·network·scheduler
xianyuCcCcCCCcc2 天前
Kubernetes Service 与网络代理
网络·云原生·kubernetes
我不会起名字3222 天前
PV/PVC 一直 Pending:StorageClass 与绑定条件的 4 个检查点
云原生·kubernetes·pvc·排查
程序猿阿越2 天前
从 StatefulSet 到容器挂载:CSI 源码走读
后端·kubernetes·源码阅读
weixin_539446783 天前
Ubuntu部署Minikube
kubernetes