美文网首页K8s
记录一次k8s部署pod失败的排查

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

作者: 阿当运维 | 来源:发表于2022-07-15 16:51 被阅读0次

    前几天收到反馈,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失败的排查

        本文链接:https://www.haomeiwen.com/subject/itkcirtx.html