AWS EC2搭建的K8s集群工作节点所有Pod出现CrashLoopBackOff状态求助
嗨,我来帮你分析下这个问题!从你描述的情况和贴出的flannel日志来看,核心问题大概率出在flannel网络组件的配置上——尤其是它的etcd地址配置,这会直接导致整个工作节点的网络异常,进而让所有pod都启动失败。
先看你贴的flannel关键日志:
$ kubectl logs pod/kube-flannel-ds-hd79r --namespace=kube-flannel Defaulted container "kube-flannel" out of: kube-flannel, install-cni-plugin (init), install-cni (init) I0620 13:37:59.782900 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:...
这里能看到flannel在尝试连接本地(127.0.0.1)的etcd服务,但如果你是用常规方式在EC2上搭建K8s集群,etcd通常是部署在主节点上的,工作节点本身并没有运行etcd服务,这就导致flannel连不上etcd,启动失败,进而整个工作节点的网络插件异常,所有依赖网络的pod(包括kube-proxy、你的hello-world api)都会因为网络问题崩溃,出现CrashLoopBackOff。
接下来给你一步步的排查和修复方案:
1. 确认集群etcd的部署位置
先登录主节点,执行kubectl get pods -n kube-system,看看etcd相关的pod是不是在主节点上运行(通常名称是etcd-<master-node-name>),如果是的话,说明工作节点确实没有本地etcd,需要修改flannel的配置。
2. 检查并修复flannel的ConfigMap配置
在任意能访问集群的节点(比如主节点)执行以下命令:
# 查看flannel的配置文件 kubectl get configmap kube-flannel-cfg -n kube-flannel -o yaml
找到Net-conf.json字段,里面的etcdEndpoints如果是http://127.0.0.1:4001,http://127.0.0.1:2379,那就是配置错误,需要改成主节点的私有IP(EC2的内网IP)加上etcd的端口,比如:
{ "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" }, "EtcdEndpoints": "http://<主节点私有IP>:2379" }
修改配置可以用编辑命令:
kubectl edit configmap kube-flannel-cfg -n kube-flannel
保存退出后,删除当前工作节点上的flannel pod,让它重新拉取配置启动:
kubectl delete pod kube-flannel-ds-hd79r -n kube-flannel
(把kube-flannel-ds-hd79r换成你实际的flannel pod名称)
3. 检查EC2安全组配置
确保主节点的安全组允许工作节点的IP段访问2379端口(etcd的默认端口),否则即使配置对了地址,flannel也连不上主节点的etcd。
4. 验证修复效果
等flannel pod启动成功后(状态变成Running),再查看工作节点上的其他pod,比如kube-proxy和你的hello-world api,看看是否恢复正常。如果还有问题,可以查看kube-proxy的日志,确认是不是还有其他网络相关的问题。
备注:内容来源于stack exchange,提问作者Miguel Domingos

