kubernetes node上 containerd进程意外退出导致pod创建失败问题排查

问题背景:

接performance team报问题,平时一直在跑的deploy job 出现了大面积的fail,

排查步骤:

接到客户报问题后,第一反应,肯定是查看pod信息

通过kubectl -n performance get pods -o wide 

发现有大量的pods停留在 ContainerCreating 状态,因为pod没有被建立,此时是不能通过kubectl logs查看log的,

所以只能先通过kubectl describe查看哪些events发生在这个pod上,

 ```kubectl describe pod pvc-proxy-fc3c60531bb42efdfe4a65096ba5b9a0-9pr9g -n performance-deployments

=====================================

 

Events:

  Type     Reason                  Age                   From                                    Message

  ----     ------                  ----                  ----                                    -------

  Normal   Scheduled               50m                   default-scheduler                       Successfully assigned pvc-proxy-fc3c60531bb42efdfe4a65096ba5b9a0-9pr9g to ip-10-146-20-198.ec2.internal

  Normal   SuccessfulMountVolume   50m                   kubelet, ip-10-146-20-198.ec2.internal  MountVolume.SetUp succeeded for volume "learn-perf-deployments-share"

  Normal   SuccessfulMountVolume   50m                   kubelet, ip-10-146-20-198.ec2.internal  MountVolume.SetUp succeeded for volume "learn-service-account-token-7ntls"

  Warning  FailedCreatePodSandBox  45m (x187 over 50m)   kubelet, ip-10-146-20-198.ec2.internal  Failed create pod sandbox: rpc error: code = Unknown desc = failed to start sandbox container for pod "pvc-proxy-fc3c60531bb42efdfe4a65096ba5b9a0-9pr9g": Error response from daemon: grpc: the connection is unavailable

  Normal   SandboxChanged          36s (x1839 over 50m)  kubelet, ip-10-146-20-198.ec2.internal  Pod sandbox changed, it will be killed and re-created.

```

1)简单从events上看到有些warning,google一把,有些说是高压力下,network 可能出现问题,导致pod不能被建立,aws/amazon-vpc-cni-k8s#59, 此时需要升级plugin的版本。由于我们正好刚刚升级过K8S cluster,所以想当然,认为是不是这个plugin忘记同步升级了。 但这只能是凭空猜测,因为不知道当前cluster deploy的整体架构,不知道有没有使用这个plugin。所以这个只能是猜测疑点1.

2)由于白天,不能联系到美国有权限的团队,只能继续思考

因为是大批量pod 同时发生问题,怀疑调度问题,本想登录到ec2上看看到底发生了什么,发现该pod被调度到kubernetes master node上了,无奈外企权限控制极度严苛,没有ssh权限;然后找出现问题的pod2,希望发现是否有被调度到其他node上的pod。观察后,发现全部是同一个node,到其他node上没有问题。此时锁定怀疑点2,是不是这个node有问题。这个理由感觉更充分一些,以往经验也告诉我,确实node发生问题,机率最大。

 

综上,两点疑点,都发邮件通知美国团队,重点让他们排查node,插件版本问题,只是猜测。

不过由于权限限制,这些都只能是猜测,定位某个pod的问题,还是应该查看kubelet log。具体定位调度时问题。。。。

 

3)经美国有权限同事,ssh node查看,果然发现docker最重要的创建container的进程 containerd 意外退出了。他们只是单纯remove掉node,也没有定位什么原因导致进程退出。如果换做我,是要进一步看看什么地方导致的。

It appears the issue with this node is not network related but rather containerd is not running on there for some reason.
Working node:
```
admin@ip-10-146-22-22:~$ ps -fe | grep containerd
root 1560 1546 0 Jan17 ? 00:09:26 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc
root 1756 1560 0 Jan17 ? 00:00:00 docker-containerd-shim 2a0c08abf30c240c18028ee06a13dc250be047f93a67316f29a8f9153e77705c /var/run/docker/libcontainerd/2a0c08abf30c240c18028ee06a13dc250be047f93a67316f29a8f9153e77705c docker-runc
root 1757 1560 0 Jan17 ? 00:00:00 docker-containerd-shim d5254a9e589d5c48d2e0417b8d694c31b2a5a1536dfd9c48c885d414fe68e250 /var/run/docker/libcontainerd/d5254a9e589d5c48d2e0417b8d694c31b2a5a1536dfd9c48c885d414fe68e250 docker-runc
root 1759 1560 0 Jan17 ? 00:00:00 docker-containerd-shim 9c6fca10612add0ac73e756825c57c222a88582fbe7aad4ff9d0f68904575f38 /var/run/docker/libcontainerd/9c6fca10612add0ac73e756825c57c222a88582fbe7aad4ff9d0f68904575f38 docker-runc
...
```
Broken node:
```
admin@ip-10-146-20-69:~$ ps -fe | grep containerd
root 1763 1 0 Jan17 ? 00:00:00 docker-containerd-shim dd1cb327ebd34c75f96488c45fb0db2f08b297abfa3e002fec56d52f8256f70c /var/run/docker/libcontainerd/dd1cb327ebd34c75f96488c45fb0db2f08b297abfa3e002fec56d52f8256f70c docker-runc
root 1764 1 0 Jan17 ? 00:00:00 docker-containerd-shim 986657c08709d9656c530c59eaa95f26b380847ffb63c3558241c69418097d7c /var/run/docker/libcontainerd/986657c08709d9656c530c59eaa95f26b380847ffb63c3558241c69418097d7c docker-runc
root 1765 1 0 Jan17 ? 00:00:00 docker-containerd-shim 8807a8c3afdc0b4edd2a0d220ea0ed01e492c0e55838c731ab451e50b7285b6a /var/run/docker/libcontainerd/8807a8c3afdc0b4edd2a0d220ea0ed01e492c0e55838c731ab451e50b7285b6a docker-runc
```
Im going to kill that node to get a working one to come up and we can come up with a list of action items in order to enable you guys to address in the future

 

处理办法,

从k8s cluster 中remove 掉那个有问题的node

后续跟进action:

增加对node上 重要进程containerd的监控

导出kubelet log到elasticsearch

学习到pod调度停留在containercreating状态,有很多种原因造成,需要认真定位,不能乱猜。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章