You need to enable JavaScript to run this app.
导航

集群升级最佳实践

最近更新时间2024.04.16 15:57:51

首次发布时间2024.04.16 15:57:51

本文主要介绍升级集群时,各阶段的操作建议以及注意事项。

场景介绍

Kubernetes 是一个强大的容器编排平台,被广泛应用于云原生应用的部署和管理。随着 Kubernetes 的快速发展,新版本不断被推出,带来了更多的功能和性能提升。容器服务(VKE)保障最近三个 Kubernetes 次要版本的稳定运行,过期版本的集群可能存在安全和稳定性风险,因此为保证您业务的连贯性,建议您及时升级集群版本。本文档将介绍升级 Kubernetes 版本相关的操作建议、注意事项等,帮助您安全、高效地升级集群或节点池 Kubernetes 到最新版本。更多升级策略信息和集群升级原理,请参见 Kubernetes 版本支持策略升级集群

前提条件

集群处于 运行中 状态,且存在可升级的 Kubernetes 版本。

注意事项

  • 升级集群控制面 Kubernetes 版本过程中,集群上的应用不会中断,如果应用强依赖于 API Server 可能会有短暂影响。
  • 升级节点 Kubernetes 版本会影响正在节点上运行的业务 Pod,升级过程中可能造成 Pod Prober、Lifecycle Hook 失败,也可能会出现 Pod 原地重启情况。因此在升级前,应检查集群状态是否健康、是否处于业务低峰期,从而判断是否开始进行节点升级。
  • 集群升级不支持回滚,请谨慎进行。
  • 如果您有多套环境(例如测试环境、预发布环境、生产环境),建议先从测试环境开始验证升级功能。在多个环境均验证成功后,最后在生产环境中升级集群。

更多升级集群时的注意事项,请参见 升级集群

前置准备

确定升级时间窗口

根据集群规模和业务特点,选择业务低峰期,并结合如下说明确定升级时间窗口:

  • 先进行控制面升级,再按需进行节点升级。
  • 控制面升级耗时为 5~10 分钟。
  • 同时选择升级多个节点时,系统会对所选节点自动按一定的并行数进行分批升级,单个或单批次节点升级耗时约 3 分钟。
  • 在测试/预发布环境验证升级通过后,为生产环境集群升级预留 2 小时的时间窗口,包括升级时间和观察时间各 1 小时。

确保业务负载打散

由于节点升级时会重启 containerd 和 kubelet 组件,因此集群内配置有就绪探针(Readiness Probe)和存活探针(Liveness Probe)的工作负载在此期间可能会出现容器 NotReady 的情况。建议为工作负载配置多个副本,同时配置 Pod 拓扑分布约束或 Pod 反亲和性,使得多个副本分布在不同的节点上,并在升级节点时分不同批次升级这些节点。

本文以 ingress-nginx 组件为例,安装该组件后,会 kube-system 命名空间下以对应名称为 ingress-nginx-controller 的无状态负载( Deployment)方式部署到集群中。安装组件的方法,请参见 安装组件

ingress-nginx-controller 对应 YAML 文件的spec.template.spec字段中配置拓扑分布约束,使得 Pod 在节点数量符合要求时尽量分布在不同可用区的节点上。示例代码片段如下:

topologySpreadConstraints:
  - labelSelector:
      matchLabels:
        app.kubernetes.io/name: ingress-nginx
    maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: ScheduleAnyway
  - labelSelector:
      matchLabels:
        app.kubernetes.io/name: ingress-nginx
    maxSkew: 1
    topologyKey: topology.kubernetes.io/zone
    whenUnsatisfiable: ScheduleAnyway

配置监控告警

在集群内部署监控告警组件,例如安装 Prometheus-agent 监控组件并配置工作区,可及时监控组件升级过程中重要指标是否发生异常。更多集群监控相关信息,请参见 集群监控

开启集群审计

容器服务控制台 开启集群审计功能,以便通过 API Server 审计日志来记录用户在集群中的日常操作,帮助集群管理员对用户在集群中的操作行为进行安全审计,保证集群安全、稳定运行。更多集群审计相关信息,请参见 集群审计

控制面升级

本文以集群当前 Kubernetes 版本为 v1.20,升级到 Kubernetes v1.24 版本为例,为您介绍升级集群控制面和节点的操作步骤及升级过程中的注意事项。

步骤一:明确集群版本

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 在集群列表页面,单击目标集群。
  4. 在目标集群的 总览 页面,确认集群当前 Kubernetes 版本(控制面版本)为 v1.20.15-vke.30。
    alt

步骤二:控制面升级检查

  1. 在集群管理页面的左侧导航栏中,单击 集群升级
  2. 在 集群升级 页面,单击 Kubernetes 升级检查 页签,做升级前置检查。
  3. 单击 控制面升级检查,确认本次目标版本为次要版本 v1.24.15-vke.26。
    alt
  4. 单击 确定,开始进行控制面 Kubernetes 升级前置检查。
  5. 根据控制面升级检查结果,对未通过的检查项进行修复,对警告项根据实际情况选择修复或跳过。
    本示例中控制面检查报告中异常的 检查项 如下:
    alt
    • addon 组件兼容性检查:显示集群中 ingress-nginx 组件版本过低,需要先升级该组件后才能升级集群。该项为 不通过 检查项,必须处理并确保检查项通过。
    • 废弃 Kubernetes API 检查:显示集群中存在 Kubernetes API 已废弃的资源,因此需要对这类对象进行处理。该项为 警告 检查项,根据您的实际业务自行判断后,在正式升级时可选择跳过 警告
  6. 处理升级检查结果中的异常问题,处理完成后再次进行控制面升级检查,直至检查结果全部通过。
    1. 升级 ingress-nginx 组件至最新版本。详细操作,请参见 升级组件
    2. 确认集群中的哪些服务使用了 Kubernetes API 已废弃的资源,并自行评估是否对集群和业务有影响。若无影响,可忽略该警告项;若有影响,可升级服务中 Kubernetes 资源到新版本。详细的资源变更与弃用说明,请参见 Kubernetes 版本发布记录
    3. 再次单击 控制面升级检查,确认升级版本信息然后单击 确定,进行控制面升级检查。

步骤三:控制面升级操作

  1. 在 集群升级 页面,选择 Kubernetes 升级 页签,单击 控制面升级
  2. 在 控制面 Kubernetes 升级 对话框,确认升级信息。
    alt
  3. 单击 确定升级,开始进行控制面升级。
    升级过程中,请勿对集群进行任何操作。您可单击右侧 操作 列下的 查看详情,查看控制面 Kubernetes 升级进度,同时观察业务监控、集群内 Pod 有无预期外的异常情况。
  4. 当集群升级页面观察到任务状态为 通过 时,观察集群 总览 页面,确认集群状态为 运行中,Kubernetes 版本为目标的 v1.24.15-vke.26 版本。节点 Kubernetes 版本尚未升级仍为旧版本的 v1.20.15-vke.30,此时集群控制面升级完成。
    alt
    alt

节点升级

步骤一:选择升级节点

  1. 在选择升级节点时,对于流量敏感型的业务 Pod,需要把这些 Pod 所在的节点放在不同批次中升级。
    本例中 ingress-nginx-controller 的 Pod 已被打散在不同节点,因此选择升级节点时会把这些 Pod 所在的如下图两个节点分为两批升级,192.168.4.7对应的 node-xptzps 为第一批升级。
    alt
  2. 剩余节点确定为第二批升级。

步骤二:节点升级检查

  1. 在 集群升级 页面,单击 Kubernetes 升级检查 页签。
  2. 单击 节点升级检查,在 节点升级检查 页面勾选可升级的节点,然后单击 确定,开始进行节点升级前置检查。
    本示例先单独选择节点 IP 192.168.4.7对应的 node-xptzps,做节点升级检查。
    alt
  3. 确认 node-xptzps 节点升级检查通过后,批量选择剩余节点进行节点升级检查。
  4. 剩余节点的节点升级检查均通过后,准备执行节点升级。
    若有 失败 或 警告 的检查项,请单击右侧的 查看详情,并按照系统提示处理检查失败项。处理完成后重新进行 节点升级检查,保证 检查状态 显示 通过 后进行升级操作。

步骤三:节点升级操作

  1. 在 集群升级 页面,单击 Kubernetes 升级 页签。
  2. 单击 节点升级,在 节点升级 页面勾选可升级的节点,然后单击 确定,开始进行节点升级。
    本示例先单独选择节点 IP 192.168.4.7对应的 node-xptzps,进行节点升级。
    alt
  3. 单击 确定升级,开始进行升级 node-xptzps 节点。
    升级过程中,请勿对集群以及节点进行任何操作。您可单击右侧 操作 列下的 查看详情,查看节点 Kubernetes 升级进度,同时观察业务监控、集群内 Pod 有无预期外的异常情况。
  4. 当在 节点 Kubernetes 升级进度 页面观察到升级状态为通过时,观察对应的 节点详情页,确认节点状态为 运行中,节点 Kubelet 版本升级为目标版本 v1.24.15-vke.26,存量 Pod 无异常,则当前节点升级完成。
    alt
  5. 根据规划的节点升级节奏,批量选择剩余节点进行升级。
    alt
  6. Kubernetes 升级 页签中单击对应升级任务右侧 操作 列下的 查看详情,通过升级详情可以观察到所选节点正在分批升级,直到所有节点升级状态显示 通过,表示节点已全部升级完成。

升级后检查

  1. 在集群管理页面的左侧导航栏中,单击 总览
  2. 集群信息 区域查看集群状态为 运行中,同时 Kubernetes 版本和节点版本均为目标的 v1.24.15-vke.26。
    alt
  3. 观察集群中业务工作负载监控有无明显异常。详细操作,请参见 监控管理
  4. 创建和删除测试 Pod,若 Pod 可以正常调度和终止,则表示集群和节点升级成功,且集群内业务均正常运行。
  5. (可选)若业务异常,且无法通过监控观测提示、事件、日志等说明自行修复,可提交 工单申请 获取技术支持。