如何简单、优雅地升级kubernetes [中国大陆]

发布日期: 2022-07-24     阅读: 6138    点赞: 0

时代在进步、科技在发展、升级kubernetes也不能再用土办法了…

因为网络原因,安装升级kubernetes历来都有些困难,大多都是修改各组件的镜像源。

随着k8s的普及和版本的不断升级,官方已经支持通过kubeadm的配置来修改安装/升级时拉去镜像的注册器地址。

如下是当下最主流,最简单的升级方法了。

修改kube-system空间下名为kubeadm-config的configMap。

修改k8s.gcr.io为阿里源

  imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers

然后按照官方教程升级即可

https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

如下以ubuntu从k8s 1.21.x 升级到1.22.x为例

确保ubuntu镜像源为国内镜像源

如下修改镜像源为阿里的参考链接

https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.70be1b114oiqZm

apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl

查看可升级的版本

通过执行如下命令可查询出可升级到的准确目标版本号例如 1.22.12.00

apt update
apt-cache madison kubeadm

以升级1.22查询版本为例

apt-cache madison kubeadm | grep 1.22.

PS:k8s升级需要1.21到1.22 然后1.22 到 1.23 不能跨大版本号升级所以 不能直接 apt upgrade升级

升级控制节点

# replace x in 1.22.x-00 with the latest patch version
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.22.x-00 && \
apt-mark hold kubeadm

替换上面的版本号为要升级目标版本号

  • 验证kubeadm版本
kubeadm version
  • 验证升级计划
kubeadm upgrade plan
  • 升级到指定版本
# replace x with the patch version you picked for this upgrade
sudo kubeadm upgrade apply v1.22.x

如升级成功则打印如下信息

[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.22.x". Enjoy!

[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
  • 升级其他控制节点
sudo kubeadm upgrade node
  • 将节点设为不可调度
# replace <node-to-drain> with the name of your node you are draining
kubectl drain <node-to-drain> --ignore-daemonsets
  • 升级kubelet and kubect
# replace x in 1.22.x-00 with the latest patch version
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.22.x-00 kubectl=1.22.x-00 && \
apt-mark hold kubelet kubectl
  • 将节点恢复调度
  # replace <node-to-drain> with the name of your node
  kubectl uncordon <node-to-drain>

升级worker节点

升级kubeadm

# replace x in 1.22.x-00 with the latest patch version
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.22.x-00 && \
apt-mark hold kubeadm

升级节点

kubeadm upgrade node

将节点设为停止调度

# replace <node-to-drain> with the name of your node you are draining
kubectl drain <node-to-drain> --ignore-daemonsets

升级kubelete和kubectl

apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.22.12-00 kubectl=1.22.12-00 --allow-downgrades && \
apt-mark hold kubelet kubectl

重启kubelet

sudo systemctl daemon-reload
sudo systemctl restart kubelet

恢复节点为可调度

# replace <node-to-drain> with the name of your node
kubectl uncordon <node-to-drain>

转载请注明出处,本文采用 CC4.0 协议授权