今天第一次在生产环境中看到了 k8s 跳过 docker 直接使用containerd runtime, 这里大概记录一下.
什么是 k8s 跳过 docker 使用 containerd run time? 需要清楚它们的关系, please read throughly:
- The differences between Docker, containerd, CRI-O and runc
- Dockershim removal is coming. Are you ready?
这次事件的开始是一个在 GKE node 上的incident: High CPU Usage Critical, 去查看了一下,不仅仅是CPU usage高,load average也是超出相当多了,4个CPU核心的平均负载竟达到了20+(3个参数都是)。当然,对比其他几个正常的monitoring节点以及相关分析,最后的分析结果是uneven loads,一个解决办法是在资源定义中对亲和性做一些安排,把负载分散到其他合格的节点上。
关于如何查看节点上的负载情况,可以用以下的命令:
1 | # 观察running/runnable的队列长度 |
grep
部分是为了过滤一些 pid 非常大,不需要关心的线程。注意我们只查看state为D
和 R
的线程,因为平均负载和这两个有关。
此外,我发现docker images/ps -a
输出的是空,开始以为是权限的问题,但并不是,后来查看docker daemon的状态,并没有什么问题,除了Memory的用量非常少,这让我意识到这个节点可能使用的是其他的container runtime。
于是从top
中摘取了一个应该是容器相关的进程,查看其父进程PPID,比如:
1 | # BSD |
最后展开查看,得到了如下的结果,就很明显了:
1 | root 3515874 0.0 0.0 111720 3712 ? Sl Apr03 28:56 /usr/bin/containerd-shim-runc-v1 |
注意,以上描述其实不准确,因为docker uses containerd as well, 只是歪打正着了,要查看k8s 用的什么container runtime:
1 | kubectl get nodes -o wide |
Containerd可以以一个守护进程方式存在,可以用systemctl查看状态和配置。 关于Containerd 的参考资料: Getting started with containerd
- If you are a developer working on containerd you can use the
ctr
tool to quickly test features and functionality without writing extra code - If you want to integrate containerd into your project, you can use a simple client package. In this guide, we will pull and run a Redis server with containerd using that client package.
You can use crictl
command to explore in containerd
runtime k8s node:
https://kubernetes.io/docs/tasks/debug-application-cluster/crictl/
Readings
The team has done some work to switch container runtime in k8s: How to switch container runtime in a Kubernetes cluster
此外,GKE文档中也有关于Containerd使用的说明Containerd images.