1、 为什么弃用docker
Kubernetes平台中,为了解决与容器运行时(例如Docker)集成 问题,在早期社区推出了CRI(Container Runtime Interface,容 器运行时接口),以支持更多的容器运行时。 当我们使用Docker作为容器运行时之后,架构是这样的,如图所示: Kubernetes 计划弃用就是kubelet中dockershim。即 Kubernetes kubelet 实现中的组件之一,它能够与 Docker Engine 进行通信

• Docker内部调用链比较复杂,多层封装和调用,导致性能降低、提升故障率、不易排查
• Docker还会在宿主机创建网络规则、存储卷,也带来了安全隐患
2、containerd介绍
containerd原本属于docker中一部分,如今成为一个独立容器运行并支持CRI(k8s容器接口),后来docker又把containerd捐献给CNCF基金会。
3、切换引擎为Containerd
3.1、基础环境准备
检查 overlay、 br_netfilter是否已加载(此状态为已加载)
lsmod |grep overlay
lsmod |grep netfilter
若未加载,执行
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOFsudo modprobe overlay
sudo modprobe br_netfilter# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。(先检查这些参数是否已添加,部署k8s一般已经启用)
sysctl -a |grep net.ipv4.ip_forward此为已启用

若未启用
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOFsudo sysctl --system3.2、安装containerd
yum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repoyum install -y containerd.iomkdir -p /etc/containerdcontainerd config default > /etc/containerd/config.toml检查
ps -ef |grep containerd

修改配置文件
- pause镜像设置过阿里云镜像仓库地址
- cgroups驱动设置为systemd
- 拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址
如果是由docker切换containerd,配置文件内容不足,则重新生成containerd配置文件
containerd config default > /etc/containerd/config.toml进入配置文件,通过搜索关键字来定位修改位置, [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]在新版containerd中搜不到,没关系,他是加速器,可以不配置
vi /etc/containerd/config.toml[plugins."io.containerd.grpc.v1.cri"]sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"...[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = true...[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]systemctl restart containerd
配置kubelet使用containerd
vi /etc/sysconfig/kubeletKUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemdsystemctl restart kubelet
注意,切换容器后之前的pods最好重新创建
验证可以看到此节点启动容器已修改
kubectl get node -o wide
管理容器工具
containerd提供了ctr命令行工具管理容器,但功能比较简单,所以一般会用crictl工具检查和调试容器。
设置crictl连接containerd :
vi /etc/crictl.yamlruntime-endpoint: unix:///run/containerd/containerd.sockimage-endpoint: unix:///run/containerd/containerd.socktimeout: 10debug: false
切换回docker:清除/etc/sysconfig/kubelet的配置文件并重启kubelet即可
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=
systemctl restart kubelet
下面是docker与crictl命令对照表:
镜像相关功能 | Docker | Containerd |
显示本地镜像列表 | docker images | crictl images |
下载镜像 | docker pull | crictl pull |
上传镜像 | docker push | 无 , 例如buildk |
删除本地镜像 | docker rmi | crictl rmi |
查看镜像详情 | docker inspect IMAGE-ID | crictl inspecti IMAGE-ID |
容器相关功能 | Docker | Containerd |
显示容器列表 | 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 相关功能 | Docker | Containerd |
显示 POD 列表 | 无 | crictl pods |
查看 POD 详情 | 无 | crictl inspectp |
运行 POD | 无 | crictl runp |
停止 POD | 无 | crictl stopp |
版权声明:本文为huahua1999原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。