20221206_k8s_v1.20.12弃用dockershim实践

时间:2022-12-20 13:59:36

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 这两个环节,更加简洁明了,性能也更好。
如下图

20221206_k8s_v1.20.12弃用dockershim实践

思路:

由上可知,需将 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 的使用