温馨提示×

Ubuntu系统如何更新Kubernetes版本

小樊
42
2026-01-03 06:11:58
栏目: 智能运维

Ubuntu 上升级 Kubernetes 的标准流程(kubeadm)

一 升级前准备与版本规则

  • 备份关键数据与配置:建议对 etcd 做快照(如:ETCDCTL_API=3 etcdctl snapshot save …),并备份 /etc/kubernetes/ 目录;同时确认集群健康(控制面与节点 Ready、核心组件 Running)。
  • 升级路径与节奏:遵循“相邻次要版本递进”,不支持跨多个次要版本(如 1.22 → 1.24 需先到 1.23);多控制面(HA)场景一次只升级一个控制面节点。
  • 版本偏差策略要点:
    • kube-apiserver 各实例间最多相差 1 个次要版本;
    • kubelet 不能比 apiserver 新,最多比 apiserver 旧 3 个次要版本(若 kubelet < 1.25,最多旧 2 个);
    • kube-proxy 与 apiserver 偏差最多 3 个次要版本;
    • kube-controller-manager/scheduler/cloud-controller-manager 与 apiserver 最多相差 1 个次要版本;
    • kubectl 与 apiserver 相差不超过 1 个次要版本。
  • 软件源建议:若旧源(如 apt.kubernetes.io 或国内镜像)版本滞后,迁移到官方 pkgs.k8s.io 仓库(见下文命令)。

二 控制平面节点升级步骤

  • 升级 kubeadm(逐节点、先解 hold 再安装、再 hold)
    • 查看可升级版本:apt-cache madison kubeadm
    • 升级示例:
      sudo apt-mark unhold kubeadm && \ sudo apt-get update && sudo apt-get install -y kubeadm=‘1.28.4-1.1’ && \ sudo apt-mark hold kubeadm
  • 检查升级计划并预拉取镜像
    • 生成升级计划:sudo kubeadm upgrade plan(确认目标版本与组件变更)
    • 预拉取镜像:sudo kubeadm config images pull(可选,减少升级等待)
  • 执行控制平面升级
    • 单控制面:sudo kubeadm upgrade apply v1.28.4
    • HA 控制面:在待升级的控制面节点执行:sudo kubeadm upgrade apply v1.28.4 --control-plane
  • 升级 kubelet 与 kubectl(控制面节点)
    • 建议版本与 apiserver 保持一致:
      sudo apt-mark unhold kubelet kubectl && \ sudo apt-get update && sudo apt-get install -y kubelet=‘1.28.4-1.1’ kubectl=‘1.28.4-1.1’ && \ sudo apt-mark hold kubelet kubectl && \ sudo systemctl daemon-reload && sudo systemctl restart kubelet
  • 取消节点不可调度(如之前被 drain)
    • kubectl uncordon
      说明:kubeadm 会更新静态 Pod 清单并重启控制面组件;升级期间可通过 kubectl get pods -n kube-system 观察状态。

三 工作节点升级步骤

  • 逐节点升级,避免业务中断:
    1. 腾空节点(驱逐业务 Pod,忽略 DaemonSet):
      kubectl drain --ignore-daemonsets
    2. 升级 kubeadm(与控制面目标版本一致):
      sudo apt-mark unhold kubeadm && \ sudo apt-get update && sudo apt-get install -y kubeadm=‘1.28.4-1.1’ && \ sudo apt-mark hold kubeadm
    3. 执行节点升级(由控制面触发的静态 Pod 配置更新):
      sudo kubeadm upgrade node
    4. 升级 kubelet 与 kubectl:
      sudo apt-mark unhold kubelet kubectl && \ sudo apt-get update && sudo apt-get install -y kubelet=‘1.28.4-1.1’ kubectl=‘1.28.4-1.1’ && \ sudo apt-mark hold kubelet kubectl && \ sudo systemctl daemon-reload && sudo systemctl restart kubelet
    5. 解除不可调度:
      kubectl uncordon
    6. 验证:kubectl get nodes 应显示 Ready

四 升级后验证与常见问题

  • 集群与组件状态
    • kubectl get nodes(所有节点 Ready
    • kubectl get pods -A(核心组件与业务 Running
    • 查看日志:journalctl -u kubelet -f(排查异常)
  • 周边组件与兼容性
    • 升级 CNI/CSI/Ingress/Dashboard/监控 等组件以匹配新版本 API 与特性;
    • 如从 1.28.x 升级到 1.29.x,注意 kubelet 允许比 apiserver 最多旧 3 个次要版本的限制。
  • 软件源与镜像拉取
    • 若 apt 源版本滞后,迁移到 pkgs.k8s.io 并导入 GPG:
      curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
      echo “deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /” | sudo tee /etc/apt/sources.list.d/kubernetes.list
      sudo apt-get update
  • 回滚与应急
    • 升级前已做 etcd 快照/etc/kubernetes 备份,可在异常时快速回滚;
    • 生产环境建议灰度分批、在维护窗口执行,并尽量避免在升级过程中变更集群对象。

0