20221206_k8s_v1.20.12弃用 dockershim 实践
官方文档:
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/change-runtime-containerd/
注意:弃用原因:
K8s 中有两条调用链:
使用 CRI 接口调用 dockershim,然后 dockershim 调用 Docker,Docker 再去containerd 操作容器。
使用 CRI 接口直接调用 containerd 操作容器。
因为 containerd 是用来管理容器的,所以这两个调用链的最终效果是完全一样的,但是第二种方法去掉了 dockershim 和 Docker Engine 这两个环节,更加简洁明了,性能也更好。
如下图
思路:
由上可知,需将 kubelet 使用 containerd 作为其容器运行时即可。
一、安装 Containerd crictl
1.1. yum 安装
a.下载阿里云的yum源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
b.添加阿里的docker镜像源,使用其中的containerd软件
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
c.安装
#yum list containerd.io --showduplicates | sort -r 查看版本
yum install containerd crictl-tools -y
d. 生成配置文件
containerd config default > /etc/containerd/config.toml
e. 重启服务
systemctl daemon-reload
systemctl restart containerd
f. 生成crictl配置文件
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock
cat <<EOF> /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
1.2.解压安装
1. 首先下载压缩包
curl -LO https://github.com/containerd/containerd/releases/download/v1.6.6/containerd-1.6.6-linux-amd64.tar.gz
2. 解压到/usr/local目录下
tar Cxzvf /usr/local containerd-1.6.6-linux-amd64.tar.gz
3. 解压完成后,执行ctr -v 或者ctr version便可查看版本
二、配置 kubelet 使用 containerd 作为其容器运行时
1.添加containerd 运行时添加到标志中:--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock
vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--network-plugin=cni --pod-infra-container-image=egistry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
2.修改通过kubeadm 工具将每个主机的 CRI 套接字保存在该主机对应的 Node 对象的注解。
更改 kubeadm.alpha.kubernetes.io/cri-socket 值,将其从 /var/run/dockershim.sock 改为你所选择的 CRI 套接字路径 (例如:unix:///run/containerd/containerd.sock)。
kubectl edit no <node-name>
kubeadm.alpha.kubernetes.io/cri-socket: unix:///run/containerd/containerd.sock
注意新的 CRI 套接字路径必须带有 unix:// 前缀。
3.重启kubelet
systemctl restart kubelet
[root@node1 containerd]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node1 Ready control-plane,master 292d v1.20.12 192.168.58.11 <none> CentOS Linux 7 (Core) 5.4.225-1.el7.elrepo.x86_64 containerd://1.6.10
node2 Ready control-plane,master 292d v1.20.12 192.168.58.12 <none> CentOS Linux 7 (Core) 5.4.180-1.el7.elrepo.x86_64 docker://20.10.12
node3 Ready <none> 292d v1.20.12 192.168.58.13 <none> CentOS Linux 7 (Core) 5.4.180-1.el7.elrepo.x86_64 docker://20.10.12
三、修改 cgroup 驱动
1.修改kubelet的cgroup驱动
a.初始化之前修改文件
# kubeadm-config.yaml
# vim /etc/kubernetes/kubeadm-config.yaml
---
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
b.运行时修改
vim /var/lib/kubelet/config.yaml
修改 cgroupDriver: cgroupfs 为 cgroupDriver: systemd
c.重启 kubelet
systemctl restart kubelet
2.修改Containerd的cgroup驱动
a. 生成containerd默认配置文件
containerd config default > /etc/containerd/config.toml
b. 修改/etc/containerd/config.toml文件
vim /etc/containerd/config.toml
修改 SystemdCgroup = false 为 SystemdCgroup = true
c. 重启containerd服务
systemctl daemon-reload # 更新配置文件
systemctl restart containerd
journalctl -xefu containerd # 查看运行时系统日志
四、cgroup 驱动为什么使用 systemd 而不是 croupfs
当某个 Linux 系统发行版使用 systemd 作为其初始化系统时,初始化进程会生成并使用一个 root 控制组(cgroup),并充当 cgroup 管理器。
Systemd 与 cgroup 集成紧密,并将为每个 systemd 单元分配一个 cgroup。
你也可以配置 containerd 和 kubelet 使用 cgroupfs。连同 systemd 一起使用 cgroupfs 意味着将有两个不同的 cgroup 管理器。
单个 cgroup 管理器将简化分配资源的视图,并且默认情况下将对可用资源和使用 中的资源具有更一致的视图。
当有两个管理器共存于一个系统中时,最终将对这些资源产生两种视图。
在此领域人们已经报告过一些案例,某些节点配置让 kubelet 和 docker 使用 cgroupfs,而节点上运行的其余进程则使用 systemd; 这类节点在资源压力下 会变得不稳定。
五、containerd 与 gpu
除了需要正常安装containerd和nvidia、cuda驱动外,还需要安装nvidia-container-runtime。
注意:nvidia,cuda安装参考 https://note.youdao.com/s/Kp15Nazd文章。
1.参考文档:
nvidia-container-runtime官方github: https://github.com/NVIDIA/nvidia-container-runtime
centos安装nvidia-container-runtime官网文档: https://nvidia.github.io/nvidia-container-runtime/
2.操作步骤:
# 添加官方rpm源
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.repo | \
sudo tee /etc/yum.repos.d/nvidia-container-runtime.repo
# 安装 nvidia-container-runtime
sudo yum install nvidia-container-runtime
3.修改containerd配置文件
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2" # 新版本runtime配置为v2
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
BinaryName = "nvidia-container-runtime" # BinaryName改为nvidia-container-runtime
4.重启containerd
systemctl restart containerd
todo
ctr 的使用
crictl 的使用