将容器运行时从docker迁移到containerd

实验环境

  • master1、node1
  • k8s版本为1.23.1
  • OS版本为centos7.9

封锁排空节点

  • cordon、drain master节点
kubectl cordon master1
kubectl drain master1  --delete-emptydir-data  --force --ignore-daemonsets
#当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的时候,就需要用--force来强制执行 (例如:kube-proxy)
#--ignore-daemonsets:如果有mount local volume的pod,会强制驱逐pod

注意:也可以自己手动打污点:

# 手动自己打污点
kubectl taint node k8s-node02 offline=true:NoSchedule
# 去掉污点
# 手动自己打污点
kubectl taint node k8s-node02 offline=true:NoSchedule-

停止并卸载docker

systemctl disable docker  --now
yum remove docker-ce docker-ce-cli -y

安装配置containerd

  • 安装containerd
yum install containerd.io cri-tools  -y
crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock
  • 生成containerd配置文件
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml

#在[plugins."io.containerd.grpc.v1.cri".registry.mirrors]这一行下面配置endpoint
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://docker.m.daocloud.io"]

#修改:
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"
#修改:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
   SystemdCgroup = true
  • 重启containerd
systemctl enable containerd; systemctl restart containerd

配置kubelet

  • 修改kubelet参数
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
systemctl restart kubelet
  • 修改node annotation
kubectl edit nodes master1

apiVersion: v1
kind: Node
metadata:
  annotations:
    kubeadm.alpha.kubernetes.io/cri-socket: /var/run/containerd/containerd.sock

解锁节点调度

kubectl uncordon master1

验证

kubectl get nodes -owide

迁移worker节点

  • 遵循上面与master相同的步骤

k8s版本升级-1.23-1.24

实验环境

  • 由1.23升级到1.24,包括了容器运行时由docker升级为containerd,升级kubernetes组件。这里接着上面升级到containerd继续进行。
  • 参考官网文档:http://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade

封锁排空控制节点

kubectl cordon master1
kubectl drain master1 --delete-emptydir-data --force --ignore-daemonsets

注意:也可以自己手动打污点:

# 手动自己打污点
kubectl taint node k8s-node02 offline=true:NoSchedule
# 去掉污点
# 手动自己打污点
kubectl taint node k8s-node02 offline=true:NoSchedule-

升级控制节点

  • 升级kubeadm
# 升级到对应版本
yum install -y kubeadm-1.24.1-0 --disableexcludes=kubernetes
#--disableexcludes=kubernetes表示临时禁用对kubernetes分类的排除,确保即使 yum 配置中设置了对 Kubernetes 相关软件包的排除,这个命令也能够强制安装指定的 kubelet 和 kubectl 版本。这样可以帮助用户安装特定版本的软件,即使这些版本可能与系统中其他部分软件的兼容性有冲突或者其他原因导致它们被默认排除。
kubeadm upgrade plan
kubeadm upgrade apply v1.24.1
  • 升级kubectl和kubelet
yum install -y kubelet-1.24.1-0 kubectl-1.24.1-0 --disableexcludes=kubernetes
  • 修改kubelet参数
vim /var/lib/kubelet/kubeadm-flags.env
#由
KUBELET_KUBEADM_ARGS="--network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.6"
#修改成:
KUBELET_KUBEADM_ARGS="--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.6"
#删除了参数--network-plugin=cni,如果不删除此参数则kubelet启动不了

systemctl daemon-reload && systemctl restart kubelet

升级工作节点

  • 步骤参考前面升级控制节点的步骤
  • 注意在升级kubeadm这一步命令为:
kubeadm upgrade node

k8s patch版本升级-1.30.0-1.30.12

参考:Upgrading kubeadm clusters | Kubernetes

首先需要查看都有哪些patch版本可以升级:

yum list --showduplicates kubeadm --disableexcludes=kubernetes
# 找到类似这样的一行:
# kubeadm.x86_64  1.33.5-150500.1.1  kubernetes

控制节点

  1. 封锁排空控制节点
kubectl cordon rm1
kubectl drain rm1 --delete-emptydir-data --force --ignore-daemonsets

注意:也可以自己手动打污点:

# 手动自己打污点
kubectl taint node k8s-node02 offline=true:NoSchedule
# 去掉污点
# 手动自己打污点
kubectl taint node k8s-node02 offline=true:NoSchedule-
  1. 升级kubeadm
yum install -y kubeadm-'1.31.12-0' --disableexcludes=kubernetes
kubeadm upgrade plan
kubeadm upgrade apply v1.31.12 #--ignore-preflight-errors=SystemVerification
  1. 升级kubelet和kubectl
yum install -y kubelet-1.30.12-150500.1.1 kubectl-1.30.12-150500.1.1 --disableexcludes=kubernetes
systemctl daemon-reload && systemctl restart kubelet
# 重启kubelet之后,node才会显示新版本
kubectl get nodes
  1. 恢复节点
kubectl uncordon rm1

工作节点

  1. 封锁排空
# 控制节点上
kubectl cordon rn1
kubectl drain rn1 --delete-emptydir-data --force --ignore-daemonsets
  1. 升级kubeadm
# 登录到工作节点上
yum list --showduplicates kubeadm --disableexcludes=kubernetes
yum install -y kubeadm-'1.30.12-150500.1.1' --disableexcludes=kubernetes
kubeadm upgrade node #--ignore-preflight-errors=SystemVerification
  1. 升级kubelet和kubectl
# 工作节点上
yum install -y kubelet-1.30.12-150500.1.1 kubectl-1.30.12-150500.1.1 --disableexcludes=kubernetes
systemctl daemon-reload && systemctl restart kubelet
  1. 恢复节点
# 控制节点上
kubectl uncordon rn1

k8s minor版本升级-1.30-1.31

升级前检查

节点需要先下线,可以使用如下步骤平滑下线:

  1. 添加污点禁止调度:
kubectl cordon node k8s-node02
# 手动自己打污点也行
# kubectl taint node k8s-node02 offline=true:NoSchedule
  1. 查询节点是否有重要服务,漂移重要服务至其它节点
kubectl get po -A -owide | grep k8s-node02
# 假设coredns为重要服务,使用rollout重新调度该服务(如果副本多,也可以直接删除Pod,防止全部pod重建)
kubectl rollout restart deploy coredns -n kube-system
  1. 确认是否是ingress入口:

  2. 如果就这一个入口,先把入口漂移到其他节点

  3. 如果很多入口,前端有个LB代理,在LB上把这个节点入口下线

  4. 使用drain设置为驱逐状态:

kubectl drain k8s-node02 --ignore-daemonsets --delete-emptydir-data
  1. 再次检查节点上的其它服务,基础组件等

  2. 查看有无异常的Pod:有无Pending/非Running状态的Pod

控制节点

  1. 封锁排空控制节点
kubectl cordon rm1
kubectl drain rm1 --delete-emptydir-data --force --ignore-daemonsets

注意:也可以自己手动打污点:

# 手动自己打污点
kubectl taint node k8s-node02 offline=true:NoSchedule
# 去掉污点
# 手动自己打污点
kubectl taint node k8s-node02 offline=true:NoSchedule-
  1. 升级kubeadm
yum list --showduplicates kubeadm --disableexcludes=kubernetes
yum install -y kubeadm-'1.31.8-150500.1.1' --disableexcludes=kubernetes
kubeadm upgrade plan
kubeadm upgrade apply v1.31.8

[!tip] 如果yum install报错找不到包,两种方式解决

方法1:

方法2:

  • 添加k8s repo
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/repodata/repomd.xml.key
EOF
  • 重新build
yum clean all && yum makecache
  • 查找新版本的包
yum list --showduplicates kubeadm --disableexcludes=kubernetes
  1. 升级kubelet和kubectl
yum install -y kubelet-1.31.8-150500.1.1 kubectl-1.31.8-150500.1.1 --disableexcludes=kubernetes
systemctl daemon-reload
systemctl restart kubelet
# 重启kubelet之后,node才会显示新版本
kubectl get nodes
  1. 恢复节点
kubectl uncordon rm1

工作节点

  1. 封锁排空
# 控制节点上
kubectl cordon rn1
kubectl drain rn1 --delete-emptydir-data --force --ignore-daemonsets
  1. 升级kubeadm
# 登录到工作节点上
yum list --showduplicates kubeadm --disableexcludes=kubernetes
yum install -y kubeadm-'1.31.8-150500.1.1' --disableexcludes=kubernetes
kubeadm upgrade node

[!tip] 如果yum install报错找不到包,两种方式解决

方法1:

方法2:

  • 添加k8s repo
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/repodata/repomd.xml.key
EOF
  • 重新build
yum clean all && yum makecache
  • 查找新版本的包
yum list --showduplicates kubeadm --disableexcludes=kubernetes
  1. 升级kubelet和kubectl
# 工作节点上
yum install -y kubelet-1.31.8-150500.1.1 kubectl-1.31.8-150500.1.1 --disableexcludes=kubernetes
systemctl daemon-reload
systemctl restart kubelet
  1. 恢复节点
# 控制节点上
kubectl uncordon rn1