文章目录

  • 1. 二进制升级
  • 2.升级 kubeadm 集群
  • 2.1 基本流程
  • 2.2 准备工作
  • 2.3 具体升级步骤
  • 3.故障恢复
  • 4. 工作原理


1. 二进制升级

  1. 通过官网获取要升级的二进制包kubernetes.tar.gz,解压后提取服务的二进制文件
  2. 逐个隔离Node,等待在其上运行的全部容器完成后,更新kubelet和kube-proxy服务文件,然后重启这两个服务
  3. 更新Master的kube-apiserver、kube-controller-manager、kube-scheduler服务文件并重启

2.升级 kubeadm 集群

2.1 基本流程

  1. 升级主控制品名节点
  2. 升级其他控制平面节点
  3. 升级工作节点

2.2 准备工作

  • 集群应使用静态的控制平面和etcd pod或者外部etcd。
  • 务必备份所有重要组件,例如存储在数据库中应用层面的状态。kubeadm upgrade不会影响工作负载,只会涉及kubernetes内部组件。
  • 升级过程中会因为pod变化造成容器重启。

2.3 具体升级步骤

  1. 查看升级的版本
    #yum list --showduplicates kubeadm --disableexcludes=kubernetes
  2. 升级控制平面节点
    被升级的控制平面节点上必须拥有/etc/kubernetes/admin.conf文件
  • 升级kubeadm
    #yum install -y kubeadm-1.21.x --disableexcludes=kubernetes
  • 验证下载是否正常
    # kubeadm version
  • 验证升级计划
    #kubeadm upgrade plan
  • 选择要升级的目标版本,选择合适的命令
    #kubeadm upgrade apply v1.21.x
  • 手动升级CNI驱动插件
    CNI驱动应该提供了程序自身的升级说明,并查看是否需要其他升级步骤。如果CNI驱动作为DaemonSet运行,则在其他控制平面节点上不需要此步骤
  • 升级其它控制面节点,不需要执行kubadm upgrade plan和更新CNI驱动插件
    #kubeadm upgrade node
  • 腾空节点
    通过将节点标记为不可调度并腾空节点为节点升级作升级准备
    #kubectl drain <node-to-drain> --ignore-daemonsets
  • 升级kubelet和kubectl
    # yum install -y kubelet-1.21.x-0 kubectl-1.21.x-0 --disableexcludes=kubernetes 重启kubelet
    #systemctl daemon-reload && systemctl restart kubelet
  • 解除节点保护
    通过将节点 标记为可调度,让其重新上线
    #kubectl uncordon <node-to-drain>
  1. 升级工作节点
    一次升级工作节点的数量以不影响运行工作负载所需的最小容量为准。
  • 升级kubeadm
    #yum install -y kubeadm-1.21.x-0 --disableexcludes=kubernetes
  • 执行kubadm upgrade
    #kubeadm upgrade node
  • 腾空节点
    #kubectl drain <node-to-drain> --ignore-daemonsets
  • 升级kubelet和kubectl
    #yum install -y kubelet-1.21.x-0 kubectl-1.21.x-0 --disableexcludes=kubernetes #systemctl daemon-reload && systemctl restart kubelet
  • 取消对节点的保护
    #kubectl uncordon <node-to-drain>
  1. 验证集群状态
    #kubectl get nodes

3.故障恢复

当kubeadm upgrade失败并没有回滚,要从故障状态恢复,可以运行kubeadm upgrade --force

在升级期间,kubeadm向/etc/kubernetes/tmp目录下的如下备份文件夹写入数据

  • kubeadm-backup-etcd--:包含当前控制节点本地etcd成员数据的备份,如果etcd升级失败并且自动回滚也无法修复,则可以将此文件夹内容复制到/var/lib/etcd进行手动修复
  • kubeadm-backup-manifests--:包含当前控制面节点的静态pod清单文件的备份版本。如果升级失败无法自动回滚,则将此文件夹内容复制到/etc/kubernetes/manifests目录实现手工修复。

4. 工作原理

kubeadm upgrade apply 做了以下工作:

  • 检查你的集群是否处于可升级状态:
  • API 服务器是可访问的
  • 所有节点处于 Ready 状态
  • 控制面是健康的
  • 强制执行版本偏差策略。
  • 确保控制面的镜像是可用的或可拉取到服务器上。
  • 如果组件配置要求版本升级,则生成替代配置与/或使用用户提供的覆盖版本配置。
  • 升级控制面组件或回滚(如果其中任何一个组件无法启动)。
  • 应用新的 CoreDNS 和 kube-proxy 清单,并强制创建所有必需的 RBAC 规则。
  • 如果旧文件在 180 天后过期,将创建 API 服务器的新证书和密钥文件并备份旧文件。

kubeadm upgrade node 在其他控制平节点上执行以下操作:

  • 从集群中获取 kubeadm ClusterConfiguration。
    -(可选操作)备份 kube-apiserver 证书。
  • 升级控制平面组件的静态 Pod 清单。为本节点升级 kubelet 配置kubeadm upgrade

node 在工作节点上完成以下工作:

  • 从集群取回 kubeadm ClusterConfiguration。
  • 为本节点升级 kubelet 配置。