Kubernetes切换Docker为Containerd

Kubernetes切换Docker为Containerd

在未来的kubernetes版本会计划彻底放弃Docker支持,会弃用kubelet中的docker-shim组件。以后containerd可能会成为主流,包括很多企业现在将运行时换成了containerd

docker-shim组件是k8s为了专门与docker适配的,能够与Docker Engine进行通信

先决条件

1. 启用内核模块

Bash
lsmod | grep overlay >/dev/null 2>&1  || sudo modprobe overlay
lsmod | grep netfilter >/dev/null 2>&1  || sudo modprobe netfilter

2. 设置sysctl参数

Bash
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

安装Containerd

containerd之前是docker的一部分,所以切换docker容器引擎为containerd不需要安装containerd

如果没有安装过docker或之前用的引擎不是docker的,需要手动安装。

Bash
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
ps -ef | grep containerd

配置Kubelet

编辑文件 /etc/sysconfig/kubelet

Bash
vim /etc/sysconfig/kubelet

使用参数

KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock --cgroup-driver=systemd
  • –container-runtime=remote 表示我们使用的不是docker引擎(只要不是docker引擎的话都是remote这个值)
  • –container-runtime-endpoint=/run/containerd/containerd.sock 指定containerd的容器引擎地址。
  • –cgroup-driver=systemd 设置cgroup的驱动为systemd

然后重启kubelet进程

Bash
sudo systemctl restart containerd
sudo systemctl restart kubelet
sudo systemctl status containerd
sudo systemctl status kubelet

使用以下命令检查节点状态

Bash
kubectl get node -o wide

可以看到CONTAINER-RUNTIME已经从docker变成了containerd://x.x.x

此时节点运行的docker仍旧是存在的。不过k8s创建的容器则是由containerd负责创建了。

使用Containerd

containerd提供了命令行工具管理容器,但功能相对docker简单很多,所以一般只会用crictl检查和调试容器。crictl不经可以用来管理containerd,而是可以给所有适配CRI的容器引擎使用。

使用crictl时会有一个warning,可以用以下命令解决。

Bash
crictl config \
    --set runtime-endpoint=unix:///run/containerd/containerd.sock \
    --set image-endpoint=unix:///run/containerd/containerd.sock

警告的原因是默认引擎是一个连接列表。这个列表里面包含了dockershim.sockcontainerd.sockcri-dockerd.sock (红帽的容器引擎),但是现在已经弃用了,所以会有一个Warnning。

以下是dockercrictl命令对照

说明 docker命令 crictl命令
显示本地镜像列表 docker images crictl images
拉取镜像 docker pull crictl pull
上传镜像 docker push 无,需要使用buildkit等工具构建上传镜像
删除本地镜像 docker rmi crictl rmi
查看镜像详情 docker inspect crictl inspecti IMAGE-ID
显示容器列表 docker ps crictl ps
创建容器 docker create crictl create
启动容器 docker start crictl start
停止容器 docker stop crictl stop
删除容器 docker rm crictl rm
查看容器详情 docker inspect crictl inspect
附加容器 docker attach crictl attach
进入容器/执行命令 docker exec crictl exec
查看日志 docker logs crictl logs
查看容器资源 docker stats crictl stats
显示Pod列表 crictl pods
查看Pod详情 crictl inspectp
运行Pod crictl runp
停止Pod crictl stopp

除了使用crictl命令以外,还可以使用containerd原生的命令ctr。使用的时候需要注意,containerd 相比于docker,多了命名空间的概念, 每个imagecontainer 只会在各自的命名空间下可见, 目前k8s会使用k8s.io作为命名空间。

说明 ctr命令 docker命令
显示容器列表 ctr task ls docker ps
显示本地镜像列表 ctr image ls docker images
拉取镜像 ctr image pull docker pull
上传镜像 ctr image push pause-test docker push pause-test
导入本地镜像 ctr image import pause.tar docker load 镜像
运行容器 ctr run -d pause-test pause docker run -d --name=pause pause-test

具体的命令可以查询对应的官方手册。

CTR命令手册

Docker命令手册

crictl命令手册

qrcode

创建时间:2023-02-02 09:17:09

最后修改:2023-02-13 05:32:59