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' |