

 **帮助改进此页面** 

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

# 为 AWS Fargate 操作系统补丁事件设置操作
<a name="fargate-pod-patching"></a>

Amazon EKS 定期修补 AWS Fargate 节点的操作系统以确保它们的安全。作为修补过程的一部分，我们会回收节点来安装操作系统补丁。尝试更新的方式对您的服务造成的影响最小。但是，如果容器组（pod）没有成功被驱逐，有时必须删除容器组。以下是您可以采取的最大限度减少潜在中断的操作：
+ 设置适当的容器组（pod）中断预算（PDB），控制同时关闭的容器组（pod）数量。
+ 创建 Amazon EventBridge 规则，在删除容器组（pod）之前处理失败的驱逐。
+ 在您所收通知中发布的驱逐日期之前，手动重启受影响的容器组（pod）。
+ 在 AWS 用户通知中创建通知配置。

Amazon EKS 与 Kubernetes 社区密切合作，以便尽快提供错误修复和安全补丁。所有 Fargate 容器组（pod）都从最新的 Kubernetes 修补程序版本开始，可从集群的 Kubernetes 版本的 Amazon EKS 中获取。如果您的容器组（pod）具有较旧的修补程序版本，Amazon EKS 可能会回收容器组，以便将其更新到最新版本。这可以确保您的容器组（pod）配备了最新的安全更新。这样一来，如果存在关键[常见漏洞和风险](https://cve.mitre.org/)（CVE）问题，您可以随时了解最新信息以降低安全风险。

AWS Fargate 操作系统更新后，Amazon EKS 将向您发送通知，其中包含受影响的资源和即将驱逐容器组（pod）的日期。如果提供的日期不便进行驱逐，您可以在通知中于选择发布的驱逐日期之前，手动重启受影响的容器组（pod）。系统将驱逐您在收到通知之前创建的任何容器组（pod）。有关如何手动重启容器组（pod）的更多说明，请参阅 [Kubernetes 文档](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_rollout/kubectl_rollout_restart)。

要限制在回收容器组（pod）时同时停机的容器组数量，您可以设置容器组（pod）中断预算（PDB）。您可以使用 PDB 根据每个应用程序的要求定义最低可用性，同时仍允许进行更新。PDB 的最低可用性必须低于 100%。有关更多信息，请参阅 Kubernetes 文档中的[为应用程序设置干扰预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/)。

Amazon EKS 使用[驱逐 API](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/#eviction-api) 在遵守您为应用程序设置的 PDB 的同时安全地耗尽容器组（pod）。容器组（pod）被可用区驱逐出来，以最大限度地减少影响。如果驱逐成功，新容器组（pod）将获得最新的补丁，无需进一步操作。

当容器组（pod）的驱逐失败时，Amazon EKS 会向您的账户发送一个事件，其中包含驱逐失败的容器组（pod）的详细信息。您可以在计划的终止时间之前对消息采取行动。具体时间根据补丁的紧迫性而有所不同。时间一到，Amazon EKS 会尝试再次驱逐容器组（pod）。但是，如果驱逐失败，这次不会发送新的事件。如果驱逐再次失败，则会定期删除您现有的容器组（pod），以便新容器组（pod）可以拥有最新的补丁。

以下是在容器组（pod）驱逐失败时收到的示例事件。其中包含有关集群、容器组（pod）名称、容器组（pod）命名空间、Fargate 配置文件和计划终止时间的详细信息。

```
{
    "version": "0",
    "id": "12345678-90ab-cdef-0123-4567890abcde",
    "detail-type": "EKS Fargate Pod Scheduled Termination",
    "source": "aws.eks",
    "account": "111122223333",
    "time": "2021-06-27T12:52:44Z",
    "region": "region-code",
    "resources": [
        "default/my-database-deployment"
    ],
    "detail": {
        "clusterName": "my-cluster",
        "fargateProfileName": "my-fargate-profile",
        "podName": "my-pod-name",
        "podNamespace": "default",
        "evictErrorMessage": "Cannot evict pod as it would violate the pod's disruption budget",
        "scheduledTerminationTime": "2021-06-30T12:52:44.832Z[UTC]"
    }
}
```

此外，将多个 PDB 与一个容器组（pod）关联可能会导致驱逐失败事件。此事件将返回以下错误消息。

```
"evictErrorMessage": "This pod has multiple PodDisruptionBudget, which the eviction subresource does not support",
```

您可以基于此事件创建所需的操作。例如，要控制驱逐容器组（pod）的方式，您可以调整容器组（pod）中断预算（PDB）。更具体地说，假设您从指定可用容器组（pod）的目标百分比的 PDB 开始。在升级期间强制终止容器组（pod）之前，您可以将 PDB 调整为不同百分比的容器组（pod）。要接收此事件，您必须在 AWS 账户和集群所属的 AWS 区域中创建 Amazon EventBridge 规则。该规则必须使用以下**自定义模式**。有关更多信息，请参阅《Amazon EventBridge 用户指南》中的[创建对事件作出反应的 Amazon EventBridge 规则](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html)。

```
{
  "source": ["aws.eks"],
  "detail-type": ["EKS Fargate Pod Scheduled Termination"]
}
```

可以为事件设置合适的目标来捕获它。有关可用目标的完整列表，请参阅《Amazon EventBridge 用户指南》中的 [Amazon EventBridge 目标](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-targets.html)。您还可以在 AWS 用户通知中创建通知配置。使用 AWS 管理控制台创建通知时，在**事件规则**下，为 **AWS 服务名称**选择 **Elastic Kubernetes Service（EKS）**，为**事件类型**选择 **EKS Fargate 容器组（pod）计划的终止**。有关更多信息，请参阅《AWS 用户通知用户指南》中的[AWS 用户通知入门](https://docs.aws.amazon.com/notifications/latest/userguide/getting-started.html)。

有关 EKS 容器组（pod）驱逐的常见问题，请参阅 *AWS re:Post* 中的[常见问题解答：Fargate 容器组（pod）驱逐通知](https://repost.aws/knowledge-center/fargate-pod-eviction-notice)。