更新 Amazon EKS 集群 Kubernetes 版本 - Amazon EKS

更新 Amazon EKS 集群 Kubernetes 版本

当 Amazon EKS 中有新的 Kubernetes 版本可用时,您可以将 Amazon EKS 集群更新到最新版本。

重要

升级集群后,就无法降级到以前的版本。我们建议您在更新到新的 Kubernetes 版本之前,先查看 Amazon EKS Kubernetes 版本 中的信息,同时查看此主题中的更新步骤。

新的 Kubernetes 版本有时会引入重大更改。因此,我们建议您先针对新的 Kubernetes 版本测试您应用程序的行为,然后再更新生产集群。您可以通过构建持续集成工作流来测试应用程序行为,然后再移至新的 Kubernetes 版本来执行此操作。

更新过程包含 Amazon EKS 随 Kubernetes 的更新版本推出新的 API 服务器节点,以取代现有此类节点。Amazon EKS 对这些新节点上的网络流量执行标准基础设施和就绪运行状况检查,以确认它们是否按预期工作。但是,一旦开始集群升级,就不能暂停或停止。如果任意一项检查失败,Amazon EKS 都将恢复基础设施部署,且您的集群仍为先前的 Kubernetes 版本。正在运行的应用程序不会受影响,并且您的集群绝不会处于不确定性或不可恢复的状态。Amazon EKS 会定期备份所有托管的集群,并且具有在必要时恢复集群的机制。我们会不断评估和改进我们的 Kubernetes 基础设施管理流程。

为了升级集群,Amazon EKS 需要您在创建集群时指定的子网中的最多 5 个可用的 IP 地址。Amazon EKS 在您指定的任何子网中创建新的集群弹性网络接口(网络接口)。网络接口可能在不同于现有网络接口所在的子网中创建,因此请确保您的安全组规则允许您对创建集群时指定的任何子网进行所需的集群通信。如果您在创建集群时指定的任何子网不存在,没有足够的可用 IP 地址,或者没有允许必要的集群通信的安全组规则,则更新可能会失败。

注意

为确保集群的 API 服务器端点始终可访问,Amazon EKS 提供了高度可用的 Kubernetes 控制面板,并且会在更新操作期间执行 API 服务器实例的滚动更新。由于支持 Kubernetes API 服务器端点的 API 服务器实例 IP 地址会持续变化,您必须确保您的 API 服务器客户端能够有效地管理重新连接。最新版本的 kubectl 和 Kubernetes 客户端 已经获得正式支持,能够透明地执行此重新连接过程。

更新 Amazon EKS 集群的 Kubernetes 版本

更新集群的 Kubernetes 版本的步骤
  1. 比较集群控制面板的 Kubernetes 版本与节点的 Kubernetes 版本。

    • 获取集群控制面板的 Kubernetes 版本。

      kubectl version
    • 获取您的节点的 Kubernetes 版本。此命令会返回所有自我管理和托管的 Amazon EC2 和 Fargate 节点。每个 Fargate Pod 都作为其自身的节点列出。

      kubectl get nodes

    将控制面板升级到新的 Kubernetes 版本之前,确保集群中的托管节点和 Fargate 节点的 Kubernetes 次要版本与控制面板的版本相同。例如,如果您的控制面板正在运行 1.28 版本,且其中一个节点正在运行 1.27 版本,则您必须将节点更新为 1.28 版本,然后将控制面板更新为 1.29。我们还建议您,在更新控制层面之前将自我管理节点更新为与控制层面相同的版本。有关更多信息,请参阅 更新托管节点组自行管理节点的更新:如果 Fargate 节点的次要版本低于控制面板版本,请先删除节点所表示的 Pod。然后更新您的控制面板。任何剩余的 Pods 都将在重新部署之后更新到新版本。

  2. 如果您最初部署集群所用的 Kubernetes 版本是 Kubernetes 1.25 或更高版本,请跳过此步骤。

    默认情况下,Amazon EKS 集群上会启用 Pod 安全策略准入控制器。在升级集群前,请确保已实施适当的 Pod 安全策略。这是为了避免潜在的安全问题。您可以使用 kubectl get psp eks.privileged 命令检查默认策略。

    kubectl get psp eks.privileged

    如果您收到以下错误,请参阅Amazon EKS 默认 Pod 安全策略,然后再继续操作。

    Error from server (NotFound): podsecuritypolicies.extensions "eks.privileged" not found
  3. 如果您最初部署集群所用的 Kubernetes 版本是 Kubernetes 1.18 或更高版本,请跳过此步骤。

    您可能需要从您的 CoreDNS 清单中删除已停用的术语。

    1. 检查您的 CoreDNS 清单是否有一行仅包含词语 upstream

      kubectl get configmap coredns -n kube-system -o jsonpath='{$.data.Corefile}' | grep upstream

      如果未返回任何输出,则说明您的清单没有此类行。如果是这样,请跳至下一步。如果返回了词语 upstream,则删除该行。

    2. 删除文件顶部附近在 configmap 文件中仅包含词语 upstream 的行。不要更改文件中的任何其他内容。删除该行后,保存更改。

      kubectl edit configmap coredns -n kube-system -o yaml
  4. 使用 eksctl、AWS Management Console 或 AWS CLI 更新您的集群。

    重要
    • 如果您要在集群中更新到版本 1.23 并使用 Amazon EBS 卷,请在将集群更新为版本 1.23 之前,在集群中安装 Amazon EBS CSI 驱动程序,避免中断工作负载。有关更多信息,请参阅 Kubernetes1.23Amazon EBS CSI 驱动程序

    • Kubernetes 1.24 及更高版本将 containerd 用作默认容器运行时系统。如果您要切换到 containerd 运行时系统并且已经为 Container Insights 进行了 Fluentd 配置,则必须先将 Fluentd 迁移到 Fluent Bit,然后才能更新集群。Fluentd 解析器配置为仅解析 JSON 格式的日志消息。与 dockerd 不同的是,containerd 容器运行时系统的日志消息不是 JSON 格式的。如果您不迁移到 Fluent Bit,一些配置的 Fluentd's 解析器将在 Fluentd 容器内生成大量错误。有关迁移的更多信息,请参阅将 Fluent Bit 设置为 DaemonSet 以将日志发送到 CloudWatch Logs

    • 由于 Amazon EKS 运行高度可用的控制层面,您可以一次只更新一个次要版本。有关此要求的更多信息,请参阅 Kubernetes 版本和版本偏差支持策略。假设集群的当前版本为版本 1.27,而且您想将其更新到版本 1.29。您必须先将版本 1.27 集群更新为版本 1.28,然后将版本 1.28 集群更新为版本 1.29

    • 查看节点上 Kubernetes kube-apiserverkubelet 之间的版本偏差。

      • 从 Kubernetes 版本 1.28 开始,kubelet 最多可能有三个早于 kube-apiserver 的次要版本。请参阅 Kubernetes 上游版本偏差策略

      • 如果您的托管节点和 Fargate 节点上的 kubelet 为 Kubernetes 版本 1.25 或更新版本,则无需更新 kubelet 版本即可将集群最多提前更新三个版本。例如,如果 kubelet 为版本 1.25,则可以在 kubelet 保持版本 1.25 的情况下,将您的 Amazon EKS 集群版本从 1.25 更新到 1.271.261.28

      • 如果您的托管节点和 Fargate 节点上的 kubelet 为 Kubernetes 版本 1.24 或更早版本,则最多只能有两个早于 kube-apiserver 的次要版本。换句话说,如果 kubelet 为版本 1.24 或更早的版本,则最多只能将集群提前更新两个版本。例如,如果 kubelet 为版本 1.21,则可以将您的 Amazon EKS 集群版本从 1.21 更新到 1.221.23,但是当 kubelet 保持 1.21 时,您无法将集群更新到 1.24

    • 作为开始更新之前的最佳实践,请确保节点上的 kubelet 与控制面板具有相同的 Kubernetes 版本。

    • 如果集群配置有早于 1.8.0 的 Amazon VPC CNI plugin for Kubernetes 版本,则建议您将插件更新为最新版本,然后再更新集群。要更新插件,请参阅 使用 Amazon VPC CNI plugin for Kubernetes Amazon EKS 附加组件

    • 如果您要将集群更新到版本 1.25 或更高版本并将 AWS Load Balancer Controller 部署在集群中,则在将集群版本更新为 1.25 之前,将控制器更新到版本 2.4.7 或更高版本。有关更多信息,请参阅 Kubernetes 1.25 版本注释。

    eksctl

    此过程需要 eksctl 版本 0.169.0 或更高版本。可以使用以下命令来查看您的版本:

    eksctl version

    有关安装和更新 eksctl 的说明,请参阅 eksctl 文档中的 Installation

    更新 Amazon EKS 控制面板的 Kubernetes 版本。将 my-cluster 替换为您的集群名称。将 1.29 替换为您想要将集群更新到的 Amazon EKS 支持的版本号。有关支持的版本号列表,请参阅 Amazon EKS Kubernetes 版本

    eksctl upgrade cluster --name my-cluster --version 1.29 --approve

    更新过程可能需要几分钟才能完成。

    AWS Management Console
    1. 访问 https://console.aws.amazon.com/eks/home#/clusters 打开 Amazon EKS 控制台。

    2. 选择要更新的 Amazon EKS 集群的名称,然后选择更新集群版本

    3. 对于 Kubernetes version(版本),选择集群要更新到的版本,然后选择 Update(更新)。

    4. 对于集群名称,输入您的集群的名称并选择确认

      更新过程可能需要几分钟才能完成。

    AWS CLI
    1. 使用以下 AWS CLI 命令更新 Amazon EKS 集群。将 example values 替换为您自己的值。将 1.29 替换为您想要将集群更新到的 Amazon EKS 支持的版本号。有关支持的版本号列表,请参阅 Amazon EKS Kubernetes 版本

      aws eks update-cluster-version --region region-code --name my-cluster --kubernetes-version 1.29

      示例输出如下。

      {
          "update": {
              "id": "b5f0ba18-9a87-4450-b5a0-825e6e84496f",
              "status": "InProgress",
              "type": "VersionUpdate",
              "params": [
                  {
                      "type": "Version",
                      "value": "1.29"
                  },
                  {
                      "type": "PlatformVersion",
                      "value": "eks.1"
                  }
              ],
      [...]
              "errors": []
          }
      }
    2. 使用以下命令监控集群更新的状态。使用上一命令返回的集群名称和更新 ID。当 Successful 状态显示时,更新完成。更新过程可能需要几分钟才能完成。

      aws eks describe-update --region region-code --name my-cluster --update-id b5f0ba18-9a87-4450-b5a0-825e6e84496f

      示例输出如下。

      {
          "update": {
              "id": "b5f0ba18-9a87-4450-b5a0-825e6e84496f",
              "status": "Successful",
              "type": "VersionUpdate",
              "params": [
                  {
                      "type": "Version",
                      "value": "1.29"
                  },
                  {
                      "type": "PlatformVersion",
                      "value": "eks.1"
                  }
              ],
      [...]
              "errors": []
          }
      }
  5. 集群更新完成后,将节点更新为与已更新的集群相同的 Kubernetes 次要版本。有关更多信息,请参阅 自行管理节点的更新更新托管节点组:在 Fargate 上启动的任何新 Pods 都具有与您的集群版本匹配的 kubelet 版本。不会更改现有 Fargate Pods。

  6. (可选)如果您在更新集群之前将 Kubernetes Cluster Autoscaler 部署到了集群,请将 Cluster Autoscaler 更新为与您升级后的 Kubernetes 主版本和次要版本匹配的最新版本。

    1. 在 Web 浏览器中打开 Cluster Autoscaler 版本页面,找到与您集群的 Kubernetes 主版本和次要版本相匹配的 Cluster Autoscaler 最新版本。例如,如果您集群的 Kubernetes 版本是 1.29,则查找以 1.29 开头的 Cluster Autoscaler 最新版本。记录该版本的语义版本号(例如 1.29.n)以在下一步中使用。

    2. 使用以下命令,将 Cluster Autoscaler 映像标签设置为您在上一步中记录的版本。如有必要,将 1.29.n 替换为您自己的值。

      kubectl -n kube-system set image deployment.apps/cluster-autoscaler cluster-autoscaler=registry.k8s.io/autoscaling/cluster-autoscaler:v1.29.n
  7. (仅限具有 GPU 节点的集群)如果您的集群具有支持 GPU 的节点组(例如,p3.2xlarge),则您必须在集群上更新 适用于 Kubernetes 的 NVIDIA 设备插件 DaemonSet。将 vX.X.X 替换为您需要的 NVIDIA/k8s-device-plugin 版本,然后运行以下命令。

    kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/nvidia-device-plugin.yml
  8. 更新 Amazon VPC CNI plugin for Kubernetes、CoreDNS 和 kube-proxy 附加组件。建议将附件组件更新为服务账户令牌中列出的最低版本。

    • 如果您正在使用 Amazon EKS 附加组件,请在 Amazon EKS 控制台中选择 Clusters(集群),然后在左侧导航窗格中选择您更新的集群的名称。控制台中显示通知。这些通知将告知您有一个新版本可用于每个具有可用更新的附加组件。要更新附加组件,请选择附加组件选项卡。在具有可用更新的附加组件的其中一个框中,选择立即更新,选择一个可用版本,然后选择更新

    • 此外,您也可以使用 AWS CLI 或 eksctl 更新附加组件。有关更多信息,请参阅 更新附加组件

  9. 如有必要,请更新您的 kubectl 版本。您必须使用与您的 Amazon EKS 集群控制层面不同的一个次要版本内的 kubectl 版本。例如,1.28 kubectl 客户端使用 Kubernetes 1.271.281.29 集群。您可以使用以下命令检查当前已安装的版本。

    kubectl version --client