在未来的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 |
具体的命令可以查询对应的官方手册。