

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 将现有集群更新到新的 Kubernetes 版本
<a name="update-cluster"></a>

**提示**  
 [注册参加](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)即将举办的 Amazon EKS 讲习会。

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

**重要**  
升级集群后，就无法降级到以前的版本。在更新到新的 Kubernetes 版本之前，建议您先查看[了解 EKS 上的 Kubernetes 版本生命周期](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)中的信息，以及本主题中的更新步骤。

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

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

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

为确保集群的 API 服务器端点始终可访问，Amazon EKS 提供了高度可用的 Kubernetes 控制面板，并且会在更新操作期间执行 API 服务器实例的滚动更新。由于支持 Kubernetes API 服务器端点的 API 服务器实例 IP 地址会持续变化，您必须确保自己的 API 服务器客户端能够有效地管理重新连接。最新版本的 `kubectl` 和 Kubernetes 客户端[库](https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/#programmatic-access-to-the-api)已经获得正式支持，能够透明地执行此重新连接过程。

**注意**  
要了解有关集群更新内容的更多信息，请参阅《EKS Best Practices Guide》中的 [Best Practices for Cluster Upgrades](https://docs.aws.amazon.com/eks/latest/best-practices/cluster-upgrades.html)。此资源有助于您规划升级，了解集群升级策略。

## Amazon EKS 自动模式的注意事项
<a name="_considerations_for_amazon_eks_auto_mode"></a>
+ Amazon EKS 自动模式的计算能力控制节点的 Kubernetes 版本。升级控制面板后，EKS 自动模式将开始逐步更新托管式节点。EKS 自动模式会遵守容器组中断预算。
+ 您无需手动升级 Amazon EKS 自动模式的功能，包括计算自动扩缩、块存储和负载均衡功能。

## 摘要
<a name="update-cluster-summary"></a>

下面简要概述了 Amazon EKS 集群升级过程：

1. 确保集群处于支持升级的状态。这包括检查部署到集群中的资源所使用的 Kubernetes API，确保集群没有任何运行状况问题。在评估集群的升级准备情况时，您应使用 Amazon EKS 升级见解。

1. 将控制面板升级到下一个次要版本（例如，从 1.34 升级到 1.35）。

1. 升级数据面板中的节点以匹配控制面板中的节点。

1. 升级集群上运行的所有其他应用程序（例如 `cluster-autoscaler`）。

1. 升级 Amazon EKS 提供的附加组件，例如默认包含的附加组件：
   +  [Amazon VPC CNI 推荐版本](managing-vpc-cni.md) 
   +  [CoreDNS 推荐版本](managing-coredns.md) 
   +  [`kube-proxy` 推荐版本](managing-kube-proxy.md) 

1. 升级与集群通信的所有客户端（例如 `kubectl`）。

## 第 1 步：准备升级
<a name="update-existing-cluster"></a>

比较集群控制层面的 Kubernetes 版本与节点的 Kubernetes 版本。
+ 获取集群控制面板的 Kubernetes 版本。

  ```
  kubectl version
  ```
+ 获取您的节点的 Kubernetes 版本。此命令会返回所有自主管理型和托管式 Amazon EC2、Fargate 和混合节点。每个 Fargate 容器组（pod）都作为其自身的节点列出。

  ```
  kubectl get nodes
  ```

将控制面板升级到新的 Kubernetes 版本之前，确保集群中的托管节点和 Fargate 节点的 Kubernetes 次要版本与控制面板的版本相同。例如，如果您的控制面板正在运行 `1.29` 版本，且其中一个节点正在运行 `1.28` 版本，则您必须将节点更新为 `1.29` 版本，然后将控制面板更新为 1.30。我们还建议在更新控制面板之前，将自主管理型节点和混合节点更新到与控制面板相同的版本。有关更多信息，请参阅 [更新集群的托管式节点组](update-managed-node-group.md)、[更新集群的自行管理型节点](update-workers.md) 和 [升级集群的混合节点](hybrid-nodes-upgrade.md)。如果 Fargate 节点的次要版本低于控制面板版本，请先删除节点所表示的容器组（pod）。然后更新您的控制面板。剩余的容器组（pod）将在重新部署之后更新到新版本。

## 第 2 步：检查升级注意事项
<a name="_step_2_review_upgrade_considerations"></a>

Amazon EKS 集群见解会根据可能影响 Kubernetes 版本升级的问题（例如已弃用的 API 使用问题）列表自动扫描集群。Amazon EKS 会根据对 Kubernetes 项目变更的评估，定期更新待执行的见解检查列表。每当 Amazon EKS 服务引入更改以及新版本后，Amazon EKS 也会更新见解检查列表。有关更多信息，请参阅 [利用集群见解为 Kubernetes 版本升级做好准备并对错误配置进行问题排查](cluster-insights.md)。

查看 Kubernetes 文档中的[已弃用 API 的迁移指南](https://kubernetes.io/docs/reference/using-api/deprecation-guide/)。

### 查看升级见解
<a name="_review_upgrade_insights"></a>

使用 Amazon EKS 升级见解来识别问题。有关更多信息，请参阅 [查看升级见解（控制台）](view-cluster-insights.md#view-upgrade-insights-console)。

### 详细注意事项
<a name="_detailed_considerations"></a>
+ 由于 Amazon EKS 运行高度可用的控制面板，您一次只能更新一个次要版本。有关此要求的更多信息，请参阅 [Kubernetes 版本和版本偏差支持策略](https://kubernetes.io/docs/setup/version-skew-policy/#kube-apiserver)。假设集群的当前版本为版本 `1.28`，而且您想将其更新到版本 `1.30`。您必须先将版本 `1.28` 集群更新为版本 `1.29`，然后将版本 `1.29` 集群更新为版本 `1.30`。
+ 查看节点上 Kubernetes `kube-apiserver` 和 `kubelet` 之间的版本偏差。
  + 从 Kubernetes 版本 `1.28` 开始，`kubelet` 最多可能有三个早于 `kube-apiserver` 的次要版本。请参阅 [Kubernetes 上游版本偏差策略](https://kubernetes.io/releases/version-skew-policy/#kubelet)。
  + 如果您的托管节点和 Fargate 节点上的 `kubelet` 为 Kubernetes 版本 `1.25` 或更新版本，则无需更新 `kubelet` 版本即可将集群最多提前更新三个版本。例如，如果 `kubelet` 为版本 `1.25`，则可以在 `kubelet` 保持版本 `1.25` 的情况下，将您的 Amazon EKS 集群版本从 `1.25` 更新到 `1.27`、`1.26` 和 `1.28`。
+ 作为开始更新之前的最佳实践，请确保节点上的 `kubelet` 与控制面板具有相同的 Kubernetes 版本。
+ 如果集群配置有早于 `1.8.0` 的适用于 Kubernetes 的 Amazon VPC CNI 插件版本，建议将插件更新为最新版本，然后更新集群。要更新插件，请参阅 [使用 Amazon VPC CNI 将 IP 分配给容器组（pod）](managing-vpc-cni.md)。
+ 您可以备份 Amazon EKS 集群，以便在升级过程中出现故障时恢复 Amazon EKS 集群状态和持久性存储。请参阅 [使用 AWS Backup 备份 EKS 集群](integration-backup.md)。

## 第 3 步：更新集群控制面板
<a name="update-cluster-control-plane"></a>

**重要**  
Amazon EKS 暂时回滚了一项功能，该功能要求您在遇到某些集群见解问题时使用 `--force` 标志升级集群。有关更多信息，请参阅 GitHub 上的 [Temporary rollback of enforcing upgrade insights on update cluster version](https://github.com/aws/containers-roadmap/issues/2570)。  
Amazon EKS 会在“上次刷新时间”后 24 小时刷新集群见解。您可以将问题解决时间与集群见解的“上次刷新时间”进行比较。  
此外，解决已弃用的 API 使用问题后，见解状态最多需要 30 天才能更新。升级见解始终会在 30 天滚动窗口内查找已弃用的 API 使用问题。

您可以使用以下方式提交升级 EKS 控制面板版本的请求：
+  [eksctl](#step3-eksctl) 
+  [AWS 控制台](#step3-console) 
+  [AWS CLI](#step3-cli) 

### 更新集群 – eksctl
<a name="step3-eksctl"></a>

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

```
eksctl version
```

有关安装和更新 `eksctl` 的说明，请参阅 `eksctl` 文档中的 [Installation](https://eksctl.io/installation)。

更新 Amazon EKS 控制面板的 Kubernetes 版本。将 `<cluster-name>` 替换为您的集群名称。将 `<version-number>` 替换为想要将集群更新到的 Amazon EKS 支持的版本号。有关支持的版本号列表，请参阅 [Amazon EKS 支持的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。

```
eksctl upgrade cluster --name <cluster-name> --version <version-number> --approve
```

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

继续[第 4 步：更新集群组件](#step4)。

### 更新集群 – AWS 控制台
<a name="step3-console"></a>

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 对于想要升级的集群，选择**立即升级**。

1. 选择要将集群更新到的版本，然后选择**升级**。

1. 更新过程可能需要几分钟才能完成。继续[第 4 步：更新集群组件](#step4)。

### 更新集群– AWS CLI
<a name="step3-cli"></a>

1. 确认已安装 AWS CLI 并且您已登录。有关更多信息，请参阅[安装或更新到最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

1. 使用以下 AWS CLI 命令更新 Amazon EKS 集群。替换要升级的集群的 `<cluster-name>` 和 `<region-code>`。将 `<version-number>` 替换为想要将集群更新到的 Amazon EKS 支持的版本号。有关支持的版本号列表，请参阅 [Amazon EKS 支持的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。

   ```
   aws eks update-cluster-version --name <cluster-name> \
     --kubernetes-version <verion-number> --region <region-code>
   ```

   示例输出如下。

   ```
   {
       "update": {
           "id": "<update-id>",
           "status": "InProgress",
           "type": "VersionUpdate",
           "params": [
               {
                   "type": "Version",
                   "value": "<version-number>"
               },
               {
                   "type": "PlatformVersion",
                   "value": "eks.1"
               }
           ],
   [...]
           "errors": []
       }
   ```

1. 更新过程可能需要几分钟才能完成。使用以下命令监控集群更新的状态。除了使用相同的 `<cluster-name>` 和 `<region-code>` 之外，还要使用上一条命令返回的 `<update-id>`。

   ```
   aws eks describe-update --name <cluster-name> \
      --region <region-code> --update-id <update-id>
   ```

   当 `Successful` 状态显示时，更新完成。

1. 继续[第 4 步：更新集群组件](#step4)。

## 第 4 步：更新集群组件
<a name="step4"></a>

1. 集群更新完成后，将节点更新为与已更新的集群相同的 Kubernetes 版本。有关更多信息，请参阅 [更新集群的自行管理型节点](update-workers.md)、[更新集群的托管式节点组](update-managed-node-group.md) 和 [升级集群的混合节点](hybrid-nodes-upgrade.md)。在 Fargate 上启动的任何新容器组（pod）都具有与您的集群版本匹配的 `kubelet` 版本。现有 Fargate Pod 不会更改。

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

   1. 在 Web 浏览器中打开 Cluster Autoscaler [版本](https://github.com/kubernetes/autoscaler/releases)页面，查找与您集群的 Kubernetes 主版本和次要版本相匹配的最新 Cluster Autoscaler 版本。例如，如果您集群的 Kubernetes 版本是 `1.30`，则查找以 `1.30` 开头的最新 Cluster Autoscaler 版本。记录该版本的语义版本号（例如 `1.30.n`）以在下一步中使用。

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

      ```
      kubectl -n kube-system set image deployment.apps/cluster-autoscaler cluster-autoscaler=registry.k8s.io/autoscaling/cluster-autoscaler:vX.XX.X
      ```

1. （仅限具有 GPU 节点的集群）如果您的集群具有支持 GPU 的节点组（例如 `p3.2xlarge`），则您必须在集群上更新[适用于 Kubernetes 的 NVIDIA 设备插件](https://github.com/NVIDIA/k8s-device-plugin) DaemonSet。将 `<vX.X.X>` 替换为您需要的 [NVIDIA/k8s-device-plugin](https://github.com/NVIDIA/k8s-device-plugin/releases) 版本，然后运行以下命令。

   ```
   kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/<vX.X.X>/deployments/static/nvidia-device-plugin.yml
   ```

1. 更新适用于 Kubernetes 的 Amazon VPC CNI 插件、CoreDNS 和 `kube-proxy` 附加组件。建议将附件组件更新为[服务账户令牌](service-accounts.md#boundserviceaccounttoken-validated-add-on-versions)中列出的最低版本。
   + 如果您正在使用 Amazon EKS 附加组件，请在 Amazon EKS 控制台中选择 **Clusters**（集群），然后在左侧导航窗格中选择您更新的集群的名称。控制台中显示通知。这些通知将告知您有一个新版本可用于每个具有可用更新的附加组件。要更新附加组件，请选择**附加组件**选项卡。在具有可用更新的附加组件的其中一个框中，选择**立即更新**，选择一个可用版本，然后选择**更新**。
   + 此外，您也可以使用 AWS CLI 或 `eksctl` 更新附加组件。有关更多信息，请参阅 [更新 Amazon EKS 附加组件](updating-an-add-on.md)。

1. 如有必要，请更新您的 `kubectl` 版本。您必须使用与 Amazon EKS 集群控制面板不同的次要版本内的 `kubectl` 版本。

## 降级 Amazon EKS 集群的 Kubernetes 版本
<a name="downgrade-cluster"></a>

无法降级 Amazon EKS 集群的 Kubernetes。而应根据之前的 Amazon EKS 版本创建一个新集群并迁移工作负载。