安装好flannel 插件后, 运行flannel的deamonset 启动不起相应的pod来,coredns也报错。以下为排错和修复的过程。
安装好Flannel后报错
在安装好flannel后,可用查看具体的安装yaml文件来了解安装的整个过程和定义的参数,可用将https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml 整个yaml文件通过wget命令下载到一个专门的配置文件目录下,修改后重新kubectl apply -f xxx.yaml 即可重新加载。
默认安装好Flannel后,每个node 都有会daemonset来运行一个kube-flannel的pod来支撑CNI的运作。
当我安装好后运行时,发现相应的pod 无法正常启动。同时coredns也在报错。
root@master:/home/bill# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-dpqqv 0/1 CrashLoopBackOff 9 (21s ago) 37m
kube-flannel kube-flannel-ds-lfb5l 0/1 CrashLoopBackOff 9 (32s ago) 37m
kube-flannel kube-flannel-ds-nwd8t 0/1 CrashLoopBackOff 9 (34s ago) 37m
kube-system coredns-668d6bf9bc-qjwcd 0/1 ContainerCreating 0 39m
kube-system coredns-668d6bf9bc-sx8pn 0/1 ContainerCreating 0 39m
kube-system etcd-master 1/1 Running 1 39m
kube-system kube-apiserver-master 1/1 Running 1 39m
kube-system kube-controller-manager-master 1/1 Running 0 39m
kube-system kube-proxy-2nvgg 1/1 Running 0 38m
kube-system kube-proxy-dtspq 1/1 Running 0 39m
kube-system kube-proxy-m5wz6 1/1 Running 0 39m
kube-system kube-scheduler-master 1/1 Running 1 39m
查看log排错
遇到错误不用慌, 第一步就是要查看错误日志,定位问题的根源。
root@master:/home/bill# kubectl logs kube-flannel-ds-dpqqv -n kube-flannel
Defaulted container “kube-flannel” out of: kube-flannel, install-cni-plugin (init), install-cni (init)
I0112 18:57:52.418236 1 main.go:211] CLI flags config: {etcdEndpoints:http://127.0.0.1:4001,http://127.0.0.1:2379 etcdPrefix:/coreos.com/network etcdKeyfile: etcdCertfile: etcdCAFile: etcdUsername: etcdPassword: version:false kubeSubnetMgr:true kubeApiUrl: kubeAnnotationPrefix:flannel.alpha.coreos.com kubeConfigFile: iface:[] ifaceRegex:[] ipMasq:true ifaceCanReach: subnetFile:/run/flannel/subnet.env publicIP: publicIPv6: subnetLeaseRenewMargin:60 healthzIP:0.0.0.0 healthzPort:0 iptablesResyncSeconds:5 iptablesForwardRules:true netConfPath:/etc/kube-flannel/net-conf.json setNodeNetworkUnavailable:true}
W0112 18:57:52.418787 1 client_config.go:618] Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.
I0112 18:57:52.437162 1 kube.go:139] Waiting 10m0s for node controller to sync
I0112 18:57:52.443356 1 kube.go:469] Starting kube subnet manager
I0112 18:57:53.438631 1 kube.go:146] Node controller sync successful
I0112 18:57:53.438694 1 main.go:231] Created subnet manager: Kubernetes Subnet Manager - slave1
I0112 18:57:53.438722 1 main.go:234] Installing signal handlers
I0112 18:57:53.439152 1 main.go:468] Found network config - Backend type: vxlan
E0112 18:57:53.439274 1 main.go:268] Failed to check br_netfilter: stat /proc/sys/net/bridge/bridge-nf-call-iptables: no such file or directory
在log的最后一行,错误的原因已经比较清楚了。
错误信息表明系统缺少 /proc/sys/net/bridge/bridge-nf-call-iptables 文件,通常这是因为 br_netfilter 模块未加载。这个文件是用于启用 Linux 桥接网络(Bridge network)与防火墙(iptables)集成的功能,Flannel 和其他 CNI 插件通常需要此功能来正确处理跨节点通信时的防火墙规则。
解决方法:加载 br_netfilter 模块
-
检查是否加载了 br_netfilter 模块
首先,检查是否加载了 br_netfilter 模块:
lsmod | grep br_netfilter
如果没有输出,说明模块尚未加载。 -
加载 br_netfilter 模块
运行以下命令手动加载 br_netfilter 模块:
sudo modprobe br_netfilter -
配置自动加载
为了确保在系统重启后仍然加载该模块,可以将其添加到 /etc/modules-load.d/ 配置文件中。
创建一个新的配置文件(如果文件不存在):
echo “br_netfilter” | sudo tee /etc/modules-load.d/br_netfilter.conf -
启用桥接流量过滤
启用桥接网络的防火墙支持:
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
为了让该设置在系统重启后生效,添加到 /etc/sysctl.conf 文件中:
echo “net.bridge.bridge-nf-call-iptables=1” | sudo tee -a /etc/sysctl.conf
sudo sysctl -p -
验证配置
确认设置已经生效:
cat /proc/sys/net/bridge/bridge-nf-call-iptables
输出应该为 1,表示防火墙规则已启用。
注意: 需要在所有节点上运行并确保br_netfilter模块已经加载!!
再次运行kubectl get pods -A 发现所有的flannel和coredns 相关的pods都已经正常运行了。