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

一、升级前的准备工作

  1. 备份集群配置和数据

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

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

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

      bash复制

      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复制

      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复制

      bash 复制代码
      kubectl drain k8s-master --ignore-daemonsets
  6. 升级kubelet和kubectl

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

      bash复制

      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复制

      bash 复制代码
      sudo systemctl daemon-reload
      sudo systemctl restart kubelet
  7. 解除节点保护

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

      bash复制

      bash 复制代码
      kubectl uncordon k8s-master

三、升级工作节点

  1. 逐个升级工作节点

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

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

      bash复制

      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复制

      bash 复制代码
      kubectl drain k8s-node1 --ignore-daemonsets
  4. 升级kubelet和kubectl

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

      bash复制

      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复制

      bash 复制代码
      sudo systemctl daemon-reload
      sudo systemctl restart kubelet
  5. 解除节点保护

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

      bash复制

      bash 复制代码
      kubectl uncordon k8s-node1
  6. 重复以上步骤

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

四、验证升级结果

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

    yaml复制

    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复制

    bash 复制代码
    kubectl apply -f nginx.yaml
  • 验证nginx服务是否正常运行:

    bash复制

    bash 复制代码
    kubectl get pods -o wide
    kubectl get svc

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

  1. 检查日志

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

      bash复制

      bash 复制代码
      journalctl -u kube-apiserver
      journalctl -u kube-controller-manager
      journalctl -u kube-scheduler
      journalctl -u kubelet

五、清理旧版本组件

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

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

      bash复制

      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复制

      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复制

      bash 复制代码
      kubectl get nodes
      kubectl describe node <node-name>

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

  2. etcd集群问题

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

      bash复制

      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集群的平滑升级。在升级过程中,务必谨慎操作,确保集群的稳定性和可用性。

相关推荐
cccyi721 分钟前
Linux Socket 编程全解析:UDP 与 TCP 实现及应用
linux·tcp socket·udp socket
刘一说25 分钟前
深入理解 Spring Boot Actuator:构建可观测性与运维友好的应用
运维·spring boot·后端
小苏兮33 分钟前
【把Linux“聊”明白】自动化构建-make/Makefile详解
linux·服务器·学习·自动化·1024程序员节
kyle~1 小时前
计算机网络---安全外壳协议(SSH,Secure Shell)
运维·计算机网络·安全·ssh
mobº1 小时前
K8s 集群部署中间件 - yaml 版本(二)
中间件·容器·kubernetes
fy zs1 小时前
linux文件系统和软硬连接
linux·centos
破烂pan1 小时前
Jenkins 定时触发(cron)使用说明
运维·jenkins
QT 小鲜肉1 小时前
【个人成长笔记】将Try Ubuntu里面配置好的文件系统克隆在U盘上(创建一个带有持久化功能的Ubuntu Live USB系统)
linux·开发语言·数据库·笔记·ubuntu
灰勒塔德2 小时前
ubuntu 部署 gitlab docker服务
docker·容器·gitlab
拾心212 小时前
【云运维】ELK笔记
运维·elk