跳至内容

如何为我的 Amazon EKS 集群规划升级?

3 分钟阅读
0

升级 Amazon Elastic Kubernetes Service (Amazon EKS) 集群时,我想要遵循最佳实践。

解决方法

了解升级的效果

新版本的 Kubernetes 对 Amazon EKS 集群进行了大幅更改。集群升级后便无法再降级。

如果您升级到更高的 Kubernetes 版本,则无需执行就地集群升级。相反,您可以迁移到新集群。如果您迁移到新集群,则最佳做法是使用集群备份和恢复工具,例如 Velero。有关详细信息,请参阅 GitHub 网站上的 Velero

有关 Kubernetes 的当前和早期版本,请参阅 Amazon EKS Kubernetes 发布日历

满足升级要求

要升级集群,必须满足以下要求:

查看 Amazon EKS 和 Kubernetes 的重大更新

执行以下操作:

  • 查看升级版所有已记录的更改,然后记下必需的升级步骤。
  • 请注意 Amazon EKS 托管集群的所有特定要求或程序。

有关 Amazon EKS 集群平台版本和 Kubernetes 版本的重大更新的信息,请参阅以下文档:

有关 Kubernetes 上游版本和重大更新的信息,请参阅以下文档:

了解并检查已停用的 API

当 Kubernetes 升级 API 时,Kubernetes 也会移除之前的 API。

要管理已停用的 API,请执行以下操作:

  • 要了解 Kubernetes 如何在更高版本的 Kubernetes 中停用 API,请参阅 Kubernetes 网站上的 Kubernetes 弃用策略
  • 要检查集群中是否存在已停用的 API 版本,请使用 Kube No Trouble (kubent) 工具。有关详细信息,请参阅 GitHub 网站上的 kube-no-trouble。如使用的是已停用的 API 版本,请先升级工作负载,然后再升级 Kubernetes 集群。
  • 要在不同的 API 版本之间转换 Kubernetes 清单文件,请使用 kubectl convert 插件。有关详细信息,请参阅 Kubernetes 网站上的安装 kubectl convert 插件

了解 Kubernetes 的升级过程是怎样的

如果您升级集群,Amazon EKS 会使用升级后的 Kubernetes 版本启动新的 API 服务器节点来替换现有节点。Amazon EKS 还进行了一系列内部检查。如果检查失败,则 Amazon EKS 会回滚基础设施部署,集群将保留在先前的 Kubernetes 版本上。回滚不会影响正在运行的应用程序,您可以恢复集群。

**注意:**升级过程中,可能会遇到轻微的服务中断。

升级控制面板和数据面板

要升级集群,必须更新控制面板和数据面板。

要更新这些面板,请选择以下方法之一:

  • 就地集群升级
  • 蓝/绿或金丝雀升级
  • 托管节点组升级

就地集群升级

**重要事项:**就地升级时,只能升级到下一个最高的 Kubernetes 次要版本。如果您当前的集群版本和目标版本之间有多个版本,则必须依次升级到每个版本。

每次就地升级 Kubernetes 集群时,请完成以下步骤:

  1. 更新您的 Kubernetes 清单和已停用的 API。
  2. 升级集群控制面板。
  3. 升级集群中的节点。
  4. 更新您的 Kubernetes 插件和自定义控制器。

有关详细信息,请参阅 Planning Kubernetes upgrades with Amazon EKS(使用 Amazon EKS 规划 Kubernetes 升级)中的 Planning and executing Kubernetes version upgrades in Amazon EKS(在 Amazon EKS 中规划和执行 Kubernetes 版本升级)。另请参阅集群升级的最佳实践

蓝/绿或金丝雀升级

要完成蓝/绿或金丝雀升级,请参阅 Blue/green or canary Amazon EKS clusters migration for stateless ArgoCD workloads(无状态 ArgoCD 工作负载的蓝/绿或金丝雀 Amazon EKS 集群迁移)

托管节点组升级

**重要事项:**节点的 Kubelet 不能比 kube-apiserver 更新。另外,kubelet 也不能比 kube-apiserver 低两个以上的次要版本。例如,如果 kube-apiserver 的版本为 1.24,则 Amazon EKS 仅支持 1.24、1.23 和 1.22 版本的 kubelet。

要升级托管节点组,请更新托管节点组中的节点

迁移到 Amazon EKS 托管节点组

如果使用的是自主管理型节点组,则可以在不停机的情况下将工作负载迁移到 Amazon EKS 托管节点组

识别和升级下游依赖项

集群可以包含第三方插件和工具,例如入口控制器、持续交付系统、监控工具和其他工作流。如果您更新集群,还必须更新插件和第三方工具。请务必了解插件与集群的配合使用方式以及更新方式。

**注意:**最佳做法是使用托管插件而不是自主管理型插件。

请参阅以下常见插件及其相关升级文档示例:

升级 Fargate 节点

要更新 AWS Fargate 节点,请完成以下步骤:

  1. 删除您的节点代表的容器组。
  2. 更新您的控制面板。
  3. 重新部署容器组。

在 Fargate 上启动的新容器组现在都有与集群版本匹配的 kubelet 版本。升级不会影响现有的 Fargate 容器组。

**注意:**Amazon EKS 必须定期修补 Fargate 容器组以保持容器组的安全。在更新容器组时,Amazon EKS 会最大限度地减少补丁的影响。如果 Amazon EKS 无法移除容器组,则 Amazon EKS 会删除容器组。为了最大限度地减少中断,请参阅为 AWS Fargate 操作系统补丁事件设置操作

升级 Karpenter 创建的非托管节点

您为 ttlSecondsUntilExpired 设置的值将激活节点过期。在节点达到规定的寿命(以秒为单位)后,Amazon EKS 会将其删除。即使 Amazon EKS 工作负载或应用程序使用节点,也会发生删除操作。使用 ttlSecondsUntilExpired 将节点替换为新配置的实例,以便您可以升级实例。Karpenter 将最新的 Amazon EKS 优化的亚马逊机器映像 (AMI) 用于替换的节点。有关 Karpenter 如何中断节点的详细信息,请参阅 Karpenter 网站上的 Disruption(中断)

以下示例显示了一个已取消预置 ttlSecondsUntilExpired 的节点,然后替换为升级后的实例:

apiVersion: karpenter.sh/v1alpha5kind: Provisioner
metadata:
  name: default
spec:
  requirements:
    - key: karpenter.sh/capacity-type         # optional, set to on-demand by default, spot if both are listed
      operator: In
      values: ["spot"]
  limits:
    resources:
      cpu: 1000                               # optional, recommended to limit total provisioned CPUs
      memory: 1000Gi
  ttlSecondsAfterEmpty: 30                    # optional, but never scales down if not set
  ttlSecondsUntilExpired: 2592000             # optional, nodes are recycled after 30 days but never expires if not set
  provider:
        subnetSelector:
      karpenter.sh/discovery/CLUSTER_NAME: '*'
    securityGroupSelector:
      kubernetes.io/cluster/CLUSTER_NAME: '*'

**注意:**Karpenter 不会自动向 ttlSecondsUntilExpired 值添加抖动。如果您在短时间内创建多个实例,则这些实例会同时过期。为防止工作负载过度中断,请设置容器组中断预算。有关详细信息,请参阅 Kubernetes 网站上的为应用程序指定中断预算

AWS 官方已更新 4 个月前