Intro Containerd

今天第一次在生产环境中看到了 k8s 跳过 docker 直接使用containerd runtime, 这里大概记录一下.

什么是 k8s 跳过 docker 使用 containerd run time? 需要清楚它们的关系, please read throughly:

这次事件的开始是一个在 GKE node 上的incident: High CPU Usage Critical, 去查看了一下,不仅仅是CPU usage高,load average也是超出相当多了,4个CPU核心的平均负载竟达到了20+(3个参数都是)。当然,对比其他几个正常的monitoring节点以及相关分析,最后的分析结果是uneven loads,一个解决办法是在资源定义中对亲和性做一些安排,把负载分散到其他合格的节点上。

关于如何查看节点上的负载情况,可以用以下的命令:

1
2
3
4
5
6
7
8
9
10
11
# 观察running/runnable的队列长度
# -t: append timestamp to each line output
vmstat -t 1

# -b: batch mode
# -n: page number
# -i: idle process hide
# -c: show command
# -H: thread
# -w: width output
top -b -n 1 -i -H -c -w | grep -E '^[0-9]+' | awk '{ if ($8 == "R" || $8 == "D") print $0 }'

grep 部分是为了过滤一些 pid 非常大,不需要关心的线程。注意我们只查看state为DR的线程,因为平均负载和这两个有关。

此外,我发现docker images/ps -a输出的是空,开始以为是权限的问题,但并不是,后来查看docker daemon的状态,并没有什么问题,除了Memory的用量非常少,这让我意识到这个节点可能使用的是其他的container runtime。

于是从top中摘取了一个应该是容器相关的进程,查看其父进程PPID,比如:

1
2
3
4
# BSD
ps axo pid,ppid,comm | grep <pid>
# standard
ps -eo pid,ppid,comm | grep <pid>

最后展开查看,得到了如下的结果,就很明显了:

1
2
3
root     3515874  0.0  0.0 111720  3712 ?        Sl   Apr03  28:56 /usr/bin/containerd-shim-runc-v1 
-namespace k8s.io -id 93a341648e8833e0212a257f1fd6aa2cded3f825f2475c16c15dc576b8c949a2 -address /run/
containerd/containerd.sock

注意,以上描述其实不准确,因为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.

0%