linux

Linux下如何升级K8S版本

小樊
37
2025-10-22 19:11:41
栏目: 智能运维

Linux下升级K8S版本的分步指南(以kubeadm部署为例)

一、升级前准备:规避风险的关键

  1. 明确升级路径
    K8s遵循“相邻次要版本递进”原则(如1.23→1.24→1.25),禁止跨多个次要版本跳跃升级(如1.22→1.25)。需通过kubectl version查看当前集群版本,在官方升级文档中确认目标版本的兼容性。
  2. 检查集群健康状态
    升级前必须确保集群无异常,关键检查项:
    • 控制平面组件状态:kubectl get pods -n kube-system -l component=kube-apiserver(需全部Running);
    • 节点状态:kubectl get nodes(所有节点需为Ready);
    • Pod运行状态:kubectl get pods --all-namespaces --field-selector status.phase!=Running(无CrashLoopBackOffError状态的Pod)。
  3. 备份关键数据
    • 备份etcd数据(etcd是集群状态存储核心):
      ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-snapshot-$(date +%F).db
      
    • 备份配置文件:cp -r /etc/kubernetes /etc/kubernetes.backup
  4. 确认组件兼容性
    • 网络插件(如Calico、Flannel):需升级到支持目标K8s版本的版本(如Calico 3.24支持K8s 1.25);
    • 容器运行时:K8s 1.25+推荐使用containerd(Docker已弃用),需升级到兼容版本(如containerd 1.6+);
    • 工具链:kubectl版本需与集群版本相差不超过1个次要版本(如集群1.24,kubectl需为1.23-1.25)。

二、升级控制平面节点(Master节点)

控制平面是集群核心,需优先升级,步骤如下:

  1. 升级kubeadm工具
    kubeadm是升级控制平面的关键工具,需先升级到目标版本:

    • CentOS/RHEL
      sudo yum install -y kubeadm-<目标版本> --disableexcludes=kubernetes
      
    • Ubuntu/Debian
      sudo apt update && sudo apt install -y kubeadm=<目标版本> -V
      

    安装后通过kubeadm version验证版本是否正确。

  2. 检查升级计划
    运行kubeadm upgrade plan查看集群可升级到的版本及需要升级的组件(如kube-apiserver、kube-controller-manager等),确认无误后继续。

  3. 应用升级
    执行kubeadm upgrade apply <目标版本>(如kubeadm upgrade apply v1.25.0),该命令会自动升级控制平面组件(kube-apiserver、kube-controller-manager、kube-scheduler)及kubelet配置文件。升级完成后,重启控制平面组件:

    sudo systemctl daemon-reload
    sudo systemctl restart kube-apiserver kube-controller-manager kube-scheduler
    
  4. 升级kubelet和kubectl

    • 升级kubelet:sudo yum install -y kubelet-<目标版本> --disableexcludes=kubernetes(CentOS);
    • 升级kubectl:sudo apt install -y kubectl=<目标版本> -V(Ubuntu);
    • 重启kubelet:sudo systemctl daemon-reload && sudo systemctl restart kubelet

三、升级工作节点(Worker节点)

工作节点负责运行Pod,需在控制平面升级完成后逐个升级,确保集群始终有可用节点承载业务:

  1. 标记节点为不可调度
    避免新Pod调度到待升级节点:

    kubectl cordon <节点名称>
    
  2. 驱逐节点上的Pod
    将节点上的Pod安全驱逐到其他节点(--ignore-daemonsets忽略DaemonSet管理的Pod,--force强制驱逐):

    kubectl drain <节点名称> --ignore-daemonsets --force
    
  3. 升级kubelet和kubectl
    步骤同控制平面节点的kubelet/kubectl升级(见上文)。

  4. 重启kubelet

    sudo systemctl daemon-reload && sudo systemctl restart kubelet
    
  5. 标记节点为可调度
    升级完成后,允许新Pod调度到该节点:

    kubectl uncordon <节点名称>
    
  6. 重复操作
    依次升级所有工作节点,确保集群高可用。

四、升级后验证:确保集群正常

  1. 检查节点状态
    确认所有节点已升级到目标版本且状态正常:

    kubectl get nodes -o wide
    

    输出中VERSION列应显示为目标版本(如v1.25.0),STATUSReady

  2. 检查Pod状态
    确认所有Pod正常运行:

    kubectl get pods --all-namespaces
    

    CrashLoopBackOffErrorPending状态的Pod(短暂ContainerCreating属正常)。

  3. 验证业务功能
    检查核心业务应用(如数据库、Web服务)的可用性(如访问接口、查询数据),确保升级未影响业务逻辑。

五、常见问题与注意事项

通过以上步骤,可平稳完成Linux环境下K8S集群的版本升级,兼顾稳定性与新特性。升级过程中需严格遵循“备份→检查→升级→验证”的流程,确保业务连续性。

0
看了该问题的人还看了