前几天收到反馈,k8s-uat集群部署业务会失败,上rancher上看下pod状态发现创建失败,随后展开了排查之路,今日在此记录:
首先通过报错看到确实是pod部署不上去,ip也获取不到,那么就要先确认是只有调度到这一台node会失败还是整个集群任意一个node会失败?
通过删除有问题的节点重新调度,或者自己指定node调度发现只有调度到k8s-01上才会失败,其余均正常。
现在问题定位到k8s-01这台机器,它既是master也是node,所以查看master上面“三件套”的日志,并没有发现有用线索。
-
继续排查,查看kubelet的日志,发现明显报错:network: no etcd endpoints specified
可以清晰的看到错误是因 cni 网络插件引起的,原因是 找不到etcd 地址,连不到etcd
排查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
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
因为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问题解决
总结:
前面都是常规排障分析,后面看到cni,etcd相关错误时,耽误了很长时间,不知道如何入手,因为对calico根本不熟悉,部署的时候也只是修改些东西直接apply ,并没注意到calico-etcd.yaml到底都定义了那些东西。如果这些足够清楚的话,相信这个问题很快就可以定位到,迎刃而解。