当前位置: 首页 > article >正文

Linux二进制部署K8s集群的平滑升级教程

一、升级前的准备工作

  1. 备份集群配置和数据

    • 备份/etc/kubernetes/目录,其中包含Kubernetes集群的配置文件。

    • 备份/var/lib/etcd/目录,其中存储了etcd数据库的数据。

    • 使用etcdctl工具备份etcd数据:

      bash复制

      ETCDCTL_API=3 etcdctl snapshot save /data/etcd/etcd_bak.db \
      --endpoints=https://127.0.0.1:2379 \
      --cacert=/etc/kubernetes/pki/etcd/ca.crt \
      --cert=/etc/kubernetes/pki/etcd/server.crt \
      --key=/etc/kubernetes/pki/etcd/server.key
      

      如果没有etcdctl工具,可通过yum install -y etcd安装。

  2. 检查集群状态

    • 确保集群中所有节点的状态正常,所有Pod都在运行状态。
    • 检查集群中是否有未完成的作业或任务,避免升级过程中出现意外。

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

  1. 升级kubeadm

    • 下载新版本的kubeadm二进制文件,并替换旧版本文件。例如,下载1.29.10版本:

      bash复制

      wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubeadm
      chmod +x kubeadm
      sudo mv kubeadm /usr/local/bin/
      
  2. 验证kubeadm版本

    • 执行kubeadm version命令,确认版本已升级到目标版本。
  3. 检查升级计划

    • 执行kubeadm upgrade plan命令,检查集群是否可以升级,并获取目标版本信息。
  4. 执行控制平面升级

    • 执行kubeadm upgrade apply v1.29.10命令,开始升级控制平面组件。
    • 该命令会自动下载并安装新版本的控制平面组件,包括kube-apiserver、kube-controller-manager、kube-scheduler等。
  5. 腾空master节点

    • 将master节点标记为不可调度,并驱逐所有负载:

      bash复制

      kubectl drain k8s-master --ignore-daemonsets
      
  6. 升级kubelet和kubectl

    • 下载新版本的kubelet和kubectl二进制文件,并替换旧版本文件:

      bash复制

      wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubelet
      wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubectl
      chmod +x kubelet kubectl
      sudo mv kubelet /usr/local/bin/
      sudo mv kubectl /usr/local/bin/
      
    • 重启kubelet服务:

      bash复制

      sudo systemctl daemon-reload
      sudo systemctl restart kubelet
      
  7. 解除节点保护

    • 将master节点标记为可调度:

      bash复制

      kubectl uncordon k8s-master
      

三、升级工作节点

  1. 逐个升级工作节点

    • 每次只升级一个工作节点,以确保集群在升级过程中仍能正常运行。
  2. 升级kubeadm

    • 在工作节点上,下载并安装新版本的kubeadm二进制文件:

      bash复制

      wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubeadm
      chmod +x kubeadm
      sudo mv kubeadm /usr/local/bin/
      
  3. 腾空工作节点

    • 将工作节点标记为不可调度,并驱逐所有负载:

      bash复制

      kubectl drain k8s-node1 --ignore-daemonsets
      
  4. 升级kubelet和kubectl

    • 下载并安装新版本的kubelet和kubectl二进制文件:

      bash复制

      wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubelet
      wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/kubectl
      chmod +x kubelet kubectl
      sudo mv kubelet /usr/local/bin/
      sudo mv kubectl /usr/local/bin/
      
    • 重启kubelet服务:

      bash复制

      sudo systemctl daemon-reload
      sudo systemctl restart kubelet
      
  5. 解除节点保护

    • 将工作节点标记为可调度:

      bash复制

      kubectl uncordon k8s-node1
      
  6. 重复以上步骤

    • 对其他工作节点重复上述升级步骤,直到所有工作节点都升级完成。

四、验证升级结果

  1. 检查集群状态
    • 执行kubectl get nodes命令,确认所有节点的状态为Ready
    • 执行kubectl get pods -A命令,检查所有Pod的状态是否正常。
  2. 验证集群功能
  • 部署一个简单的应用(如nginx)来测试集群功能是否正常。以下是部署nginx的示例:

    yaml复制

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      namespace: default
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      namespace: default
    spec:
      type: NodePort
      selector:
        app: nginx
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
        nodePort: 30001
    

    将上述内容保存为nginx.yaml文件,然后执行以下命令进行部署:

    bash复制

    kubectl apply -f nginx.yaml
    
  • 验证nginx服务是否正常运行:

    bash复制

    kubectl get pods -o wide
    kubectl get svc
    

    访问http://<NodeIP>:30001,如果能够正常访问nginx页面,说明集群功能正常。

  1. 检查日志

    • 查看控制平面组件和kubelet的日志,确认没有异常错误信息:

      bash复制

      journalctl -u kube-apiserver
      journalctl -u kube-controller-manager
      journalctl -u kube-scheduler
      journalctl -u kubelet
      

五、清理旧版本组件

  1. 清理旧版本的二进制文件

    • 如果旧版本的kubeadm、kubelet和kubectl二进制文件仍然存在,可以手动删除它们。例如:

      bash复制

      sudo rm /usr/local/bin/kubeadm-<old-version>
      sudo rm /usr/local/bin/kubelet-<old-version>
      sudo rm /usr/local/bin/kubectl-<old-version>
      
  2. 清理旧版本的容器镜像

    • 使用docker命令清理旧版本的Kubernetes镜像:

      bash复制

      docker images | grep '<old-k8s-version>' | awk '{print $3}' | xargs docker rmi
      

六、注意事项

  1. 版本兼容性
    • 在升级之前,务必确认新版本的Kubernetes与集群中使用的其他组件(如CNI插件、存储插件等)兼容。例如,如果使用的是calico作为CNI插件,需要确保其版本与新版本的Kubernetes兼容。
  2. 升级顺序
    • 严格按照控制平面节点(master节点)先升级,然后逐个工作节点升级的顺序进行操作,避免出现集群不可用的情况。
  3. 监控集群状态
    • 在升级过程中,持续监控集群的状态,及时发现并解决可能出现的问题。可以使用kubectl命令或集群监控工具(如Prometheus、Grafana等)来监控集群状态。
  4. 回滚方案
    • 如果升级过程中出现问题,需要有回滚方案。可以使用之前备份的配置文件和数据进行恢复,或者重新安装旧版本的Kubernetes组件。

七、常见问题及解决方法

  1. Pod无法调度

    • 如果在升级过程中,某些Pod无法调度到节点上,可能是节点状态异常或资源不足。可以通过以下命令检查节点状态:

      bash复制

      kubectl get nodes
      kubectl describe node <node-name>
      

      根据检查结果,解决节点状态问题或清理节点上的资源。

  2. etcd集群问题

    • 如果etcd集群出现问题,可能导致集群无法正常工作。可以通过以下命令检查etcd集群状态:

      bash复制

      ETCDCTL_API=3 etcdctl endpoint status \
      --endpoints=https://127.0.0.1:2379 \
      --cacert=/etc/kubernetes/pki/etcd/ca.crt \
      --cert=/etc/kubernetes/pki/etcd/server.crt \
      --key=/etc/kubernetes/pki/etcd/server.key
      

      如果发现etcd集群状态异常,可以尝试重启etcd服务或使用备份数据恢复etcd集群。

  3. 网络插件问题

    • 如果在升级后,Pod之间的网络通信出现问题,可能是网络插件配置不正确或版本不兼容。可以参考网络插件的官方文档,检查和更新网络插件的配置。

通过以上步骤和注意事项,您可以顺利完成Linux二进制部署的Kubernetes集群的平滑升级。在升级过程中,务必谨慎操作,确保集群的稳定性和可用性。


http://www.kler.cn/a/521174.html

相关文章:

  • leetcode刷题-贪心03
  • 第05章 12 可视化热量流线图一例
  • C#常用257单词
  • 递归搜索回溯综合练习(十五题)
  • Mybatis配置文件详解
  • miniconda学习笔记
  • uniapp版本升级
  • 菜鸟开发之多表联合增删改
  • Crewai框架添加日志功能
  • GD32F470 USB虚拟串口
  • Day40:列表的排序
  • python 变量范围的定义与用法
  • 汽车网络信息安全-ISO/SAE 21434解析(中)
  • 拖拽移动(Semi Design)
  • 《一起做很甜的梦!》
  • sqlite3 学习笔记
  • 数据分箱 baggingboosting onehot独热编码 woe编码 sklearn的ensemble(集成学习)
  • python:taichi 高性能可视化 Demo 展览
  • 基于SpringBoot的母婴护理知识共享管理系统
  • 代码随想录算法【Day32】
  • Go中的Context(上下文)
  • ESP8266基于WiFiManager设置页面添加参数并且掉电不丢失
  • GIT管理指令
  • Object类(1)
  • Qt Enter和HoverEnter事件
  • 硬件学习笔记--36 TTL、RS232、RS485相关介绍