

 **帮助改进此页面** 

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

# 创建 Amazon EKS 附加组件
<a name="creating-an-add-on"></a>

Amazon EKS 附加组件是用于 Amazon EKS 集群的附加软件。所有 Amazon EKS 附加组件都具有以下特性：
+ 包含最新安全补丁和错误修复。
+ 经过 AWS 验证，可与 Amazon EKS 一起使用。
+ 可减少管理附加软件所需的工作量。

您可以使用 `eksctl`、AWS 管理控制台或 AWS CLI 创建 Amazon EKS 附加组件。如果附加组件需要某个 IAM 角色，请参阅 [Amazon EKS 附加组件](eks-add-ons.md)中有关特定附加组件的详细信息，以了解有关创建该角色的详细信息。

## 先决条件
<a name="creating-an-add-on-prereq"></a>

在创建附加组件之前，请完成以下步骤：
+ 集群必须已经存在，然后才能为其创建附加组件。有关更多信息，请参阅 [创建一个 Amazon EKS 集群。](create-cluster.md)。
+ 检查附加组件是否需要 IAM 角色。有关更多信息，请参阅 [验证 Amazon EKS 附加组件版本与集群的兼容性](addon-compat.md)。
+ 验证 Amazon EKS 附加组件版本是否与集群兼容。有关更多信息，请参阅 [验证 Amazon EKS 附加组件版本与集群的兼容性](addon-compat.md)。
+ 验证已在计算机或 AWS CloudShell 上安装 0.190.0 版或更高版本的 `eksctl` 命令行工具。有关更多信息，请参阅 `eksctl` 网站上的[安装](https://eksctl.io/installation/)。

## 过程
<a name="creating-an-add-on-procedure"></a>

您可以使用 `eksctl`、AWS 管理控制台或 AWS CLI 创建 Amazon EKS 附加组件。如果附加组件需要 IAM 角色，请参阅[来自 AWS 的 Amazon EKS 附加组件](workloads-add-ons-available-eks.md)中有关特定附加组件的详细信息，以了解有关创建该角色的详细信息。

## 创建附加组件（eksctl）
<a name="_create_add_on_eksctl"></a>

1. 查看某个集群版本的可用附加组件名称。将 *1.35* 替换为您的集群版本。

   ```
   eksctl utils describe-addon-versions --kubernetes-version 1.35 | grep AddonName
   ```

   示例输出如下。

   ```
   "AddonName": "aws-ebs-csi-driver",
                           "AddonName": "coredns",
                           "AddonName": "kube-proxy",
                           "AddonName": "vpc-cni",
                           "AddonName": "adot",
                           "AddonName": "dynatrace_dynatrace-operator",
                           "AddonName": "upbound_universal-crossplane",
                           "AddonName": "teleport_teleport",
                           "AddonName": "factorhouse_kpow",
                           [...]
   ```

1. 查看要创建的附加组件的可用版本。将 *1.35* 替换为您的集群版本。将 *name-of-addon* 替换为您要查看其版本的附加组件的名称。该名称必须是上一步返回的名称之一。

   ```
   eksctl utils describe-addon-versions --kubernetes-version 1.35 --name name-of-addon | grep AddonVersion
   ```

   以下输出是一个示例，显示了为名为 `vpc-cni` 的附加组件返回的内容。您可以看到该附加组件有多个可用版本。

   ```
   "AddonVersions": [
       "AddonVersion": "v1.12.0-eksbuild.1",
       "AddonVersion": "v1.11.4-eksbuild.1",
       "AddonVersion": "v1.10.4-eksbuild.1",
       "AddonVersion": "v1.9.3-eksbuild.1",
   ```

   1. 确定您要创建的附加组件是 Amazon EKS 还是 AWS Marketplace 附加组件。AWS Marketplace 具有第三方附加组件，需要您完成额外的步骤才能创建附加组件。

      ```
      eksctl utils describe-addon-versions --kubernetes-version 1.35 --name name-of-addon | grep ProductUrl
      ```

      如果未返回输出，则该附加组件是 Amazon EKS。如果返回输出，则该附加组件是 AWS Marketplace 附加组件。以下输出适用于名为 `teleport_teleport` 的附加组件。

      ```
      "ProductUrl": "https://aws.amazon.com/marketplace/pp?sku=3bda70bb-566f-4976-806c-f96faef18b26"
      ```

      您可以通过返回的 URL 在 AWS Marketplace 中了解有关该附加组件的更多信息。如果该附加组件需要订阅，您可以通过 AWS Marketplace 对其进行订阅。如果您要从 AWS Marketplace 创建附加组件，则用于创建附加组件的 [IAM 主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)必须具有创建 [AWSServiceRoleForAWSLicenseManagerRole](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager-role-core.html) 服务相关角色的权限。有关向 IAM 实体分配权限的更多信息，请参阅《IAM 用户指南》中的[添加和移除 IAM 身份权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

1. 创建 Amazon EKS 附加组件。复制该命令并替换 *user-data*，如下所示：
   + 将 *my-cluster* 替换为您的集群的名称。
   + 将 *name-of-addon* 替换为您要创建的附加组件的名称。
   + 如果您需要早于最新版本的附加组件版本，请将 *latest* 替换为前面步骤的输出中返回的适用版本号。
   + 如果附加组件使用了服务账户角色，请将 *111122223333* 替换为您的账户 ID，并将 *role-name* 替换为该角色的名称。有关为服务账户创建角色的说明，请参阅您正在创建的附加组件的文档。有关可用附加组件的列表，请参阅[AWS 附加组件](workloads-add-ons-available-eks.md)。指定服务账户角色需要您的集群具有 IAM OpenID Connect（OIDC）提供者。要确定您的集群是否具有此提供程序，或者要创建此提供程序，请参阅 [为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。

     如果附加组件不使用服务账户角色，请删除 `--service-account-role-arnarn:aws:iam::111122223333:role/role-name`。
   + 此示例命令将覆盖附加组件的任何现有自行管理版本（如果有的话）的配置。如果您不想覆盖现有的自行管理附加组件的配置，请删除 *--force* 选项。如果您删除此选项，并且 Amazon EKS 附加组件需要覆盖现有的自行管理附加组件的配置，那么创建 Amazon EKS 附加组件将会失败，并显示一条帮助您解决冲突的错误消息。在指定此选项之前，请确保 Amazon EKS 附加组件不会管理您需要管理的设置，因为这些设置会被此选项覆盖。

     ```
     eksctl create addon --cluster my-cluster --name name-of-addon --version latest \
         --service-account-role-arn arn:aws:iam::111122223333:role/role-name --force
     ```

     您可以看到该命令所有可用选项的列表。

     ```
     eksctl create addon --help
     ```

     有关可用选项的更多信息，请参阅 `eksctl` 文档中的 [Addons](https://eksctl.io/usage/addons/)（附加组件）。

## 创建附加组件（AWS 控制台）
<a name="create_add_on_console"></a>

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

1. 在左侧导航窗格中，选择**集群**。

1. 选择要为其创建此附加组件的集群名称。

1. 选择**附加组件**选项卡。

1. 选择**获取更多附加组件**。

1. 在 **Select add-ons**（选择附加组件）页面上，选择要添加到集群的附加组件。您可以根据需要添加任意数量的 **Amazon EKS 附加组**件和 **AWS Marketplace 附加组件**。

   对于 **AWS Marketplace** 附加组件，用于创建附加组件的 [IAM 主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)必须有权从 AWS LicenseManager 读取附加组件的权限。AWSLicenseManager 需要 [AWSServiceRoleForAWSLicenseManagerRole](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager-role-core.html) 服务相关角色（SLR），该角色允许 AWS 资源代表您管理许可证。SLR 是每个账户的一次性要求，您无需为每个附加组件或每个集群创建单独的 SLR。有关向 [IAM 主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)分配权限的更多信息，请参阅《IAM 用户指南》中的[添加和移除 IAM 身份权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

   如果未列出要安装的 **AWS Marketplace 附加组件**，则您可以单击页码编号查看更多页面结果或在搜索框中来搜索。在**筛选选项**中，您也可以按**类别**、**供应商**或**定价模式**进行搜索，然后从搜索结果中选择附加组件。选择要安装的附加组件后，选择**下一步**。

1. 在**配置选定的附加组件设置**页面上，执行以下操作：

   1. 选择**查看订阅选项**，打开**订阅选项**表单。查看**定价详细信息**和**法律**部分，然后选择**订阅**按钮继续。

   1. 对于**版本**，请选择要安装的版本。我们建议选择标记为**最新**的版本，除非您正在创建的个别附加组件推荐了不同的版本。要确定附加组件是否有推荐版本，请参阅您正在创建的附加组件的文档。有关可用附加组件的列表，请参阅[AWS 附加组件](workloads-add-ons-available-eks.md)。

   1. 您可以使用两个选项为附加组件配置角色：EKS 容器组身份 IAM 角色和服务账户 IAM 角色（IRSA）。按照以下相应步骤选择首选选项。如果您选择的所有附加组件在**状态**下都有**需要订阅**字样，请选择**下一步**。创建集群后，您在订阅到此类附加组件之前无法进一步[配置此类附加组件](updating-an-add-on.md)。如果附件组件的**状态**下没有**需要订阅**字样：

      1. 对于**服务账户的容器组身份 IAM 角色**，您可以使用现有 EKS 容器组身份 IAM 角色，也可以使用**创建推荐角色**按钮创建。此字段将仅提供具有适当信任策略的选项。如果没有可选择的角色，则表示没有具有匹配信任策略的现有角色。要为所选附加组件配置服务账户的 EKS 容器组身份 IAM 角色，请选择**创建推荐角色**。角色创建向导将在单独的窗口中打开。向导将自动填充角色信息，如下所示。对于要在其中创建 EKS 容器组身份 IAM 角色的各个附加组件，请如下方式完成 IAM 向导中的步骤。
         + 在**选择可信实体**步骤中，预先选择 **EKS** 的 AWS 服务选项和 **EKS – 容器组身份**的使用案例，并将自动为附加组件填充相应的信任策略。例如，该角色将使用相应的信任策略创建，该策略包含 pods.eks.amazonaws.com IAM 主体，详见[EKS 容器组身份的优势](pod-identities.md#pod-id-benefits)。选择**下一步**。
         + 在**添加权限**步骤中，系统将为附加组件预先选择角色策略的相应托管策略。例如，对于 Amazon VPC CNI 附加组件，系统将使用托管式策略 `AmazonEKS_CNI_Policy` 创建角色，详见[适用于 Kubernetes 的 Amazon VPC CNI 插件](workloads-add-ons-available-eks.md#add-ons-vpc-cni)。选择**下一步**。
         + 在**命名、查看和创建**步骤的**角色名称**中，系统将自动填充附加组件的默认角色名称。例如，对于 **Amazon VPC CNI** 附加组件，系统将使用 **AmazonEKSPodIdentityAmazonVPCCNIRole** 名称创建角色。在**描述**中，默认描述会自动填充附加组件的相应描述。例如，对于 Amazon VPC CNI 附加组件，该角色的创建描述为**允许在 Amazon EKS 集群中运行容器组（pod）** 以访问 AWS 资源。在**信任策略**中，查看为附加组件填充的信任策略。选择**创建角色**。

           注意：通过保留默认角色名称，EKS 能够在新集群中或在向现有集群添加附加组件时为附加组件预先选择角色。您仍然可以覆盖此名称，并且该角色可在您的集群中用于该附加组件，但需要从下拉列表中手动选择该角色。

      1. 对于在**状态**下没有**需要订阅**且您想使用 IRSA 配置角色的附加组件，请参阅您正在创建的附加组件的文档，以创建 IAM 策略并将其附加至角色。有关可用附加组件的列表，请参阅[AWS 附加组件](workloads-add-ons-available-eks.md)。选择 IAM 角色需要您的集群具有 IAM OpenID Connect（OIDC）提供者。要确定您的集群是否具有此提供程序，或者要创建此提供程序，请参阅[为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。

      1. 选择 **Optional configuration settings**（可选配置设置）。

      1. 如果附加组件需要配置，请在 **Configuration values**（配置值）框中输入相应的值。要确定附加组件是否需要配置信息，请参阅您正在创建的附加组件的文档。有关可用附加组件的列表，请参阅[AWS 附加组件](workloads-add-ons-available-eks.md)。

      1. 对于**冲突解决方法**，请选择一个可用的选项。如果对于**冲突解决方法**，您选择了**覆盖**，则可能会用 Amazon EKS 附加组件设置覆盖现有附加组件的一个或多个设置。如果不启用此选项，并且与现有设置存在冲突，则操作将失败。您可以使用生成的错误消息对冲突进行故障排除。在选择此选项之前，请确保 Amazon EKS 附加组件不会管理您需要自行管理的设置。

      1. 如果要将附加组件安装到特定的命名空间，请在**命名空间**字段中输入该命名空间。对于 AWS 和社区附加组件，可以定义自定义的 Kubernetes 命名空间来安装附加组件。有关更多信息，请参阅 [附加组件的自定义命名空间](eks-add-ons.md#custom-namespace)。

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

1. 在**查看和添加**页面上，选择**创建**。附加组件安装完成后，您会看到您安装的附加组件。

1. 如果您安装的任何附加组件需要订阅，请完成以下步骤：

   1. 选择该附加组件右下角的 **Subscribe**（订阅）按钮。您将转到该附加组件在 AWS Marketplace 中的页面。阅读有关该附加组件的信息，例如其 **Product Overview**（产品概述）和 **Pricing Information**（定价信息）。

   1. 选择附加组件页面右上角的 **Continue to Subscribe**（继续订阅）按钮。

   1. 通读 **Terms and Conditions**（条款和条件）。如果您同意这些条款和条件，请选择 **Accept Terms**（接受条款）。处理订阅可能需要几分钟的时间。在处理订阅时，**Return to Amazon EKS Console**（返回 Amazon EKS 控制台）按钮将显示为灰色。

   1. 订阅处理完成后，**Return to Amazon EKS Console**（返回 Amazon EKS 控制台）按钮将不再显示为灰色。选择此按钮返回集群的 Amazon EKS 控制台 **Add-ons**（附加组件）选项卡。

   1. 对于您已订阅的附加组件，请选择 **Remove and reinstall**（删除并重新安装），然后选择 **Reinstall add-on**（重新安装附加组件）。安装该附加组件可能需要几分钟的时间。安装完成后，您可以配置该附加组件。

## 创建附加组件（AWS CLI）
<a name="create_add_on_shared_aws_cli"></a>

1. 您需要在您的设备或 AWS CloudShell 上安装和配置 AWS 命令行界面（AWS CLI）的版本 `2.12.3` 或更高版本，或版本 `1.27.160` 或更高版本。要查看当前版本，请使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本，请参阅《AWS 命令行界面用户指南》**中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《AWS CloudShell 用户指南》**中的[将 AWS CLI 安装到您的主目录](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。

1. 确定哪些附加组件可用。您可以看到所有可用的附加组件及其类型和发布者。您还可以看到通过 AWS Marketplace 提供的附加组件的 URL。将 *1.35* 替换为您的集群版本。

   ```
   aws eks describe-addon-versions --kubernetes-version 1.35 \
       --query 'addons[].{MarketplaceProductUrl: marketplaceInformation.productUrl, Name: addonName, Owner: owner Publisher: publisher, Type: type}' --output table
   ```

   示例输出如下。

   ```
   ---------------------------------------------------------------------------------------------------------------------------------------------------------
   |                                                                 DescribeAddonVersions                                                                 |
   +---------------------------------------------------------------+-------------------------------+------------------+--------------+---------------------+
   |                     MarketplaceProductUrl                     |             Name              |      Owner       |  Publisher   |        Type         |
   +---------------------------------------------------------------+-------------------------------+------------------+--------------+---------------------+
   |  None                                                         |  aws-ebs-csi-driver           |  aws             |  eks         |  storage            |
   |  None                                                         |  coredns                      |  aws             |  eks         |  networking         |
   |  None                                                         |  kube-proxy                   |  aws             |  eks         |  networking         |
   |  None                                                         |  vpc-cni                      |  aws             |  eks         |  networking         |
   |  None                                                         |  adot                         |  aws             |  eks         |  observability      |
   | https://aws.amazon.com/marketplace/pp/prodview-brb73nceicv7u |  dynatrace_dynatrace-operator |  aws-marketplace |  dynatrace   |  monitoring         |
   | https://aws.amazon.com/marketplace/pp/prodview-uhc2iwi5xysoc |  upbound_universal-crossplane |  aws-marketplace |  upbound     |  infra-management   |
   | https://aws.amazon.com/marketplace/pp/prodview-hd2ydsrgqy4li |  teleport_teleport            |  aws-marketplace |  teleport    |  policy-management  |
   | https://aws.amazon.com/marketplace/pp/prodview-vgghgqdsplhvc |  factorhouse_kpow             |  aws-marketplace |  factorhouse |  monitoring         |
   |  [...]                                                        |  [...]                        |  [...]           |  [...]       |  [...]              |
   +---------------------------------------------------------------+-------------------------------+------------------+--------------+---------------------+
   ```

   您的输出可能会有所不同。在此输出示例中，有三个不同的 `networking` 类型的附加组件和五个发布者类型为 `eks` 的附加组件。在 `Owner` 列中值为 `aws-marketplace` 的附加组件可能需要订阅才能安装。您可以访问相应的 URL 以了解有关该附加组件的更多信息并进行订阅。

1. 您可以看到每个附加组件的可用版本。将 *1.35* 替换为您的集群版本，将 *vpc-cni* 替换为上一步返回的附加组件名称。

   ```
   aws eks describe-addon-versions --kubernetes-version 1.35 --addon-name vpc-cni \
       --query 'addons[].addonVersions[].{Version: addonVersion, Defaultversion: compatibilities[0].defaultVersion}' --output table
   ```

   示例输出如下。

   ```
   ------------------------------------------
   |          DescribeAddonVersions         |
   +-----------------+----------------------+
   | Defaultversion  |       Version        |
   +-----------------+----------------------+
   |  False          |  v1.12.0-eksbuild.1  |
   |  True           |  v1.11.4-eksbuild.1  |
   |  False          |  v1.10.4-eksbuild.1  |
   |  False          |  v1.9.3-eksbuild.1   |
   +-----------------+----------------------+
   ```

   默认情况下，`Defaultversion` 列中值为 `True` 的版本是创建附加组件时使用的版本。

1. （可选）通过运行以下命令查找所选附加组件的配置选项：

   ```
   aws eks describe-addon-configuration --addon-name vpc-cni --addon-version v1.12.0-eksbuild.1
   ```

   ```
   {
       "addonName": "vpc-cni",
       "addonVersion": "v1.12.0-eksbuild.1",
       "configurationSchema": "{\"$ref\":\"#/definitions/VpcCni\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"definitions\":{\"Cri\":{\"additionalProperties\":false,\"properties\":{\"hostPath\":{\"$ref\":\"#/definitions/HostPath\"}},\"title\":\"Cri\",\"type\":\"object\"},\"Env\":{\"additionalProperties\":false,\"properties\":{\"ADDITIONAL_ENI_TAGS\":{\"type\":\"string\"},\"AWS_VPC_CNI_NODE_PORT_SUPPORT\":{\"format\":\"boolean\",\"type\":\"string\"},\"AWS_VPC_ENI_MTU\":{\"format\":\"integer\",\"type\":\"string\"},\"AWS_VPC_K8S_CNI_CONFIGURE_RPFILTER\":{\"format\":\"boolean\",\"type\":\"string\"},\"AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG\":{\"format\":\"boolean\",\"type\":\"string\"},\"AWS_VPC_K8S_CNI_EXTERNALSNAT\":{\"format\":\"boolean\",\"type\":\"string\"},\"AWS_VPC_K8S_CNI_LOGLEVEL\":{\"type\":\"string\"},\"AWS_VPC_K8S_CNI_LOG_FILE\":{\"type\":\"string\"},\"AWS_VPC_K8S_CNI_RANDOMIZESNAT\":{\"type\":\"string\"},\"AWS_VPC_K8S_CNI_VETHPREFIX\":{\"type\":\"string\"},\"AWS_VPC_K8S_PLUGIN_LOG_FILE\":{\"type\":\"string\"},\"AWS_VPC_K8S_PLUGIN_LOG_LEVEL\":{\"type\":\"string\"},\"DISABLE_INTROSPECTION\":{\"format\":\"boolean\",\"type\":\"string\"},\"DISABLE_METRICS\":{\"format\":\"boolean\",\"type\":\"string\"},\"DISABLE_NETWORK_RESOURCE_PROVISIONING\":{\"format\":\"boolean\",\"type\":\"string\"},\"ENABLE_POD_ENI\":{\"format\":\"boolean\",\"type\":\"string\"},\"ENABLE_PREFIX_DELEGATION\":{\"format\":\"boolean\",\"type\":\"string\"},\"WARM_ENI_TARGET\":{\"format\":\"integer\",\"type\":\"string\"},\"WARM_PREFIX_TARGET\":{\"format\":\"integer\",\"type\":\"string\"}},\"title\":\"Env\",\"type\":\"object\"},\"HostPath\":{\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"}},\"title\":\"HostPath\",\"type\":\"object\"},\"Limits\":{\"additionalProperties\":false,\"properties\":{\"cpu\":{\"type\":\"string\"},\"memory\":{\"type\":\"string\"}},\"title\":\"Limits\",\"type\":\"object\"},\"Resources\":{\"additionalProperties\":false,\"properties\":{\"limits\":{\"$ref\":\"#/definitions/Limits\"},\"requests\":{\"$ref\":\"#/definitions/Limits\"}},\"title\":\"Resources\",\"type\":\"object\"},\"VpcCni\":{\"additionalProperties\":false,\"properties\":{\"cri\":{\"$ref\":\"#/definitions/Cri\"},\"env\":{\"$ref\":\"#/definitions/Env\"},\"resources\":{\"$ref\":\"#/definitions/Resources\"}},\"title\":\"VpcCni\",\"type\":\"object\"}}}"
   }
   ```

   输出是标准的 JSON 架构。

   以下是适用于上述架构的 JSON 格式的有效配置值示例。

   ```
   {
     "resources": {
       "limits": {
         "cpu": "100m"
       }
     }
   }
   ```

   以下是适用于上述架构的 YAML 格式的有效配置值示例。

   ```
     resources:
       limits:
         cpu: 100m
   ```

1. 确定该附加组件是否需要 IAM 权限。如果是，则需要（1）确定是否要使用 EKS 容器组身份或服务账户的 IAM 角色（IRSA），（2）确定要与附加组件一起使用的 IAM 角色的 ARN，以及（3）确定附加组件使用的 Kubernetes 服务账户的名称。有关更多信息，请参阅 [检索 Amazon EKS 附加组件的 IAM 信息](retreive-iam-info.md)。
   + 如果附加组件支持，Amazon EKS 建议使用 EKS 容器组身份。这需要[在您的集群上安装容器组身份代理](pod-identities.md)。有关将容器组身份与附加组件配合使用的更多信息，请参阅 [Amazon EKS 附加组件的 IAM 角色](add-ons-iam.md)。
   + 如果附加组件或您的集群未针对 EKS 容器组身份进行设置，请使用 IRSA。[确认您的集群上已设置 IRSA。](iam-roles-for-service-accounts.md)
   +  [审查 Amazon EKS 附加组件文档，确定该附加组件是否需要 IAM 权限以及关联 Kubernetes 服务账户的名称。](eks-add-ons.md)

     1. 创建 Amazon EKS 附加组件。将以下命令复制到您的设备。根据需要对该命令进行以下修改，然后运行修改后的命令：
   + 将 *my-cluster* 替换为您的集群的名称。
   + 将 *vpc-cni* 替换为前面步骤的输出中返回的要创建的附加组件名称。
   + 将 *version-number* 替换为前面步骤的输出中返回的要使用的版本。
   + 如果要将附加组件安装到自定义的 Kubernetes 命名空间，请添加 `--namespace-config 'namespace=<my-namespace>` 选项。此选项仅适用于 AWS 和社区附加组件。有关更多信息，请参阅 [附加组件的自定义命名空间](eks-add-ons.md#custom-namespace)。
   + 如果附加组件不需要 IAM 权限，则删除 *<service-account-configuration>*。
   + 请执行以下操作之一：
     + 如果附加组件（1）需要 IAM 权限，并且（2）集群使用 EKS 容器组身份，请将 *<service-account-configuration>* 替换为以下容器组身份关联。将 *<service-account-name>* 替换为附加组件使用的服务账户名称。将 *<role-arn>* 替换为 IAM 角色的 ARN。该角色必须拥有 EKS 容器组身份所需的信任策略。

       ```
       --pod-identity-associations 'serviceAccount=<service-account-name>,roleArn=<role-arn>'
       ```
     + 如果附加组件（1）需要 IAM 权限，并且（2）您的集群使用 IRSA，请将 *<service-account-configuration>* 替换为以下 IRSA 配置。将 *111122223333* 替换为您的账户 ID，并将 *role-name* 替换为您创建的现有 IAM 角色的名称。有关创建角色的说明，请参阅您正在创建的附加组件的文档。有关可用附加组件的列表，请参阅[AWS 附加组件](workloads-add-ons-available-eks.md)。指定服务账户角色需要您的集群具有 IAM OpenID Connect（OIDC）提供者。要确定您的集群是否具有此提供程序，或者要创建此提供程序，请参阅 [为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。

       ```
       --service-account-role-arn arn:aws::iam::111122223333:role/role-name
       ```
   + 这些示例命令将覆盖附加组件的任何现有自行管理版本（如果有的话）的 `--configuration-values` 选项。将其替换为所需配置值，例如字符串或文件输入。如果不想提供配置值，请删除 `--configuration-values` 选项。如果您不希望 AWS CLI 覆盖现有的自行管理附加组件的配置，请删除 *--resolve-conflicts OVERWRITE* 选项。如果您删除此选项，并且 Amazon EKS 附加组件需要覆盖现有的自行管理附加组件的配置，那么创建 Amazon EKS 附加组件将会失败，并显示一条帮助您解决冲突的错误消息。在指定此选项之前，请确保 Amazon EKS 附加组件不会管理您需要管理的设置，因为这些设置会被此选项覆盖。

     ```
     aws eks create-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version version-number \
          <service-account-configuration> --configuration-values '{"resources":{"limits":{"cpu":"100m"}}}' --resolve-conflicts OVERWRITE
     ```

     ```
     aws eks create-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version version-number \
         <service-account-configuration> --configuration-values 'file://example.yaml' --resolve-conflicts OVERWRITE
     ```

     有关可用选项的完整列表，请参阅 Amazon EKS Command Line Reference（《Amazon EKS 命令行参考》）中的 ` [create-addon](https://docs.aws.amazon.com/cli/latest/reference/eks/create-addon.html) `。如果您创建的附加组件在前面步骤的 `Owner` 列中的值为 `aws-marketplace`，那么创建可能会失败，您可能会收到与以下错误类似的错误消息。

     ```
     {
         "addon": {
             "addonName": "addon-name",
             "clusterName": "my-cluster",
             "status": "CREATE_FAILED",
             "addonVersion": "version",
             "health": {
                 "issues": [
                     {
                         "code": "AddonSubscriptionNeeded",
                         "message": "You are currently not subscribed to this add-on. To subscribe, visit the AWS Marketplace console, agree to the seller EULA, select the pricing type if required, then re-install the add-on"
                     }
                 ]
             }
         }
     }
     ```

     如果您收到的错误与之前输出中的错误类似，请访问前面步骤的输出中的 URL，以订阅附加组件。订阅后，再次运行 `create-addon` 命令。