环境信息
Centos 7
containerd.io-1.4.13-3
containerd 相关配置 默认配置文件 containerd
服务默认配置文件为 /etc/containerd/config.toml
/etc/containerd/config.toml # root = "/var/lib/containerd" # state = "/run/containerd" # subreaper = true # oom_score = 0
Containerd 有两个不同的存储路径,一个用来保存持久化数据,一个用来保存运行时状态。 [1]
/etc/containerd/config.toml # root = "/var/lib/containerd" # state = "/run/containerd"
root
- 用来保存持久化数据,包括 Snapshots, Content, Metadata 以及各种插件的数据。每一个插件都有自己单独的目录,Containerd 本身不存储任何数据,它的所有功能都来自于已加载的插件。
state
- 用来保存临时数据,包括 sockets
、pid
、挂载点
、运行时状态
以及不需要持久化保存的插件数据。
/etc/containerd/config.toml
Containerd 是容器的守护者,一旦发生内存不足的情况,理想的情况应该是先杀死容器,而不是杀死 Containerd。所以需要调整 Containerd 的 OOM 权重,减少其被 OOM Kill 的几率。oom_score
其取值范围为 -1000
到 1000
,如果将该值设置为 -1000
,则进程永远不会被杀死,建议 Containerd 将该值设置为 -999
到 0
之间。如果作为 Kubernetes 的 Worker 节点,可以考虑设置为 -999
。
containerd 服务配置文件 默认的 containerd
服务的配置为 /usr/lib/systemd/system/containerd.service
/usr/lib/systemd/system/containerd.service [Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target local-fs.target [Service] ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/bin/containerd Type=notify Delegate=yes KillMode=process Restart=always RestartSec=5 LimitNPROC=infinity LimitCORE=infinity LimitNOFILE=1048576 TasksMax=infinity OOMScoreAdjust=-999 [Install] WantedBy=multi-user.target
Delegate
- 这个选项允许 Containerd 以及运行时自己管理自己创建的容器的 cgroups。如果不设置这个选项,systemd
就会将进程移到自己的 cgroups 中,从而导致 Containerd 无法正确获取容器的资源使用情况。
KillMode
- 这个选项用来处理 Containerd 进程被杀死的方式。默认情况下,systemd
会在进程的 cgroup 中查找并杀死 Containerd 的所有子进程,这肯定不是我们想要的。KillMode
字段可以设置的值如下:
control-group
-(默认值)当前控制组里面的所有子进程,都会被杀掉
process
- 只杀主进程。
mixed
- 主进程将收到 SIGTERM
信号,子进程收到 SIGKILL
信号
none
- 没有进程会被杀掉,只是执行服务的 stop 命令。
需要将 KillMode
的值设置为 process
,这样可以确保升级或重启 Containerd 时不杀死现有的容器。
客户端工具 ctr 使用 ctr 管理镜像 镜像下载 ctr image pull docker.io/library/nginx:alpine
列出本地镜像 $ ctr image ls REF TYPE DIGEST SIZE PLATFORMS LABELS docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:455c39afebd4d98ef26dd70284aa86e6810b0485af5f4f222b19b89758cabf1e 9.8 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -
将镜像挂载到本地目录 $ ctr image mount docker.io/library/nginx:alpine /mnt $ ls /mntbin docker-entrypoint.d etc lib mnt proc run srv tmp var dev docker-entrypoint.sh home media opt root sbin sys usr
卸载已挂载的镜像
ctr 管理 容器 创建容器 ctr container create docker.io/library/nginx:alpine nginx
容器创建后,并没有开始运行,只是分配了容器运行所需的资源及配置的数据结构,这意味着 namespaces
、rootfs
和容器的配置都已经初始化成功了,只是用户进程(这里是 nginx
)还没有启动,容器(进程)状态的变化由 Task
对象实现,通过命令 ctr task
来管理。
启动 ctr container create
创建的容器
以上命令启动之前创建的容器 nginx
,未指定其他参数时,容器中的进程在系统前台运行,如需后台运行,可以使用选项 -d
也可以直接使用 run
命令,创建并启动容器
ctr run --rm -d docker.io/library/nginx:alpine nginx1
列出容器
查看容器中进程的状态
$ ctr task ls TASK PID STATUS nginx1 5495 RUNNING
查看容器中运行的所有的进程
$ ctr task ps nginx1 PID INFO 5495 - 5531 - 5532 - 5533 - 5534 -
这里的 PID 是宿主机看到的 PID,不是容器中看到的 PID。
查看容器详细信息
删除容器 停止/删除容器中的进程
ctr task delete nginx -f ctr task pause nginx
以上命令删除/停止容器中的进程,但是并不删除容器 ,执行以上命令后再执行以下命令,可删除容器
ctr container delete nginx
ctr 没有 stop 容器的功能,只能暂停或者杀死容器。
进入容器 ctr task exec -t --exec-id 1 nginx1 sh
执行 ctr task exec
进入容器,必须制定 --exec-id
,值可以随便指定。
namespace 管理 Containerd 相比于 Docker ,多了 Namespace 的概念,使用以下命令,查看所有的 Namespace
$ ctr ns ls NAME LABELS default moby
docker
默认使用 moby
的 Namespace,要使用 ctr
命令查看 docker
创建的容器,需要使用选项 -n moby
指定命名空间,否则 ctr
默认使用 default
命名空间,无法看到 moby
命名空间中的资源
ctr -n moby container ls CONTAINER IMAGE RUNTIME 17b16c3699cdb88a1ff80d8a7c84724eff393c42186775b58418c90bd178600f - io.containerd.runtime.v1.linux 27fc19226baa91251d63a375a7b1309122334cfb5ceb39aeb67ab1701b708464 - io.containerd.runtime.v1.linux
Kubernetes 默认使用 k8s.io
命名空间 。
ctr
没有配置或者环境变量可以来配置默认的 Namespace,在 Kubernetes 场景中,可以使用 alias
命令配置 ctr
,使其自动指向 k8s.io
的 Namespace
alias ctr='ctr -n k8s.io'
脚注