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

相关推荐
keep intensify5 小时前
Redis基础指令全解析:从入门到精通
linux·数据库·c++·redis
二进制coder5 小时前
Kubernetes全景解读:从云原生基石到卓越实践
云原生·容器·kubernetes
Industio_触觉智能5 小时前
RK3562核心板/开发板RT-Linux系统实时性及硬件中断延迟测试
linux·嵌入式开发·瑞芯微·rk3562·rt linux·xenomai rt·preempt_rt
爱吃生蚝的于勒5 小时前
【Linux】零基础学会linux环境基础开发工具使用(yum,vim,makefile,gdb)
linux·服务器·数据结构·c++·蓝桥杯·编辑器·vim
本贾尼5 小时前
Linux系统下的终端,会话,shell,bash,进程组这几个概念的关系。
linux·服务器·网络·ubuntu·bash
零基础的修炼6 小时前
Linux---线程封装
linux·c++·算法
---学无止境---6 小时前
Linux中比较两个字符串的前count个字符的汇编实现
linux
文火冰糖的硅基工坊6 小时前
[嵌入式系统-115]:鸿蒙操作系统(HarmonyOS)与欧拉操作系统(openEuler)、Linux操作系统的关系、比较及异同如下:
linux·服务器·科技·华为·重构·架构·harmonyos
2401_837088506 小时前
Redis的vim基本操作
linux·编辑器·vim
馨谙6 小时前
标题:Linux 系统中的“保险库管理员”:深入浅出理解 /etc/shadow 文件
linux·运维·服务器