浅谈 containerd

Overview

伴随着kubernetes对docker的弃用,containerd开始进入大众视野;相比于kubelet中集成docker-shim连接docker,docker再次条用containerd去管理容器,直接使用containerd可以通过原生CRI接口的调用实现容器runtime,简化了调用链路,更加的灵活可靠。

一、安装使用 ctr 管理 containerd

 1# Install Dependent Libraries
 2$ sudo apt-get update
 3$ sudo apt-get install libseccomp2
 4
 5# 下载
 6# 目前是下载的1.5.2
 7$ wget https://github.com/containerd/containerd/releases/download/v${VERSION}/cri-containerd-cni-${VERSION}-linux-amd64.tar.gz
 8
 9# 安装
10$ sudo tar --no-overwrite-dir -C / -xzf cri-containerd-cni-${VERSION}-linux-amd64.tar.gz
11# 初始化containerd配置
12$ containerd config default > /etc/containerd/config.toml
13# 修改默认的sandbox_image
14$ vim /etc/containerd/config.toml
15...
16sandbox_image = "registry.cn-beijing.aliyuncs.com/shannonai-k8s/pause:3.1"
17...
18
19# 启动服务
20sudo systemctl daemon-reload
21sudo systemctl start containerd
22
23# 查看版本
24$ ctr version
25Client:
26  Version:  1.4.3
27  Revision: 269548fa27e0089a8b8278fc4fc781d7f65a939b
28  Go version: go1.13.15
29
30Server:
31  Version:  1.4.3
32  Revision: 269548fa27e0089a8b8278fc4fc781d7f65a939b
33  UUID: b7e3b0e7-8a36-4105-a198-470da2be02f2

二、containerd 使用

2.1 运行一个 busybox 镜像:

  • demo:
1# 拉取镜像
2$ ctr -n k8s.io i pull docker.io/library/busybox:latest
3# 创建一个container(此时还未运行)
4$ ctr -n k8s.io container create docker.io/library/busybox:latest busybox
5# 创建一个task
6$ ctr -n k8s.io task start -d busybox
7
8# 上述步骤也可以简写成如下
9$ ctr -n k8s.io run -d docker.io/library/busybox:latest busybox

查看容器在宿主机的 pid,及状态:

1$ ctr -n k8s.io task ls
2TASK       PID     STATUS
3busybox    2356    RUNNING

进入容器:

1$ ctr -n k8s.io t exec --exec-id $RANDOM -t busybox sh

杀死移除容器:

1$ ctr -n k8s.io t kill -s SIGKILL busybox
2$ ctr -n k8s.io t rm busybox
3WARN[0000] task busybox exit with non-zero exit code 137

2.2 其他 ctr 命令

镜像标记:

1$ ctr -n k8s.io i tag A B
2# 若新镜像reference 已存在, 需要先删除新reference, 或者如下方式强制替换
3$ ctr -n k8s.io i tag --force A B

删除镜像:

1$ ctr -n k8s.io i rm A

拉取镜像:

1$ ctr -n k8s.io i pull -k A

查看镜像:

1$ ctr -n k8s.io i ls

推送镜像:

1$ ctr -n k8s.io i push -k A

导出镜像:

1$ ctr -n k8s.io i export A.tar A

导入镜像:

1$ ctr -n k8s.io i import A.tar

读取日志: 导出到文件中进行读取:

1$ ctr -n k8s.io run --log-uri file:///var/log/xx.log

三、containerd + docker

安装新版本的 docker-ce 默认,采用 containerd(--containerd=/run/containerd/containerd.sock)

 1$ systemctl status docker
 2● docker.service - Docker Application Container Engine
 3   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
 4   Active: active (running) since 四 2021-06-10 15:46:44 CST; 1h 46min ago
 5     Docs: https://docs.docker.com
 6 Main PID: 4965 (dockerd)
 7   CGroup: /system.slice/docker.service
 8           ├─1830 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/e0a50564d9a23a85240f54f3bf
 9           ├─4965 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
10           ├─5402 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8082 -container-ip 172.17.0.2 -container-port 80
11           └─5417 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8082 -container-ip 172.17.0.2 -container-port 80

注意:

  1. ctr 直接跑起来一个容器只有 lo 网卡,也就是无法与外网通信;如果想连接外网,请参考

其他参考链接:
https://mp.weixin.qq.com/s/A9zU7gZH0liLjc-e-dhk8A
https://blog.csdn.net/tongzidane/article/details/114587138
https://github.com/containerd/containerd/blob/master/docs/cri/installation.md