

 **帮助改进此页面** 

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

# 定义启动时将使用 Amazon Fargate 的容器组（pod）
<a name="fargate-profile"></a>

您必须先定义至少一个 Fargate 配置文件，指定在启动时哪些容器组（pod）使用 Fargate，然后才能调度集群中的 Fargate 上的容器组（pod）。

作为管理员，您可以使用 Fargate 配置文件声明哪些容器组（pod）在 Fargate 上运行。您可以通过配置文件的选择器执行此操作。您最多可以为每个配置文件添加五个选择器。每个选择器都必须包含一个命名空间。选择器还可以包含标签。标注字段由多个可选键值对组成。与选择器匹配的容器组（pod）被安排在 Fargate 上。容器组（pod）使用选择器中指定的命名空间和标签进行匹配。如果定义了没有标签的命名空间选择器，Amazon EKS 会尝试使用配置文件将在该命名空间中运行的所有容器组（pod）调度到 Fargate。如果待调度的容器组（pod）与 Fargate 配置文件中的任意一个选择器都匹配，则该容器组（pod）将被调度到 Fargate 上。

如果容器组（pod）匹配多个 Fargate 配置文件，您可以指定容器组（pod）使用的配置文件，方法为将以下 Kubernetes 标签添加到容器组（pod）规范：`eks.amazonaws.com/fargate-profile: my-fargate-profile`。但是，容器组（pod）仍必须匹配该配置文件中的选择器，才能被调度到 Fargate 上。Kubernetes 亲和性/反亲和性规则不适用，Amazon EKS Fargate 容器组（pod）并不需要这些规则。

创建 Fargate 配置文件时，必须指定容器组（pod）执行角色。此执行角色适用于使用配置文件在 Fargate 基础设施上运行的 Amazon EKS 组件。该角色将被添加到集群的 Kubernetes [基于角色的访问控制](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)（RBAC）以进行授权。这样，Fargate 基础设施上运行的 `kubelet` 可以注册到您的 Amazon EKS 集群，并在您的集群中作为节点显示。容器组（pod）执行角色还提供对 Fargate 基础设施的 IAM 权限，以允许对 Amazon ECR 映像存储库进行读取访问。有关更多信息，请参阅 [Amazon EKS 容器组（pod）执行 IAM 角色](pod-execution-role.md)。

您无法更改 Fargate 配置文件。但是，您可以创建新的更新配置文件来替换现有配置文件，然后删除原始配置文件。

**注意**  
删除配置文件后，使用 Fargate 配置文件运行的任何容器组（pod）都会停止并进入待处理状态。

如果集群中有任何 Fargate 配置文件处于 `DELETING` 状态，您必须等待删除该 Fargate 配置文件后，才能在该集群中创建其他配置文件。

**注意**  
Fargate 目前不支持 Kubernetes [topologySpreadConstraints](https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/)。

Amazon EKS 和 Fargate 将容器组（pod）分布在 Fargate 配置文件定义的每个子网中。但是，最终可能会出现不均匀的分布。如果您必须获得均匀的分布，请使用两个 Fargate 配置文件。在您希望部署两个副本并且不希望造成任何停机的方案中，均匀的分布非常重要。我们建议每个配置文件只有一个子网。

## Fargate 配置文件组件
<a name="fargate-profile-components"></a>

Fargate 配置文件中包含以下组件。

 **Pod 执行角色**   
当您的集群在 Amazon Fargate 上创建容器组（pod）时，在 Fargate 基础设施上运行的 `kubelet` 必须代表您调用 Amazon API。例如，它需要调用才能从 Amazon ECR 提取容器镜像。Amazon EKS 容器组（pod）执行角色提供执行此操作的 IAM 权限。  
创建 Fargate 配置文件时，必须指定要用于容器组（pod）的容器组（pod）执行角色。此角色将被添加到集群的 Kubernetes [基于角色的访问控制](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)（RBAC）以进行授权。这允许在 Fargate 基础设施上运行的 `kubelet` 注册到您的 Amazon EKS 集群，以便它可以作为节点显示在您的集群中。有关更多信息，请参阅 [Amazon EKS 容器组（pod）执行 IAM 角色](pod-execution-role.md)。

 **子网**   
将容器组（pod）启动到其中的使用此配置文件的子网的 ID。目前，在 Fargate 上运行的容器组（pod）没有分配公有 IP 地址。因此，此参数仅接受私有子网（没有到互联网网关的直接路由）。

 **选择器**   
要匹配容器组（pod）以使用此 Fargate 配置文件的选择器。您最多可以在 Fargate 配置文件中指定五个选择器。选择器具有以下组件：  
+  **命名空间** – 您必须为选择器指定命名空间。选择器仅匹配在此命名空间中创建的容器组（pod）。但是，您可以创建多个选择器来定位多个命名空间。
+  **标签** – 您可以选择指定 Kubernetes 标签来匹配选择器。选择器只匹配具有在选择器中指定的所有标签的容器组（pod）。

## Fargate 配置文件通配符
<a name="fargate-profile-wildcards"></a>

除了 Kubernetes 允许的字符外，您还可以在命名空间、标签键和标签值的选择器标准中使用 `*` 和 `?`：
+  `*` 表示无、一个或多个字符。例如，`prod*` 可以表示 `prod` 和 `prod-metrics`。
+  `?` 表示单个字符（例如，`value?` 可以表示 `valuea`)。但是，它不能表示 `value` 和 `value-a`，因为 `?` 只能准确地表示一个字符。

这些通配符可以在任何位置组合使用（例如，`prod*`、`*dev` 以及 `frontend*?`)。不支持其他通配符和模式匹配形式，例如正则表达式。

如果容器组（pod）规范中有多个配置文件与命名空间和标签匹配，Fargate 会根据配置文件名称的字母数字排序来选取配置文件。例如，如果配置文件 A（名称为 `beta-workload`）和配置文件 B（名称为 `prod-workload`）都有匹配的选择器可供要启动的容器组（pod）使用，Fargate 会为容器组（pod）选取配置文件 A (`beta-workload`)。容器组（pod）具有标签，显示容器组（pod）上有配置文件 A（例如 `eks.amazonaws.com/fargate-profile=beta-workload`）。

如果要将现有 Fargate 容器组（pod）迁移到使用通配符的新配置文件中，有两种方法可执行此操作：
+ 使用匹配的选择器创建一个新的配置文件，然后删除旧的配置文件。标有旧配置文件的容器组（pod）将被重新安排到新的匹配配置文件中。
+ 若要迁移工作负载，但不确定每个 Fargate 容器组（pod）上有哪些 Fargate 标签，则可以使用以下方法。创建一个新的配置文件，首先在同一个集群上的配置文件中按字母数字排序配置文件名称。然后，回收需要迁移到新配置文件的 Fargate 容器组（pod）。

## 创建 Fargate 配置文件
<a name="create-fargate-profile"></a>

这一部分介绍如何创建 Fargate 配置文件。您还必须已经创建了要用于 Fargate 配置文件的容器组（pod）执行角色。有关更多信息，请参阅 [Amazon EKS 容器组（pod）执行 IAM 角色](pod-execution-role.md)。在 Fargate 上运行的容器组（pod）仅在私有子网上受支持（对 Amazon 服务具有 [NAT 网关](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-nat-gateway.html)访问权限，但没有到互联网网关的直接路由）。因此，您的集群的 VPC 必须有可用的私有子网。

您可以使用以下工具创建配置文件。
+  [`eksctl`](#eksctl_create_a_fargate_profile) 
+  [Amazon Web Services 管理控制台](#console_create_a_fargate_profile) 

## `eksctl`
<a name="eksctl_create_a_fargate_profile"></a>

 **使用 `eksctl` 创建 Fargate 配置文件** 

使用以下 `eksctl` 命令创建 Fargate 配置文件，并将所有示例值替换为您自己的值。您需要指定命名空间。但是，`--labels` 选项不是必选。

```
eksctl create fargateprofile \
    --cluster my-cluster \
    --name my-fargate-profile \
    --namespace my-kubernetes-namespace \
    --labels key=value
```

您可以将某些通配符用于 `my-kubernetes-namespace` 和 `key=value` 标签。有关更多信息，请参阅 [Fargate 配置文件通配符](#fargate-profile-wildcards)。

## Amazon Web Services 管理控制台
<a name="console_create_a_fargate_profile"></a>

 **使用 Amazon Web Services 管理控制台 创建 Fargate 配置文件** 

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

1. 选择要为其创建 Fargate 配置文件的集群。

1. 请选择 **Compute**（计算）选项卡。

1. 在 **Fargate profiles（Fargate 配置文件）**下，选择 **Add Fargate profile（添加 Fargate 配置文件）**。

1. 在 **Configure Fargate profile**（配置 Fargate 配置文件）页面上，执行以下操作：

   1. 对于 **Name**（名称），为 Fargate 配置文件输入唯一名称，例如 `my-profile`。

   1. 对于**容器组（pod）执行角色**，选择要用于您 Fargate 配置文件的容器组（pod）执行角色。将仅显示具有 `eks-fargate-pods.amazonaws.com` 服务委托人的 IAM 角色。如果您未看到列出的任何角色，则必须创建一个角色。有关更多信息，请参阅 [Amazon EKS 容器组（pod）执行 IAM 角色](pod-execution-role.md)。

   1. 根据需要修改选定的**子网**。
**注意**  
Fargate 上运行的容器组（pod）仅支持私有子网。

   1. 对于 **Tags（标签）**，您可以自行选择是否为 Fargate 配置文件添加标签。这些标签不会传播到与配置文件关联的其他资源，例如容器组（pod）。

   1. 选择**下一步**。

1. 在**配置容器组（pod）选择**页面上，执行以下操作：

   1. 对于**命名空间**，输入与容器组（pod）匹配的命名空间。
      + 您可以使用匹配的特定命名空间，例如 `kube-system` 或 `default`。
      + 您可以使用某些通配符（例如 `prod-*`）以匹配多个命名空间（例如，`prod-deployment` 和 `prod-test`)。有关更多信息，请参阅 [Fargate 配置文件通配符](#fargate-profile-wildcards)。

   1. （可选）将 Kubernetes 标签添加到选择器中。特别是将它们添加到指定命名空间中的容器组（pod）需要匹配的那个。
      + 您可以将标签 `infrastructure: fargate` 添加到选择器中，以便只有指定命名空间中也具有 `infrastructure: fargate` Kubernetes 标签的容器组（pod）与选择器匹配。
      + 您可以使用某些通配符（例如 `key?: value?`）以匹配多个命名空间（例如，`keya: valuea` 和 `keyb: valueb`)。有关更多信息，请参阅 [Fargate 配置文件通配符](#fargate-profile-wildcards)。

   1. 选择**下一步**。

1. 在 **Review and create（查看和创建）**页面上，查看 Fargate 配置文件的信息，然后选择 **Create（创建）**。