containerd 使用方法
环境信息
- Centos 7
- containerd.io-1.4.13-3
containerd 相关配置
默认配置文件
containerd 服务默认配置文件为 /etc/containerd/config.toml
root = "/var/lib/containerd" |
Containerd 有两个不同的存储路径,一个用来保存持久化数据,一个用来保存运行时状态。 [1]
root = "/var/lib/containerd" |
root- 用来保存持久化数据,包括 Snapshots, Content, Metadata 以及各种插件的数据。每一个插件都有自己单独的目录,Containerd 本身不存储任何数据,它的所有功能都来自于已加载的插件。state- 用来保存临时数据,包括sockets、pid、挂载点、运行时状态以及不需要持久化保存的插件数据。
oom_score = 0 |
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
[Unit] |
Delegate- 这个选项允许 Containerd 以及运行时自己管理自己创建的容器的 cgroups。如果不设置这个选项,systemd就会将进程移到自己的 cgroups 中,从而导致 Containerd 无法正确获取容器的资源使用情况。KillMode- 这个选项用来处理 Containerd 进程被杀死的方式。默认情况下,systemd会在进程的 cgroup 中查找并杀死 Containerd 的所有子进程,这肯定不是我们想要的。KillMode字段可以设置的值如下:control-group-(默认值)当前控制组里面的所有子进程,都会被杀掉process- 只杀主进程。mixed- 主进程将收到SIGTERM信号,子进程收到SIGKILL信号none- 没有进程会被杀掉,只是执行服务的 stop 命令。
需要将
KillMode的值设置为process,这样可以确保升级或重启 Containerd 时不杀死现有的容器。
Containerd 常用配置
Containerd 默认配置文件为 /etc/containerd/config.toml,未在配置文件中配置的则使用默认配置,为了方便修改,可以使用以下命令将默认配置写入配置文件中
containerd config default | sudo tee /etc/containerd/config.toml |
在作为 Kubernetes 的 CRI 时,需要修改以下配置:
- 启用 CRI 功能 。Containerd 默认禁用了 CRI 功能(
disabled_plugins = ['cri']),要启用cri,将其注释或删除 - 配置
cgroup v2, Kubernetes 的很多功能需要cgroup v2支持,Kubernetes 节点通常使用cgroup v2,要配置containerd使用cgroup v2,修改配置文件的plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options部分,将SystemdCgroup配置为true后重启containerd服务/etc/containerd/config.toml [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
BinaryName = ""
CriuImagePath = ""
CriuPath = ""
CriuWorkPath = ""
IoGid = 0
IoUid = 0
NoNewKeyring = false
NoPivotRoot = false
Root = ""
ShimCgroup = ""
SystemdCgroup = true
客户端工具 ctr 使用
ctr 管理镜像
镜像下载
ctr image pull docker.io/library/nginx:alpine |
列出本地镜像
ctr image ls |
将镜像挂载到本地目录
ctr image mount docker.io/library/nginx:alpine /mnt |
卸载已挂载的镜像
ctr image unmount /mnt |
ctr 管理 容器
创建容器
ctr container create docker.io/library/nginx:alpine nginx |
容器创建后,并没有开始运行,只是分配了容器运行所需的资源及配置的数据结构,这意味着 namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程(这里是 nginx)还没有启动,容器(进程)状态的变化由 Task 对象实现,通过命令 ctr task 来管理。
启动 ctr container create 创建的容器
ctr task start nginx |
以上命令启动之前创建的容器 nginx,未指定其他参数时,容器中的进程在系统前台运行,如需后台运行,可以使用选项 -d
ctr task start nginx -d |
也可以直接使用 run 命令,创建并启动容器
ctr run --rm -d docker.io/library/nginx:alpine nginx1 |
列出容器
ctr container ls |
查看容器中进程的状态
ctr task ls |
查看容器中运行的所有的进程
ctr task ps nginx1 |
这里的 PID 是宿主机看到的 PID,不是容器中看到的 PID。
查看容器详细信息
ctr container info nginx |
删除容器
停止/删除容器中的进程
ctr task delete nginx -f |
以上命令删除/停止容器中的进程,但是并不删除容器,执行以上命令后再执行以下命令,可删除容器
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 |
docker 默认使用 moby 的 Namespace,要使用 ctr 命令查看 docker 创建的容器,需要使用选项 -n moby 指定命名空间,否则 ctr 默认使用 default 命名空间,无法看到 moby 命名空间中的资源
ctr -n moby container ls |
Kubernetes 默认使用 k8s.io 命名空间。
ctr 没有配置或者环境变量可以来配置默认的 Namespace,在 Kubernetes 场景中,可以使用 alias 命令配置 ctr,使其自动指向 k8s.io 的 Namespace
alias ctr='ctr -n k8s.io' |
nerdctl
nerdctl 是为 Containerd 开发的完全兼容 Docker 命令行的工具,它可以使用和 docker 命令一样的语法来操作 containerd 中的容器。
如果要使用 nerdctl 调试 Kubernetes 环境中的容器,需要指定 Namespace,示例如下:
nerdctl --namespace k8s.io ps -a |
如果是在 Kubernetes 环境中使用,为方便起见,可以添加环境变量:
alias nerdctl='nerdctl --namespace k8s.io' |