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
EOF
sudo 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
EOF
sudo sysctl --system
3.2、安装containerd
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
修改配置文件
-
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/kubelet
KUBELET_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.yaml
runtime-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
|