参考文章: 如何丝滑般将 Kubernetes 容器运行时从 Docker 切换成 Containerd
环境
当前系统的环境如下
1
2
3
4
5
6
7# kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-sit-master01 Ready <none> 19h v1.20.11 10.1.40.61 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15
k8s-sit-master02 Ready <none> 19h v1.20.11 10.1.40.62 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15
k8s-sit-master03 Ready <none> 19h v1.20.11 10.1.40.63 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15
k8s-sit-node01 Ready <none> 19h v1.20.11 10.1.40.64 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15
k8s-sit-node02 Ready <none> 19h v1.20.11 10.1.40.65 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15
维护节点
首先标记需要切换的节点为维护模式,强制驱逐节点上正在运行的 Pod,这样可以最大程度降低切换过程中影响应用的正常运行,比如我们先将 k8s-sit-node02 节点切换到 containerd。
使用
kubectl cordon
命令将 node02 标记为unschedulable
状态1
2
3
4
5
6
7
8
9
10# kubectl cordon k8s-sit-node02
node/k8s-sit-node02 cordoned
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-sit-master01 Ready <none> 19h v1.20.11
k8s-sit-master02 Ready <none> 19h v1.20.11
k8s-sit-master03 Ready <none> 19h v1.20.11
k8s-sit-node01 Ready <none> 19h v1.20.11
k8s-sit-node02 Ready,SchedulingDisabled <none> 19h v1.20.11执行完上面的命令后,node02 节点变成了一个
SchedulingDisabled
状态,表示不可调度,这样新创建的 Pod 就不会调度到当前节点上来了。使用
kubectl drain
命令来维护节点并驱逐节点上的 Pod1
2
3
4
5
6
7
8# kubectl drain k8s-sit-node02 --ignore-daemonsets --delete-emptydir-data
node/k8s-sit-node02 already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-57hxr
evicting pod vbaas-cli-dev/vbaas-s-vcross-c7585bb58-rhkxp
evicting pod kube-system/metrics-server-bb4dd87b6-25t48
pod/vbaas-s-vcross-c7585bb58-rhkxp evicted
pod/metrics-server-bb4dd87b6-25t48 evicted
node/k8s-sit-node02 evicted上面的命令会强制将 node02 节点上的 Pod 进行驱逐,我们加了一个
--ignore-daemonsets
的参数可以用来忽略DaemonSet
控制器管理的 Pods,因为这些 Pods 不用驱逐到其他节点去,当节点驱逐完成后接下来我们就可以来对节点进行维护操作了,除了切换容器运行时可以这样操作,比如我们需要变更节点配置、升级内核等操作的时候都可以先将节点进行驱逐,然后再进行维护。
切换 containerd
由于新版本中的 docker 在安装时默认使用 containerd 做为后端容器运行时,故不需要再安装 containerd,因为 containerd 中默认已经实现了 CRI,但是是以 plugin 的形式配置的,以前 Docker 中自带的 containerd 默认是将 CRI 这个插件禁用掉了的(使用配置 disabled_plugins = ["cri"]
),所以这里我们重新生成默认的配置文件来覆盖掉:
停止节点上运行的 kubelet,docker,containerd 服务
1
systemctl stop kubelet docker containerd
配置 containerd,创建默认的配置文件
1
2mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml修改 cgroup 驱动程序为 systemd
1
2
3
4[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true修改镜像加速
1
2
3
4
5
6
7
8
9[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://1nj0zren.mirror.aliyuncs.com"]
[plugin."io.containerd.grpc.v1.cri".registry.mirrors."habor.china-snow.net"]
endpoint = ["https://habor.china-snow.net"]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."habor.china-snow.net".tls]
insecure_skip_verify = true修改 sandbox_image 镜像地址为国内阿里云地址
1
2
3
4
5
6
7[plugins]
[plugins."io.containerd.gc.v1.scheduler"]
...
[plugins."io.containerd.grpc.v1.cri"]
disable_tcp_service = true
...
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"接下来修改 kubelet 配置,将容器运行时配置为 containerd,打开 /etc/systemd/system/kubelet.service.d/10-kubelet.conf 文件,在该文件中可以添加一些额外的 kubelet 启动参数,配置如下所示:
1
2
3
4
5Environment="KUBELET_EXTRA_ARGS=--node-labels=node.kubernetes.io/node='' \
--container-runtime=remote \
--container-runtime-endpoint=unix:///run/containerd/containerd.sock \
--container-log-max-files=10 \
--container-log-max-size='100Mi' "上面的配置中我们新增加了四个参数:
--container-runtime
参数是用来指定使用的容器运行时的,可选值为 docker 或者 remote,默认是 docker,由于我们这里使用的是 containerd 这种容器运行时,所以配置为 remote 值(也就是除 docker 之外的容器运行时都应该指定为 remote),--container-runtime-endpoint
是用来指定远程的运行时服务的 endpiont 地址的,在 Linux 系统中一般都是使用 unix 套接字的形式,比如这里我们就是指定连接 containerd 的套接字地址unix:///run/containerd/containerd.sock
。--container-log-max-files
参数是配置容器日志保留数量,--container-log-max-size
参数是配置单个容器日志最大大小- 其实还应该配置一个
--image-service-endpoint
参数用来指定远程 CRI 的镜像服务地址,如果没有指定则默认使用--container-runtime-endpoint
的值了,因为 CRI 都会实现容器和镜像服务的。
配置完成后重启 containerd 和 kubelet 即可:
1
2
3systemctl daemon-reload
systemctl restart containerd
systemctl restart kubelet重启完成后查看节点状态是否正常
1
2
3
4
5
6
7# kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-sit-master01 Ready <none> 19h v1.20.11 10.1.40.61 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15
k8s-sit-master02 Ready <none> 19h v1.20.11 10.1.40.62 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15
k8s-sit-master03 Ready <none> 19h v1.20.11 10.1.40.63 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15
k8s-sit-node01 Ready <none> 19h v1.20.11 10.1.40.64 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15
k8s-sit-node02 Ready,SchedulingDisabled <none> 19h v1.20.11 10.1.40.65 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 containerd://1.6.10获取节点的时候加上 -o wide 可以查看节点的更多信息,从上面对比可以看到 node02 节点的容器运行时已经切换到 containerd://1.6.10 了。
最后把 node02 节点重新加回到集群中来允许调度 Pod 资源
1
2
3
4
5
6
7
8
9
10# kubectl uncordon k8s-sit-node02
node/k8s-sit-node02 uncordoned
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-sit-master01 Ready <none> 19h v1.20.11
k8s-sit-master02 Ready <none> 19h v1.20.11
k8s-sit-master03 Ready <none> 19h v1.20.11
k8s-sit-node01 Ready <none> 19h v1.20.11
k8s-sit-node02 Ready <none> 19h v1.20.11重启该节点上的 DaemonSet 管理的 pod
1
2
3
4
5
6
7
8
9# kubectl get pods -n kube-system | grep k8s-sit-node02
NAME READY STATUS RESTARTS AGE
calico-node-57hxr 0/1 CrashLoopBackOff 6 19h
# kubectl delete pods -n kube-system calico-node-57hxr
pod "calico-node-57hxr" deleted
# kubectl get pods -n kube-system -owide |grep k8s-sit-node02
calico-node-bxgg2 1/1 Running 0 2m6s 10.1.40.65 k8s-sit-node02 <none> <none>接下来用同样的方法再去处理其他节点即可将整个集群切换成容器运行时 containerd 了。
ctr 命令
现在我们可以在节点上使用
ctr
命令来管理 containerd,例如使用 ctr 查看命名空间1
2
3
4# ctr ns ls
NAME LABELS
k8s.io
mobykubernetes 集群对接的 containerd 所有资源都在 k8s.io 的命名空间下面,而 docker 的则默认在 moby 下面,当然现在 moby 下面没有任何的数据了,但是在 k8s.io 命名空间下面就有很多镜像和容器资源了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# ctr -n moby c ls
CONTAINER IMAGE RUNTIME
# ctr -n moby i ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
# ctr -n moby t ls
TASK PID STATUS
# ctr -n k8s.io i ls -q
docker.io/calico/cni:v3.15.5
docker.io/calico/cni@sha256:31c5a824642bf50d7eb5f807f12840b3d532e5e724756cd068eb08043ca739c3
docker.io/calico/node:v3.15.5
docker.io/calico/node@sha256:349c10be37e64a310d25869128d482b17bfeb4166bc80bd9a2ed095203a77ddb
docker.io/calico/pod2daemon-flexvol:v3.15.5
docker.io/calico/pod2daemon-flexvol@sha256:deaed50ef204d04233de17297637f748bdf782bea133a68a5433b07b5b476bf9
...
crictl 命令
我们当然可以直接使用 ctr
命令来直接管理镜像或容器资源,但是我们在使用过程中明显可以感觉到该工具没有 docker CLI 方便,从使用便捷性和功能性上考虑,我们更推荐使用 crictl
作为管理工具,crictl
为 CRI 兼容的容器运行时提供 CLI,这允许 CRI 运行时开发人员在无需设置 Kubernetes 组件的情况下调试他们的运行时。
安装 crictl
首先我们需要先安装 crictl 工具,直接从 cri-tools 的 release 页面下载对应的二进制包,解压放入 PATH 路径下即可
1
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.25.0/crictl-v1.25.0-linux-amd64.tar.gz
解压文件到
/usr/loca/bin
目录1
tar xf crictl-v1.25.0-linux-amd64.tar.gz -C /usr/local/bin/
测试 crictl 命令
1
2# crictl -v
crictl version v1.25.0
配置 crictl
首先需要修改下默认的配置文件,默认为
/etc/crictl.yaml
,在文件中指定容器运行时和镜像的endpoint
地址,内容如下所示1
2
3
4
5
6runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
debug: false
timeout: 10
pull-image-on-create: false
disable-pull-on-run: false配置完成后就可以使用 crictl 命令了
1
2
3
4
5# crictl version
Version: 0.1.0
RuntimeName: containerd
RuntimeVersion: 1.6.10
RuntimeApiVersion: v1
crictl 用法
crictl 安装完成后,接下来我们来了解下该工具的一些常见使用方法。
查看 Pod 信息
通过
crictl pods
命令可以获取当前节点上运行的 Pods 列表,如下所示:1
2
3
4
5
6
7
8
9
10
11
12
13# crictl pods
POD ID CREATED STATE NAME NAMESPACE ATTEMPT RUNTIME
dc3a711a86b2f 4 hours ago Ready calico-node-smhf6 kube-system 0 (default)
392ec7a757b50 4 hours ago Ready vbaas-s-core-588fcd6bd7-t7tlk vbaas-cli-dev 0 (default)
b8a060d9eb8ef 4 hours ago Ready vbaas-s-upms-5cd5465fc9-mvk6n vbaas-cli-dev 0 (default)
e2fdbb7a2232c 4 hours ago Ready vbaas-s-sdk-client-8b55d9c6b-85vsl vbaas-cli-dev 0 (default)
1e0259a0cacba 4 hours ago Ready calico-kube-controllers-6c495445c5-cgchc kube-system 0 (default)
ea9c026c00a62 4 hours ago Ready vonebaas-s-ui-599cb6d767-gshmk vbaas-cli-dev 0 (default)
8757b00f518ac 4 hours ago Ready vbaas-s-api-d45c86c5b-lmw78 vbaas-cli-dev 0 (default)
ff05595c50f7b 4 hours ago Ready vonebaas-s-documentation-6ffc498956-hmldt vbaas-cli-dev 0 (default)
5286aa3f9e550 4 hours ago Ready vonebaas-s-bcos-5b9c6cfbdd-ztzbf vbaas-cli-dev 0 (default)
f3d80328c28c0 4 hours ago Ready vonebaas-blockchain-explorer-78df949f-k2t7z vbaas-cli-dev 0 (default)
84a27ca43df9a 4 hours ago Ready xxl-job-admin-79f74d59c5-c5hzq vbaas-cli-dev 0 (default)可以使用名称
--name
参数获取指定的 Pod1
2
3# crictl pods --name vbaas-s-api-d45c86c5b-lmw78
POD ID CREATED STATE NAME NAMESPACE ATTEMPT RUNTIME
8757b00f518ac 4 hours ago Ready vbaas-s-api-d45c86c5b-lmw78 vbaas-cli-dev 0 (default)可以使用标签
--label
来筛选 Pod 列表:1
2
3# crictl pods --label app=vbaas-s-api
POD ID CREATED STATE NAME NAMESPACE ATTEMPT RUNTIME
8757b00f518ac 4 hours ago Ready vbaas-s-api-d45c86c5b-lmw78 vbaas-cli-dev 0 (default)
获取镜像列表
使用
crictl images
命令可以获取所有的镜像:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/calico/cni v3.15.5 42b7a3f2bfdfd 39.8MB
docker.io/calico/kube-controllers v3.15.5 bc6083995e032 22.4MB
docker.io/calico/node v3.15.5 f0393ae546b56 163MB
docker.io/calico/pod2daemon-flexvol v3.15.5 0cdfd80862a15 9.36MB
registry-changsha.vonebaas.com/publics/xxl-job-admin 2.3.0 24772dec3c8e6 110MB
registry-changsha.vonebaas.com/xinchuang-vbaas-s-k8s/vbaas-go-api 1.0 b31923f373ffb 23.5MB
registry-changsha.vonebaas.com/xinchuang-vbaas-s-k8s/vbaas-s-api v1 535106b69c041 211MB
registry-changsha.vonebaas.com/xinchuang-vbaas-s-k8s/vbaas-s-core v1 bedc20a4e8bae 234MB
registry-changsha.vonebaas.com/xinchuang-vbaas-s-k8s/vbaas-s-upms v1 1ebbaf968bd9c 214MB
registry-changsha.vonebaas.com/xinchuang-vbaas-s-k8s/vonebaas-blockchain-explorer v1 66d49a3accb66 58.9MB
registry-changsha.vonebaas.com/xinchuang-vbaas-s-k8s/vonebaas-s-bcos v1 72b9c44093608 63.3MB
registry-changsha.vonebaas.com/xinchuang-vbaas-s-k8s/vonebaas-s-documentation v1 8e7ad3066699c 61.3MB
registry-changsha.vonebaas.com/xinchuang-vbaas-s-k8s/vonebaas-s-ui v1 46e15060f3763 65.6MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.6 6270bb605e12e 302kB可以在命令后面加上
-v
参数来显示镜像的详细信息:1
2
3
4
5
6
7
8
9
10
11
12# crictl images -v
ID: sha256:42b7a3f2bfdfd09cd59c87fffe050fc469d92784ec9535313239ae7749a5449a
RepoTags: docker.io/calico/cni:v3.15.5
RepoDigests: docker.io/calico/cni@sha256:31c5a824642bf50d7eb5f807f12840b3d532e5e724756cd068eb08043ca739c3
Size: 39811127
ID: sha256:bc6083995e032a59ebaaa0fff559edf279bb9ccc3d0ec72d11ba44c3c2541322
RepoTags: docker.io/calico/kube-controllers:v3.15.5
RepoDigests: docker.io/calico/kube-controllers@sha256:83ab61351dc437745a336b607d0ababba0fed617f1181abd2f66daa9d30918e2
Size: 22350121
...
获取容器列表
使用
crictl ps
命令可以获取正在运行的容器列表1
2
3
4
5
6
7
8
9
10
11
12
13# crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD
098d5252c3691 f0393ae546b56 4 hours ago Running calico-node 0 dc3a711a86b2f calico-node-smhf6
13964b6316af5 bedc20a4e8bae 4 hours ago Running vbaas-s-core 0 392ec7a757b50 vbaas-s-core-588fcd6bd7-t7tlk
bb89b6bc4b629 1ebbaf968bd9c 4 hours ago Running vbaas-s-upms 0 b8a060d9eb8ef vbaas-s-upms-5cd5465fc9-mvk6n
d64da42ab3932 b31923f373ffb 4 hours ago Running sdk-client 0 e2fdbb7a2232c vbaas-s-sdk-client-8b55d9c6b-85vsl
33d574a8789f0 66d49a3accb66 4 hours ago Running vonebaas-blockchain-explorer 0 f3d80328c28c0 vonebaas-blockchain-explorer-78df949f-k2t7z
2353bd93c110e 8e7ad3066699c 4 hours ago Running vonebaas-s-documentation 0 ff05595c50f7b vonebaas-s-documentation-6ffc498956-hmldt
54e177c7925b3 535106b69c041 4 hours ago Running vbaas-s-api 0 8757b00f518ac vbaas-s-api-d45c86c5b-lmw78
ba4b84b9c463d 24772dec3c8e6 4 hours ago Running xxl-job-admin 0 84a27ca43df9a xxl-job-admin-79f74d59c5-c5hzq
70a10a9fb7475 72b9c44093608 5 hours ago Running vonebaas-s-bcos 0 5286aa3f9e550 vonebaas-s-bcos-5b9c6cfbdd-ztzbf
a717d49d33c49 46e15060f3763 5 hours ago Running vonebaas-s-ui 0 ea9c026c00a62 vonebaas-s-ui-599cb6d767-gshmk
4c21ccbb0895e bc6083995e032 5 hours ago Running calico-kube-controllers 0 1e0259a0cacba calico-kube-controllers-6c495445c5-cgchc还有更多其他可选参数,可以通过
crictl ps -h
获取,比如显示最近创建的两个容器1
2
3
4# crictl ps -n 2
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD
098d5252c3691 f0393ae546b56 4 hours ago Running calico-node 0 dc3a711a86b2f calico-node-smhf6
068945918da36 0cdfd80862a15 4 hours ago Exited flexvol-driver 0 dc3a711a86b2f calico-node-smhf6使用
-s
选项按照状态进行过滤:1
2
3
4
5
6
7
8
9
10
11
12
13# crictl ps -s Running
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD
098d5252c3691 f0393ae546b56 4 hours ago Running calico-node 0 dc3a711a86b2f calico-node-smhf6
13964b6316af5 bedc20a4e8bae 5 hours ago Running vbaas-s-core 0 392ec7a757b50 vbaas-s-core-588fcd6bd7-t7tlk
bb89b6bc4b629 1ebbaf968bd9c 5 hours ago Running vbaas-s-upms 0 b8a060d9eb8ef vbaas-s-upms-5cd5465fc9-mvk6n
d64da42ab3932 b31923f373ffb 5 hours ago Running sdk-client 0 e2fdbb7a2232c vbaas-s-sdk-client-8b55d9c6b-85vsl
33d574a8789f0 66d49a3accb66 5 hours ago Running vonebaas-blockchain-explorer 0 f3d80328c28c0 vonebaas-blockchain-explorer-78df949f-k2t7z
2353bd93c110e 8e7ad3066699c 5 hours ago Running vonebaas-s-documentation 0 ff05595c50f7b vonebaas-s-documentation-6ffc498956-hmldt
54e177c7925b3 535106b69c041 5 hours ago Running vbaas-s-api 0 8757b00f518ac vbaas-s-api-d45c86c5b-lmw78
ba4b84b9c463d 24772dec3c8e6 5 hours ago Running xxl-job-admin 0 84a27ca43df9a xxl-job-admin-79f74d59c5-c5hzq
70a10a9fb7475 72b9c44093608 5 hours ago Running vonebaas-s-bcos 0 5286aa3f9e550 vonebaas-s-bcos-5b9c6cfbdd-ztzbf
a717d49d33c49 46e15060f3763 5 hours ago Running vonebaas-s-ui 0 ea9c026c00a62 vonebaas-s-ui-599cb6d767-gshmk
4c21ccbb0895e bc6083995e032 5 hours ago Running calico-kube-controllers 0 1e0259a0cacba calico-kube-controllers-6c495445c5-cgchc
在容器中执行命令
crictl 也有类似 exec 的命令支持,比如在容器 ID 为 098d5252c3691 的容器中执行一个 date 命令:
1
2# crictl exec -it 098d5252c3691 date
Fri Dec 2 07:39:05 UTC 2022
输出容器日志
使用
crictl logs
可以获取容器日志信息1
2
3
4
5
6
7# crictl logs 098d5252c3691 |less
2022-12-02 03:08:03.856 [INFO][9] startup/startup.go 356: Early log level set to info
2022-12-02 03:08:03.872 [INFO][9] startup/startup.go 374: Using stored node name from /var/lib/calico/nodename
2022-12-02 03:08:03.872 [INFO][9] startup/startup.go 384: Determined node name: k8s-sit-master02
2022-12-02 03:08:03.874 [INFO][9] startup/startup.go 109: Skipping datastore connection test
...和
kubectl logs
类似于,还可以使用-f
选项来 Follow 日志输出,--tail N
也可以指定输出最近的 N 行日志。
资源统计
使用
crictl stats
命令可以列举容器资源的使用情况1
2
3
4
5
6
7
8
9
10
11
12
13# crictl stats
CONTAINER CPU % MEM DISK INODES
098d5252c3691 11.98 50.14MB 266.2kB 79
13964b6316af5 8.68 1.655GB 36.76MB 43
2353bd93c110e 0.00 5.812MB 94.21kB 19
33d574a8789f0 0.00 5.919MB 94.21kB 19
4c21ccbb0895e 0.43 24.99MB 49.15kB 15
54e177c7925b3 1.39 456.6MB 176.1kB 33
70a10a9fb7475 0.00 6.074MB 94.21kB 19
a717d49d33c49 0.00 6.197MB 94.21kB 19
ba4b84b9c463d 0.47 277MB 110.6kB 20
bb89b6bc4b629 1.72 503.7MB 2.83MB 37
d64da42ab3932 0.00 25.04MB 36.86kB 10此外镜像和容器相关的一些操作也都支持,比如:
- 拉取镜像:crictl pull
- 运行 Pod:crictl runp
- 运行容器:crictl run
- 启动容器:crictl start
- 删除容器:crictl rm
- 删除镜像:crictl rmi
- 删除 Pod:crictl rmp
- 停止容器:crictl stop
- 停止 Pod:crictl stopp
- …
更多信息请参考 cri-tools。
CLI 对比
前面我们了解了围绕镜像、容器和 Pod 可以使用 docker、ctr、crictl 这些命令行工具进行管理,接下来我们就来比较下这几个常用命令的使用区别。
需要注意的是通过 ctr containers create
命令创建的容器只是一个静态的容器,所以还需要通过 ctr task start
来启动容器进程。当然,也可以直接使用 ctr run
命令来创建并运行容器。在进入容器操作时,与 docker 不同的是,必须在 ctr task exec
命令后指定 --exec-id
参数,这个 id 可以随便写,只要唯一就行。另外,ctr 没有 stop 容器的功能,只能暂停(ctr task pause
)或者杀死(ctr task kill
)容器。
另外要说明的是 crictl pods
列出的是 Pod 的信息,包括 Pod 所在的命名空间以及状态。crictl ps
列出的是应用容器的信息,而 docker ps
列出的是初始化容器(pause 容器)和应用容器的信息,初始化容器在每个 Pod 启动时都会创建,通常不会关注,所以 crictl 使用起来更简洁明了一些。
日志配置
docker 和 containerd 除了在常用命令上有些区别外,在容器日志及相关参数配置方面也存在一些差异。
当使用 Docker 作为 Kubernetes 容器运行时的时候,容器日志的落盘是由 Docker 来完成的,日志被保存在类似 /var/lib/docker/containers/
的目录下面,kubelet 会在 /var/log/pods
和 /var/log/containers
下面创建软链接,指向容器日志目录下的容器日志文件。对应的日志相关配置可以通过配置文件进行指定,如下所示:
1 | { |
而当使用 containerd 作为 Kubernetes 容器运行时的时候,容器日志的落盘则由 kubelet 来完成了,被直接保存在 /var/log/pods/
目录下面,同时在 /var/log/containers
目录下创建软链接指向日志文件。同样日志配置则是通过 kubelet 参数中进行指定的,如下所示:
1 | --container-log-max-files=10 --container-log-max-size="100Mi" |
所以如果我们有进行日志收集理论上来说两种方案都是兼容的,基本上不用改动。
当然除了这些差异之外,可能对于我们来说镜像构建这个环节是我们最需要关注的了。切换到 containerd 之后,需要注意 docker.sock 不再可用,也就意味着不能再在容器里面执行 docker 命令来构建镜像了。所以接下来需要和大家介绍几种不需要使用 docker.sock 也可以构建镜像的方法。