记录一次k8s部署pod失败的排查

前几天收到反馈,k8s-uat集群部署业务会失败,上rancher上看下pod状态发现创建失败,随后展开了排查之路,今日在此记录:

  1. 首先通过报错看到确实是pod部署不上去,ip也获取不到,那么就要先确认是只有调度到这一台node会失败还是整个集群任意一个node会失败?

  2. 通过删除有问题的节点重新调度,或者自己指定node调度发现只有调度到k8s-01上才会失败,其余均正常。

  3. 现在问题定位到k8s-01这台机器,它既是master也是node,所以查看master上面“三件套”的日志,并没有发现有用线索。

  4. 继续排查,查看kubelet的日志,发现明显报错:network: no etcd endpoints specified


    报错.png
  5. 可以清晰的看到错误是因 cni 网络插件引起的,原因是 找不到etcd 地址,连不到etcd

  6. 排查etcd

a.查看etcd状态, 一切正常。

curl --cacert /etc/cni/net.d/calico-tls/etcd-ca --cert /etc/cni/net.d/calico-tls/etcd-cert --key /etc/cni/net.d/calico-tls/etcd-key https://192.168.1.25:2379/health

返回:{"health":"true"} 

b. 尝试从etcd中获取键,在取值,也是一切正常。


查看过滤calico键值
etcdctl   --cacert=/etc/kubernetes/pki/etcd-ca.pem --cert=/etc/kubernetes/pki/apiserver-etcd-client.pem  --key=/etc/kubernetes/pki/apiserver-etcd-client.key --endpoints=https://192.168.1.24:2379 get / --prefix --keys-only|grep calico
取数据:
etcdctl   --cacert=/etc/kubernetes/pki/etcd-ca.pem --cert=/etc/kubernetes/pki/apiserver-etcd-client.pem  --key=/etc/kubernetes/pki/apiserver-etcd-client.key --endpoints=https://192.168.1.24:2379 get /   /registry/pods/kube-system/calico-node-hwwml

以上可以正常读取数据,再结合其他node可以正常部署,那么etcd集群的问题排除,问题肯定在这个节点的calico 到 etcd 之间的问题

7. 尝试重启服务器。

这次重启大法并没起作用,不仅没有解决问题,并且重启后 k8s-01节点上的calico-kube-controllers与calico-node也都起不来了,kubelet报的错依然是 上面找不到etcd的错。

8. 仔细想想calico连etcd地址在哪儿定义的,当然是起初calico-etcd.yaml中的configmap部分啊, 所以查看k8s-01的calico configmap


kubectl get cm calico-config -nkube-system

kubectl describe cm calico-config -nkube-system

calico配置2.png

etcd_points 是空的。。。问题就在这里。

9. 修改calico-config 这个confimap

我们修改其中etcd_endpoints:""为


etcd_endpoints: "https://192.168.1.24:2379,https://192.168.1.25:2379,https://192.168.1.26:2379"

这里3个思路:

a. 执行kubectl get cm calico-config -nkube-system -o yaml>./calico-bakcup_yaml/calico-config.yaml先备份,在cp一份出来命名为calico-config-update.yaml,将里面的没用的字段删掉,将etcd_endpoints字段手动补上去,最终执行kubectl apply -f calico-config-update.yaml

b. 将calico-etcd.yaml 中的configmap这个kind的一段拿出来 ,单独写成一个yaml,calico-config-update.yaml,注意etcd_endpoints地址要有啊,最终执行kubectl apply -f calico-config-update.yaml

c. 直接修改,执行kubectl edit cm cm calico-config.yaml -nkube-system,将etcd_endpoints手动加上去

10. 修改/etc/cni/net.d/10-calico.conflist

calico配置1.jpg

因为k8s-pod-network,主要跟这个文件有关,所以还要修改下/etc/cni/net.d/10-calico.conflist, 我们修改其中etcd_endpoints:""为etcd_endpoints: "https://192.168.1.24:2379,https://192.168.1.25:2379,https://192.168.1.26:2379"

11. 重启Kubelet ,查看日志,尝试重新Pod 到k8s-01问题解决

calico-ok.png

pod-ok.png

总结:

前面都是常规排障分析,后面看到cni,etcd相关错误时,耽误了很长时间,不知道如何入手,因为对calico根本不熟悉,部署的时候也只是修改些东西直接apply ,并没注意到calico-etcd.yaml到底都定义了那些东西。如果这些足够清楚的话,相信这个问题很快就可以定位到,迎刃而解。

你可能感兴趣的:(记录一次k8s部署pod失败的排查)