K8s Runtime从Docker修改为Containerd实践

从k8s1.24版本开始默认使用containerd作为容器运行时,当我们1.24之前版本的k8s集群想要升级的话,第一步就是要将Docker改为Containerd。

官方升级说明文档地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/change-runtime-containerd/

下面介绍下我升级Runtime的实践:

首先,为了最小化影响集群服务,需要逐台节点升级,每台升级成功,在升级下一台节点:

0. 设置节点不可调度

复制代码
# kubectl cordon k8s1
node/k8s1 cordoned

# kubectl get node 
NAME            STATUS                     ROLES    AGE   VERSION
k8s1            Ready,SchedulingDisabled   <none>   39d   v1.23.17
k8s2            Ready                      <none>   39d   v1.23.17
k8s3            Ready                      <none>   39d   v1.23.17

节点被标记为:SchedulingDisabled

1. 驱逐节点上运行的Pod

shell 复制代码
# kubectl drain k8s1 --ignore-daemonsets --delete-emptydir-data --force

等待k8s1节点上的pod被驱逐。

执行完毕后,查一下哪些pod还未被驱逐:

shell 复制代码
# kubectl get po -A -owide | grep k8s1
kb-system              csi-s3-59vwz                                  
kube-system            calico-node-wkdlm                       
kubevirt               virt-handler-75jb9                              
monitoring             node-exporter-9lbtg                       
rook-ceph              csi-cephfsplugin-8777w                  
rook-ceph              csi-rbdplugin-xzwrs                        

后续需要手动重启这些pod。

2. 关闭节点kubelet服务

复制代码
systemctl stop kubelet

3. 安装Containerd

复制代码
yum install containerd -y

配置Containerd所需要系统模块:

shell 复制代码
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

加载模块:

shell 复制代码
modprobe -- overlay
modprobe -- br_netfilter

配置内核参数:

shell 复制代码
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

加载内核参数:

shell 复制代码
sysctl --system

配置Containerd的配置文件:

shell 复制代码
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml

将Containerd的Cgroup改为Systemd:

shell 复制代码
vim /etc/containerd/config.toml

找到containerd.runtimes.runc.options,添加SystemdCgroup = true(如果已存在直接修改)

将sandbox_image的Pause镜像改成符合自己版本的地址:

shell 复制代码
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s1:5000/pause:3.6
docker push k8s1:5000/pause:3.6
vim /etc/containerd/config.toml

找到sandbox_image 改为: sandbox_image = "k8s1:5000/pause:3.6"

启动Containerd:

shell 复制代码
systemctl daemon-reload
systemctl enable --now containerd
systemctl status containerd

4. 增加非SSL私有仓库

修改config.toml文件:

shell 复制代码
vim /etc/containerd/config.toml

在registry分类中指定配置路径/etc/containerd/certs.d:

shell 复制代码
[plugins."io.containerd.grpc.v1.cri".registry]
  config_path = "/etc/containerd/certs.d"

以k8s1:5000为例:

shell 复制代码
mkdir -p /etc/containerd/certs.d/k8s1:5000/
vim /etc/containerd/certs.d/k8s1:5000/hosts.toml

server = "http://k8s1:5000"

[host."http://k8s1:5000"]
  capabilities = ["pull", "resolve", "push"]
  skip_verify = true

重启Containerd:

shell 复制代码
systemctl restart containerd

5. 修改kubelet服务使用Containerd作为Runtime

备份原来配置:

复制代码
cp /etc/systemd/system/kubelet.service.d/10-kubelet.conf /etc/systemd/system/kubelet.service.d/10-kubelet.conf.docker

修改kubelet配置使用containerd作为Runtime(注意:我k8s版本是1.23.17版本):

shell 复制代码
vim /etc/systemd/system/kubelet.service.d/10-kubelet.conf

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig"
Environment="KUBELET_SYSTEM_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd"
Environment="KUBELET_CONFIG_ARGS=--config=/etc/kubernetes/kubelet-conf.yml"
Environment="KUBELET_EXTRA_ARGS=--node-labels=node.kubernetes.io/node='' "
ExecStart=
ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_SYSTEM_ARGS $KUBELET_EXTRA_ARGS

启动kubelet:

shell 复制代码
systemctl daemon-reload
systemctl enable --now kubelet
systemctl status kubelet

6. 查看Runtime是否被替换成功

复制代码
# kubectl get node -owide 
NAME            STATUS                     ROLES    AGE   VERSION    INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
k8s1            Ready,SchedulingDisabled   <none>   39d   v1.23.17   172.16.58.101   <none>        CentOS Linux 7 (Core)   4.19.12-1.el7.elrepo.x86_64   containerd://1.6.24
k8s2            Ready                      <none>   39d   v1.23.17   172.16.58.102   <none>        CentOS Linux 7 (Core)   4.19.12-1.el7.elrepo.x86_64   docker://20.10.24
k8s3            Ready                      <none>   39d   v1.23.17   172.16.58.103   <none>        CentOS Linux 7 (Core)   4.19.12-1.el7.elrepo.x86_64   docker://20.10.24

可以看到k8s1节点的CONTAINER-RUNTIME改为了containerd://1.6.24

7. 恢复节点可调度

shell 复制代码
kubectl uncordon k8s1

8. 手动删除之前未驱逐的Pod

以Docker运行的未驱逐的Pod:

shell 复制代码
kb-system              csi-s3-59vwz                                         
kube-system            calico-node-wkdlm                              
kubevirt               virt-handler-75jb9                                    
monitoring             node-exporter-9lbtg                              
rook-ceph              csi-cephfsplugin-8777w                       
rook-ceph              csi-rbdplugin-xzwrs                             

删除Pod使其重启:

shell 复制代码
kubectl delete po -n kb-system csi-s3-59vwz
kubectl delete po -n kube-system calico-node-wkdlm 
kubectl delete po -n kubevirt  virt-handler-75jb9 
kubectl delete po -n monitoring node-exporter-9lbtg     
kubectl delete po -n rook-ceph csi-cephfsplugin-8777w csi-rbdplugin-xzwrs

9. 以此类推升级第下一个节点

相关推荐
xhaxy8 小时前
docker
docker·容器·eureka
上火的金鱼妹11 小时前
K8S基础组件作用和关系整理
linux·运维·服务器·kubernetes
一技安身11 小时前
【信创】Docker‑Compose V2 两种离线部署(独立模式、插件模式)简易教程
java·docker·eureka
鸿观工坊15 小时前
Docker 多阶段构建实践指南
docker
大牧师17 小时前
MySQL 学习教程
数据库·sql·mysql·docker·node·全栈·后端数据
MC丶科18 小时前
软考架构师90天冲刺|DAY44·Redis高级应用
数据库·数据仓库·redis·缓存·oracle·容器·规格说明书
天外天-亮19 小时前
docker + window 安装
运维·docker·容器
进击的小菜鸡dd19 小时前
docker 容器的挂载映射关系查看
运维·docker·容器
SLD_Allen19 小时前
从 HPA 到 KEDA:Kubernetes 弹性伸缩的进阶实践
云原生·容器·kubernetes
程序员老赵20 小时前
Docker 部署 TeX Live:轻松搭建 LaTeX 论文排版编译平台
前端·docker·latex