k8s 1.19.16 将docker切换为containerd
一、环境介绍
官方文档:[https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#containerd]
本次升级是在原有正常的k8s 1.19.16版本的集群上升级切换,所以一些基础配置原先应该已经设置完成。
[root@k8s-m1 ~]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-m1 Ready master 63d v1.19.16 192.168.2.140 CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://19.3.15
k8s-m2 Ready master 63d v1.19.16 192.168.2.141 CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://19.3.9
k8s-m3 Ready master 63d v1.19.16 192.168.2.142 CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://19.3.9
二、准备工作(内核最好升级,但升级过程存在风险,注意升级过程中是否出现报错信息)
升级系统内核默认centos7.6内核版本是3.10.0-xxx这个版本比较低,无法使用Cgroup v2,实际在生产中我们使用默认的内核版本也是遇到过一些Bug,所以这里我会做内核版本升级,这个根据个人需求来做。当然你用默认的内核版本是没问题的。
升级内核需要使用 elrepo 的yum源,首先我们导入 elrepo 的 key并安装 elrepo 源。
[root@k8s-m1 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@k8s-m1 ~]# rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
1、查看可用的内核
[root@k8s-m1 ~]# yum --disablerepo=“*” --enablerepo=“elrepo-kernel” list available --showduplicates
内核选择
kernel-lt(lt=long-term)长期有效
kernel-ml(ml=mainline)主流版本
2、安装最新主流版本内核
[root@k8s-m1 ~]# yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel
修改内核启动顺序,默认启动的顺序应该为1,升级以后内核是往前面插入,为0(如果每次启动时需要手动选择哪个内核,该步骤可以省略)
[root@k8s-m1 ~]# grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
使用下面命令看看确认下是否启动默认内核指向上面安装的内核
[root@k8s-m1 ~]# grubby --default-kernel
3、启用Cgroup v2
要启用 Cgroup v2 你可以通过在内核命令行中添加 systemd.unified_cgroup_hierarchy=1 来配置系统去使用它。 配置后必须重启节点,使参数生效。
yum -y install -y grubby
grubby --update-kernel=ALL --args=“systemd.unified_cgroup_hierarchy=1”
grubby --info=ALL
reboot
4、重启后检查节点内核是否成功升级
[root@k8s-m1 ~]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-m1 Ready master 63d v1.19.16 192.168.2.140 CentOS Linux 7 (Core) 6.1.9-1.el7.elrepo.x86_64 docker://19.3.15
k8s-m2 Ready master 63d v1.19.16 192.168.2.141 CentOS Linux 7 (Core) 6.1.9-1.el7.elrepo.x86_64 docker://19.3.9
k8s-m3 Ready master 63d v1.19.16 192.168.2.142 CentOS Linux 7 (Core) 6.1.9-1.el7.elrepo.x86_64 docker://19.3.9
三、首先在k8s-m1上操作,切换成功后继续下一台
1、将需要切换的node改为不可调度
kubectl cordon k8s-m1
2、驱逐该node上的pod资源(除daemonsets类型的pod)
kubectl drain k8s-m1 --delete-local-data --force --ignore-daemonsets
3、查看
[root@k8s-m1 ~]# kubectl get pod -o wide
确保当前升级节点无运行的业务服务
四、首先在k8s-m1上操作,切换成功后继续下一台
1、协助原有docker
rpm -qa | grep docker
rpm -e docker-ce-20.10.11-3.el7.x86_64 docker-ce-cli-20.10.11-3.el7.x86_64 docker-ce-rootless-extras-20.10.11-3.el7.x86_64 docker-scan-plugin-0.9.0-3.el7.x86_64
2、安装 containerd
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install containerd.io
3、配置 containerd
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
4、使用 systemd cgroup 驱动程序
结合 runc 使用 systemd cgroup 驱动,在 /etc/containerd/config.toml 中设置
[plugins.“io.containerd.grpc.v1.cri”.containerd.runtimes.runc]
…
[plugins.“io.containerd.grpc.v1.cri”.containerd.runtimes.runc.options]
SystemdCgroup = true
[plugins.“io.containerd.grpc.v1.cri”]
sandbox_image = “registry.aliyuncs.com/k8sxio/pause:3.6”
需要单独指定使用的pause容器,通过kubeadm指定的不会生效
5、重启containerd
修改配置文件后请重新启动 containerd 使配置生效:
systemctl restart containerd.service
systemctl enable containerd.service
6、安装crictl
crictl是连接containerd的一个client端工具,用于管理containerd中的容器,这个工具比默认的ctr好用。crictl 使用 k8s.io 命名空间,kubernetes使用的镜像也是在这个名称空间下。
VERSION=“v1.19.0” #下载与你的 kubernetes 版本相对应的版本
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/
V
E
R
S
I
O
N
/
c
r
i
c
t
l
−
VERSION/crictl-
VERSION/crictl−VERSION-linux-amd64.tar.gz
tar zxvf crictl-$VERSION-linux-amd64.tar.gz
chown root.root crictl
mv crictl /usr/bin/
配置crictl工具
编辑 /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
7、配置kubelet使用containerd
[root@k8s-m1 ~]# cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=“--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd”
8、重启kubelet
systemctl restart kubelet
9、取消node节点不可被调度的标记
[root@k8s-m1~]# kubectl uncordon k8s-m1
node/node1 uncordoned
四、查看容器引擎是否成功切换为containerd
[root@k8s-m1 ~]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-m1 Ready master 63d v1.19.16 192.168.2.140 CentOS Linux 7 (Core) 6.1.9-1.el7.elrepo.x86_64 containerd://1.6.16
k8s-m2 Ready master 63d v1.19.16 192.168.2.141 CentOS Linux 7 (Core) 6.1.9-1.el7.elrepo.x86_64 docker://19.3.9
k8s-m3 Ready master 63d v1.19.16 192.168.2.142 CentOS Linux 7 (Core) 6.1.9-1.el7.elrepo.x86_64 docker://19.3.9
继续升级切换其他节点。最后完成升级