Kubernetes切换Docker为Containerd
在未来的kubernetes
版本会计划彻底放弃Docker
支持,会弃用kubelet
中的docker-shim
组件。以后containerd
可能会成为主流,包括很多企业现在将运行时换成了containerd
。
docker-shim组件是k8s为了专门与docker适配的,能够与Docker Engine进行通信
先决条件
1. 启用内核模块
lsmod | grep overlay >/dev/null 2>&1 || sudo modprobe overlay
lsmod | grep netfilter >/dev/null 2>&1 || sudo modprobe netfilter
2. 设置sysctl参数
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的,需要手动安装。
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
。
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进程
sudo systemctl restart containerd
sudo systemctl restart kubelet
sudo systemctl status containerd
sudo systemctl status kubelet
使用以下命令检查节点状态
kubectl get node -o wide
可以看到CONTAINER-RUNTIME
已经从docker
变成了containerd://x.x.x
。
此时节点运行的docker
仍旧是存在的。不过k8s
创建的容器则是由containerd
负责创建了。
使用Containerd
containerd
提供了命令行工具管理容器,但功能相对docker
简单很多,所以一般只会用crictl
检查和调试容器。crictl
不经可以用来管理containerd
,而是可以给所有适配CRI的容器引擎使用。
使用crictl时会有一个warning,可以用以下命令解决。
crictl config \
--set runtime-endpoint=unix:///run/containerd/containerd.sock \
--set image-endpoint=unix:///run/containerd/containerd.sock
警告的原因是默认引擎是一个连接列表。这个列表里面包含了dockershim.sock
、containerd.sock
、 cri-dockerd.sock
(红帽的容器引擎),但是现在已经弃用了,所以会有一个Warnning。
以下是docker
与crictl
的命令对照。
说明 | 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
,多了命名空间的概念, 每个image
和container
只会在各自的命名空间下可见, 目前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 |
具体的命令可以查询对应的官方手册。