Please enable Javascript to view the contents

K8S容器运行时由docker变为containerd后的必知必会

 ·  ☕ 6 分钟

背景

Kubernetes 在 v1.24 版移除dockershim。移除后,将不能直接使用Docker Engine作为容器运行时(如需使用,要额外安装cri-dockerd)。本文探讨的docker,实际上是指Dockershim。

CRI: 容器运行时接口(Container Runtime Interface), K8S-1.5版本(2016年底)引入的接口标准,增加对容器运行时的可扩展性;

快问快答:

  • dockershim是什么? dockershim是一个临时解决方案,用来解决Docker Engine与K8S的兼容性。
  • 为什么移除dockershim? 它的存在拉长了调用链。同时也为Kubernetes维护者增加了沉重的负担。
  • K8S-1.24+版本还能否使用DockerEngine? 需要额外安装对应的运行时cri-dockerd

启用docker-shim的常见问题:

  • docker镜像能正常工作么? 可以。docker build 创建的镜像适用于任何 CRI 实现。现有的镜像和往常一样工作,没有任何影响。
  • 能否正常拉取私有仓库的镜像?可以。所有 CRI 运行时均支持 K8S 中相同的拉取(pull)Secret 配置,不管是通过 PodSpec 还是通过 ServiceAccount 均可。
  • 当切换 CRI 底层实现时,应该注意什么?
    • 日志配置
    • 运行时的资源限制
    • dind或者访问docker的sock文件,比如,构建镜像操作时。
    • kubectl插件,如果需要访问docker
    • 类似kube-imagepuller工具,需要之间访问Docker
    • k8s节点上,registry的相关配置。例如,mirrors、仓库自签证书受信等
    • 监控、安全agent,在k8s集群外使用dockerEngine运行的相关脚本或守护进程
    • GPU等特殊硬件,取决于其与运行时、Kubernetes的集成实现

containerd相关工具介绍

ctr:containerd 的一个客户端工具。

crictl:是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序,需要额外安装。

netdctl: nerdctl,使用效果与docker命令的语法一致, 还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)、镜像加密(imgcrypt)等。

客户端配置

  • crictl

执行以下命令:

1
2
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock

命令执行后,将会修改配置文件/etc/crictl.yaml,配置如下:

1
2
3
4
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
  • ctr

默认sock文件地址为unix:///run/containerd/containerd.sock, 如果默认地址无效,通过以下方式设置

一种,参数指定sock地址,并使用alias

1
alias ctr='ctr --address /run/k3s/containerd/containerd.sock'

另一种,设置软链接至默认位置

1
ln -s /run/k3s/containerd/containerd.sock /run/containerd/containerd.sock

ctr命令介绍

ctr命令介绍

等价 docker run nginx 命令的ctr命令

注意:docker run命令可以缺省容器名称,但ctr run必须指定容器名称
docker --restart=always等操作无法用ctr run实现,而ctr run也有docker所不具备的功能。

1
2
ctr image pull docker.io/library/nginx:latest
ctr run docker.io/library/nginx:latest nginx

ctr run是一个组合命令:ctr container createctr task start的组合。

1
2
3
4
ctr container create docker.io/library/nginx:alpine nginx

# --detach 后台运行,nginx为容器ID
ctr task start --detach nginx

容器container与任务task

container:容器是进程的隔离和受限的执行环境。
task:任务代表容器内运行的实际进程。

镜像管理

容器管理

对比

命令dockerctr(containerd)crictl(kubernetes)常用程度
操作镜像
构建镜像docker build -t path:tag .★★★★★
查看镜像docker imagesctr image lscrictl images★★★★☆
拉取镜像docker pullctr image pullctictl pull★★★★★
推送镜像docker pushctr image push★★★☆
打标签docker tagctr image tag★★★☆
导出镜像docker savectr image export <文件名称> ★★★☆
导入镜像docker loadctr image import <OCI-TAR-archive, img.tar>★★★☆
删除镜像docker rmictr image rmcrictl rmi★★★☆
操作容器
查看容器列表docker psctr task ls/ctr container lscrictl ps★★★★★
查看容器数据信息docker inspectctr container infocrictl inspect★★★★★
创建一个新的容器docker createctr container createcrictl create★★★★☆
运行一个新的容器docker runctr run无(最小单元为pod)★★★★☆
启动/关闭已有的容器docker start/stopctr task start/killcrictl start/stop★★★★☆
删除容器docker rmctr container rmcrictl rm★★★★☆
查看容器日志docker logsctr task attach crictl logs★★★★★
查看容器资源docker statscrictl stats★★★★☆
登录或在容器内部执行命令docker execctr task exec -t –exec-id 10000 shcrictl exec★★★★★
清空不用的容器docker image prunectr image prunecrictl rmi –prune★★★★★
操作Pod
Pod列表crictl pods★★
Pod详情crictl inspectp★★
启动Podcrictl runp★★
停止Podcrictl stopp★★

镜像构建:docker、nertdctl
镜像管理(基本=拉取、查看所有镜像、删除):docker、nertdctl、ctr、crictl
镜像管理(高级=push、tag、save、load): docker、nertdctl、ctr
K8S节点上,镜像的拉取、导入导出:ctr
容器运行:docker、nertdctl、ctr
容器信息、管理:
K8S节点上,调试容器,查看日志,容器状态:crictl
镜像挂载:ctr -n

运行容器:

-d detach,后台
-t tty,添加一个伪终端

1
ctr -n k8s.io run -d -t --env TEST_PORT=8080 

最佳实践

拉取国外镜像

由于不熟悉containerd的proxy设置,因此可通过docker命令下载镜像。(注意, docker镜像在moby命名空间)

方式一:通过docker pull拉取镜像,再通过ctr -n moby i list进行查看

  • 拉取镜像
1
docker pull docker.io/rancher/rke2-runtime:v1.26.7-rke2r1-windows-amd64
  • 查看镜像
1
ctr -n moby images list

方式二: 通过docker save保持镜像,再通过ctr import导入镜像,并通过ctr i list查看

  • 导出镜像
1
docker save -o rke2-runtime.tar docker.io/rancher/rke2-runtime:v1.26.7-rke2r1-windows-amd64
  • 导入镜像
1
ctr -n k8s.io i import rke2-runtime.tar

通过镜像挂载查看镜像内容

以镜像docker.io/rancher/rke2-runtime:v1.26.7-rke2r1-windows-amd64为例,此镜像仅有几个exe可执行文件,无法通过拉起容器后,对容器进行debug。

  1. 拉取镜像
1
2
3
4
# 由于熟悉docker的proxy设置,因此可通过docker命令下载镜像。(注意, docker镜像在`moby`命名空间)
docker pull docker.io/rancher/rke2-runtime:v1.26.7-rke2r1-windows-amd64
# 或者, 通过ctr的proxy配置后,执行以下命令
ctr -n moby images pulldocker.io/rancher/rke2-runtime:v1.26.7-rke2r1-windows-amd64
  1. 挂载镜像
1
2
mkdir /tmp/rke/
ctr -n moby images mount docker.io/rancher/rke2-runtime:v1.26.7-rke2r1-windows-amd64 /tmp/rke/
  1. 查看镜像内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ tree /tmp/rke/
/tmp/rke/
└── bin
    ├── calico-ipam.exe
    ├── calico-node.exe
    ├── calico.exe
    ├── confd
    │   ├── conf.d
    │   │   ├── blocks.toml
    │   │   └── peerings.toml
    │   ├── confd-service.ps1
    │   ├── config-bgp.ps1
    │   ├── config-bgp.psm1
    │   └── templates
    │       ├── blocks.ps1.template
    │       └── peerings.ps1.template
    ├── containerd-shim-runhcs-v1.exe
    ├── containerd-stress.exe
    ├── containerd.exe
    ├── crictl.exe
    ├── ctr.exe
    ├── hns.psm1
    ├── host-local.exe
    ├── kube-proxy.exe
    ├── kubectl.exe
    ├── kubelet.exe
    └── win-overlay.exe

4 directories, 21 files
  1. 清理
1
ctr images unmount /tmp/rke/

结论

cdebug 作为一款专为容器环境设计的调试工具,它通过提供一系列高级功能,极大地简化了容器化应用的调试流程。无论是面对无 Shell 容器、需要端口转发的场景,还是需要导出文件系统,cdebug 都能提供有效的解决方案,是云原生开发者的得力助手。

参考

cdebug github

分享

Hex
作者
Hex
CloudNative Developer

目录