

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 基于容器的产品要求 AWS Marketplace
<a name="container-product-policies"></a>

AWS Marketplace 对所有基于容器的产品和产品保持以下要求。 AWS Marketplace这些要求有助于为我们的客户推广安全、可靠和值得信赖的目录。我们还鼓励卖家审查其他控制措施和协议的实施情况，以满足其特定产品的需求。

所有产品及其相关元数据在提交时都要经过审核，以确保它们符合或超过现行 AWS Marketplace 政策。这些政策会定期更新，以适应不断变化的安全准则。 AWS Marketplace 持续扫描商品，以验证现有商品是否继续满足这些要求的任何更改。如果商品不合规， AWS Marketplace 将联系卖家更新其产品以符合新标准。在某些情况下，产品可能暂时无法向新订阅用户提供，直到问题得到解决。此过程有助于为所有用户维护 AWS Marketplace 平台的安全性和可信度。

**Topics**
+ [安全策略](#container-security-requirements)
+ [客户信息要求](#container-customer-info-requirements)
+ [产品使用要求](#container-usage-requirements)
+ [架构要求](#container-architecture-requirements)
+ [Helm 图表结构要求](#helm-chart-structure-requirements)
+ [容器产品使用说明](#container-product-usage-instructions)
+ [Amazon EKS 附加组件产品的要求](#publishing-eks-add-on)

## 安全策略
<a name="container-security-requirements"></a>

 所有基于容器的产品必须满足以下安全要求：
+ 容器镜像不得包含任何已知漏洞、恶意软件或 End-of-Life (EoL) 软件包和操作系统。
+ 容器不得请求 AWS 凭证来访问 AWS 服务。当您的产品需要访问 AWS 服务时，您必须使用以下服务之一：
  + 对于 Amazon Elastic Kubernetes Service（Amazon EKS）工作负载，使用适用于服务账户的 IAM 角色。
  + 对于 Amazon Elastic Container Service（Amazon ECS）工作负载，使用适用于任务的 IAM 角色。
+ 基于容器的产品只需要最低权限即可运行。有关更多信息，请参阅 [Amazon Elastic Container Service 中的安全](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/security.html)和 [Amazon EKS 中的安全性](https://docs.aws.amazon.com//eks/latest/userguide/security.html)。
+ 默认情况下，应将容器映像配置为以非根权限运行。
+ 容器中不得包含任何硬编码的机密，例如系统用户及服务的密码（即使经过哈希处理）、私钥、凭证等。
+ 在容器内运行的任何服务中，身份验证不得使用基于密码的方式，即使该密码由用户在启动时生成、重置或定义。同时，也不允许使用空密码和空白密码。
+ 容器映像不得包含具有不受支持架构的层（例如，in-toto Attestation Framework 元数据）。

## 客户信息要求
<a name="container-customer-info-requirements"></a>

 所有基于容器的产品必须满足以下客户信息要求：
+ 除非 BYOL（自带许可）另行要求，否则软件不得在客户不知晓且未明确同意的情况下收集或导出客户数据。收集或导出客户数据的应用程序必须遵循以下准则：
  + 客户数据收集必须是自助服务、自动化和安全的。买家无需等待卖家批准即可部署软件。
  + 客户数据的收集必须符合您与之达成的协议 AWS，包括但不限于 [AWS Marketplace 条款和条件](https://aws.amazon.com/legal/seller-terms/)、[AWS 服务条款](https://aws.amazon.com/service-terms/)、[AWS 隐私声明](https://aws.amazon.com/privacy/)和[AWS 客户协议](https://aws.amazon.com/agreement/)。
  + 不得收集付款信息。

## 产品使用要求
<a name="container-usage-requirements"></a>

 所有基于容器的产品必须满足以下产品使用要求：
+ 卖家只能发布功能齐全的产品。不允许使用用于试用或评估目的的测试版或预发行产品。如果卖家在提供免费版本后的 90 天 AWS Marketplace 内提供同等的付费版本，则支持商业软件的开发者、社区和 BYOL 版本。
+ 基于容器的产品的所有使用说明都必须包括部署基于容器的产品的所有步骤。使用说明必须提供指向 AWS Marketplace上相应容器映像的命令和部署资源。
+ 基于容器的产品必须包含订阅用户使用该软件所需的所有容器映像。此外，基于容器的产品不得要求用户使用外部的任何映像 AWS Marketplace （例如，来自第三方存储库的容器映像）启动产品。
+ 容器及其软件必须可以自助方式部署，并且不得要求额外的付款方式或费用。部署时需要外部依赖的应用程序必须遵循以下准则：
  + 必须在列表的描述或使用说明中披露该要求。例如，*此产品需要互联网连接才能正确部署。部署时会下载以下软件包：<list of package>。*
  + 卖家需对所有外部依赖的使用负责，并确保其可用性和安全性。
  + 如果外部依赖关系不再可用，则还必须从中 AWS Marketplace 删除该产品。
  + 外部依赖项不得要求额外的付款方式或费用。
+ 需要持续连接不受买方直接控制的外部资源（例如，外部资源或由卖方 APIs 或第三方 AWS 服务 管理的容器）必须遵循以下指南：
  + 必须在列表的描述或使用说明中披露该要求。例如，*此产品需要持续的互联网连接。需要以下持续的外部服务才能正常运行：<list of resources>。*
  + 卖家需对所有外部资源的使用负责，并确保其可用性和安全性。
  + 如果外部资源不再可用，则还必须从中 AWS Marketplace 移除该产品。
  + 外部资源不得要求额外的付款方式或费用，并且必须自动设置连接。
+ 产品软件和元数据不得包含将用户重定向到 AWS Marketplace中未提供的其他云平台、其他产品或追加销售服务的语言。
+ 如果您的产品是其他产品或其他 ISV 产品的附加组件，则您的产品描述必须表明它扩展了其他产品的功能，如果没有它，产品的应用将受到限制。例如，*本产品扩展了 <product name> 的功能，如果没有它，则该产品的应用将受到限制。请注意，<product name> 可能需要自己的许可才能使用此列表的全部功能。*

## 架构要求
<a name="container-architecture-requirements"></a>

 所有基于容器的产品必须满足以下架构要求：
+ 的源容器镜像 AWS Marketplace 必须推送到所拥有的亚马逊弹性容器注册表 (Amazon ECR) Container Registry 存储库。 AWS Marketplace您可以在 AWS Marketplace 管理门户 中的服务器产品下为每个容器产品列表创建这些存储库。
+ 容器映像必须基于 Linux。
+ 付费版基于容器的产品必须能够部署在 [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html)、[Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) 或 [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html) 中。
+ 具有合同定价和集成的基于容器的付费产品 AWS License Manager 应部署在亚马逊 EKS、Amazon ECS、Amazon EKS Anywhere AWS Fargate、Amazon ECS Anywhere、Amazon ECS Anywhere、红帽 OpenShift 服务 AWS (ROSA)、本地自行管理的 Kubernetes 集群或亚马逊弹性计算云上。
+ 对于 Helm 图表类产品，容器映像引用必须按照 [Helm 图表结构要求](#helm-chart-structure-requirements)进行构建，以支持跨区域部署。
+ 如果您的基于容器的产品要求买家部署亚马逊系统映像 (AMI)，则该映像必须是 AWS托管的 AMI 或中发布的单独的 AMI。 AWS Marketplace如果您在中发布自己的 AMI AWS Marketplace，则它必须符合，[基于 AMI 的产品要求 AWS Marketplace](product-and-ami-policies.md)并且必须按照中的要求表明它是附加产品[产品使用策略](product-and-ami-policies.md#product-usage)。您可以将基于 AMI 的产品定价为 BYOL，因为它是基于容器的产品的扩展。 AWS Marketplace 扫描基于 AMI 的产品中是否存在未修补的常见漏洞和漏洞 (CVEs) 以及安全要求。您的买家还必须先订阅您的基于 AMI 的产品，然后再进行部署。

## Helm 图表结构要求
<a name="helm-chart-structure-requirements"></a>

提交给的所有Helm chart产品都 AWS Marketplace 必须遵守以下结构要求，以确保适当的区域化和跨 AWS 区域部署：
+ 容器映像引用必须仅在 `values.yaml` 文件中定义，不得在 Helm 图表内的其他任何文件中硬编码。这样可以在将产品复制 AWS Marketplace 到不同地区时自动替换这些参考文献。
+ 该`values.yaml`文件必须为所有容器镜像引用使用变量。
+ 或者，您可以拆分`tag`为`registry`与存储库相同级别的单独字段，以建立您的图像引用。
+ Helm 模板必须使用标准 Helm 模板语法（例如 `{{ .Values.image.repository }}:{{ .Values.image.tag }}`）来引用这些变量。
+ 避免在模板中使用会绕过 `values.yaml` 中定义的映像引用的条件逻辑。
+ 在使用不同 AWS 区域测试 Helm 图表时，请确保`values.yaml`正确更改区域会更新已部署资源中的所有图像引用。

AWS Marketplace 验证在产品提交过程中，`values.yaml`文件中是否正确定义了所有容器图片引用。不符合这些要求的产品将被拒绝。

### Helm 图表中对容器镜像参考的要求
<a name="helm-chart-best-practices"></a>

以下内容演示了在 Helm 图表中构造容器镜像引用的方法：

**`values.yaml`（建议的格式）：**

```
image:
  registry: "709825985650.dkr.ecr.us-east-1.amazonaws.com"
  repository: "accuknox/kubearmor"
  tag: "v1.1.1"
```

**注意**  
我们建议您在 `values.yaml` 文件结构中采用上述方法，但以下替代方案同样有效。

**`values.yaml`（替代格式）：**

```
image:
  repository: "709825985650.dkr.ecr.us-east-1.amazonaws.com/guance/datakit"
  tag: "1.0"
```

**`values.yaml`（替代格式）：**

```
image:
  repository: "709825985650.dkr.ecr.us-east-1.amazonaws.com/guance/datakit:1.0"
```

**注意**  
对于部署模板，以下格式是唯一可用的有效格式。

**部署模板：**

```
containers:
- name: kubearmor
  image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag }}"
```

**错误方式（请勿使用）：**

```
containers:
- name: kubearmor
  image: "709825985650.dkr.ecr.us-east-1.amazonaws.com/accuknox/kubearmor:v1.1.1"
```

### 可能的 Helm 图表验证错误
<a name="helm-chart-validation-errors"></a>

在产品提交过程中， AWS Marketplace 对 Helm chart 产品进行验证检查，以确保符合容器图像参考要求。如果您的 Helm 图表不符合这些要求，则可能会遇到以下验证错误：


| 错误 | 说明 | 
| --- | --- | 
| INCOMPATIBLE\$1HELM\$1OBJECTS | EKS 插件不支持指定的 Helm 对象。请参阅[Amazon EKS 附加组件产品的要求](#publishing-eks-add-on)。 | 
| INVALID\$1DEPENDENT\$1HELM\$1CHARTS | 依赖的 Helm 图表必须包含在父图表目录中，而不是外部来源。 | 
| INVALID\$1HELM\$1SENSITIVE\$1CONFIG | 配置架构不能包含收集敏感信息的字段。配置架构不得接受密码、API 密钥、证书或机密。相反，请为客户单独创建的 Kubernetes 密钥提供字段。 | 
| INVALID\$1HELM\$1CHART\$1IMAGES | 所有映像（包括开源依赖项）都必须推送到通过 “[添加存储库” 请求创建的 AWS Marketplace Amazon ECR 存储库](container-add-version.md#add-repositories)。 | 
| INVALID\$1HELM\$1UNDECLARED\$1IMAGES | 必须在 “[添加版本](container-add-version.md#add-new-version)” 请求中明确列出所有容器镜像引用。 | 
| INVALID\$1HELM\$1LINT | Helm 图表helm lint验证失败。helm lint在本地运行以识别和修复结构或语法问题。使用 Helm 版本3.19.0或更高版本。 | 
| INVALID\$1HELM\$1TEMPLATE | Helm 图表helm template验证失败。该图表无法转换为有效的 Kubernetes 清单。使用本地测试helm template以识别模板语法或逻辑错误。使用 Helm 版本3.19.0或更高版本。 | 
| MISSING\$1HELM\$1DEPLOYMENT\$1CONFIG | Amazon EKS 附加组件的 Helm 图表必须包含部署或 DaemonSet 资源。Amazon EKS 至少需要其中一种工作负载类型才能进行附加组件生命周期管理。请参阅[Amazon EKS 附加组件产品的要求](#publishing-eks-add-on)。 | 
| INCOMPATIBLE\$1CONFIGURATION\$1SCHEMA\$1VERSION | 不支持中的 JSON 架构版本。aws\$1mp\$1configuration\$1schema.json[架构要求](#schema-requirements)有关支持的架构版本，请参阅。 | 
| INVALID\$1IMAGE\$1REFERENCE | 所有图像都必须定义为变量，values.yaml并使用 Helm 模板语法进行引用，如中所述[Helm 图表结构要求](#helm-chart-structure-requirements)。 | 
| MISSING\$1VALUES\$1IMAGE\$1REFERENCE | 每个容器镜像引用中都必须有相应的条目values.yaml。 | 
| MISSING\$1IMAGE\$1TAG | 中的容器图像引用values.yaml必须包含明确的标签值或默认为图表版本Chart.yaml。 | 

## 容器产品使用说明
<a name="container-product-usage-instructions"></a>

在为容器产品创建使用说明时，请按照[为创建 AMI 和容器产品使用说明 AWS Marketplace](ami-container-product-usage-instructions.md)中的步骤和指导进行操作。

### Helm 图表使用说明
<a name="helm-chart-usage-instructions"></a>

为 Helm 图表产品创建使用说明时：
+ 清楚记录 `values.yaml` 文件中的所有可配置参数，包括映像仓库、标签及注册表参数。
+ 提供有关如何在安装 Helm 图表时覆盖这些参数的示例。
+ 不得指导用户修改 `values.yaml` 以外的任何文件，也不得指导用户在安装图表时使用 `--set` 参数。
+ 包含关于产品如何处理容器映像区域化策略的信息。

## Amazon EKS 附加组件产品的要求
<a name="publishing-eks-add-on"></a>

Amazon EKS 附加组件是为 Kubernetes 应用程序提供操作功能的软件，但并不特定于应用程序。例如，Amazon EKS 附加组件包括可观察性代理或Kubernetes驱动程序，允许集群与用于联网、计算和存储的底层 AWS 资源进行交互。

作为容器产品的卖家，您可以从多个部署选项（包括 Amazon EKS）中进行选择。您可以将产品版本作为 AWS Marketplace 附加组件发布到 Amazon EKS 附加组件目录中。您的附加组件显示在 Amazon EKS 控制台中，旁边是其他供应商维护 AWS 的插件。您的买家可以将您的软件作为附加组件部署，就像部署其他附加组件一样简单。

有关更多信息，请参阅《Amazon EKS 用户指南》**中的 [Amazon EKS 附加组件](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html)。

### 将您的容器产品作为 AWS Marketplace 附加组件进行准备
<a name="preparing-eks-addon"></a>

要将您的容器产品作为 AWS Marketplace 插件发布，它必须满足以下要求：
+ 您的集装箱商品必须发布在 AWS Marketplace。
+ 您的容器产品必须与 ARM64架构 AMD64 兼容。
+ 您的容器产品不得使用自带许可 (BYOL) [定价模式](https://docs.aws.amazon.com/marketplace/latest/userguide/pricing-container-products.html)。
**注意**  
Amazon EKS 附加组件交付不支持 BYOL。
+ 您必须遵守所有[基于容器的产品要求](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-policies.html)，包括将所有容器图像和Helm图表推送到托管 AWS Marketplace Amazon ECR 存储库。这项要求包括开源映像，例如，`nginx`。图像和图表不能托管在其他外部存储库中，包括但不限于 [Amazon ECR 公开映像浏览馆](https://docs.aws.amazon.com/AmazonECR/latest/public/public-repositories.html)、Docker Hub 和 Quay。
+ **Helm 图表** - 准备软件并将其打包为 Helm 图表。Amazon EKS 附加组件框架可将 Helm 图表转换为 Kubernetes 清单。Amazon EKS 系统不支持某些 Helm 功能。以下列表描述了将您的软件作为 Amazon EKS 附加组件接入之前必须满足的各项要求。在此列表中，所有Helm命令都使用Helm版本 3.19.0：
  + 支持所有`Capabilities`对象，但有例外`.APIVersions`。 `.APIVersions`不支持 non-built-in自定义Kubernetes APIs。
  + 仅支持 ```Release.Name` 和 `Release.Namespace` 对象。
  + 不支持 Helm 钩子和 `lookup` 函数。
  + 所有相关图表都必须位于主 Helm 图表中（使用存储库路径 file://... 指定）。
  + Helm 图表必须成功通过 Helm Lint 和 Helm 模板且无错误。命令如下：
    + Helm Lint – `helm lint helm-chart`

      常见问题包括父图表元数据中未声明的图表。例如，`chart metadata is missing these dependencies: chart-base Error: 1 chart(s) linted, 1 chart(s) failed`
    + Helm 模板 – `helm template chart-name chart-location --set k8version=Kubernetes-version --kube-version Kubernetes-version --namespace addon-namespace --include-crds --no-hooks -f any-overriden-values`

      使用 `-f` 标志传递任何被覆盖的配置。
  + 将所有容器二进制文件存储在 AWS Marketplace Amazon ECR 存储库中。要创建清单，请使用前面显示的 Helm 模板命令。在清单中搜索任何外部映像引用，例如 `busybox` 或 `gcr` 映像。使用请求下拉列表中的 “**添加存储库” 选项创建的 AWS Marketplace Amazon ECR 存储库将所有容器映像和依赖项上传到创建的 Amazon ECR 存储库**中。
+ **自定义配置** - 您可以在部署期间添加自定义变量。有关如何识别最终用户体验、将软件命名为 `aws_mp_configuration_schema.json` 以及打包为带有 Helm 图表的包装器的信息，请参阅 [Amazon EKS add-ons: Advanced configuration](https://aws.amazon.com/blogs/containers/amazon-eks-add-ons-advanced-configuration/)。

  根据[“\$1schema”关键字](https://json-schema.org/draft/2020-12/json-schema-core#name-the-schema-keyword)，`$schema` 必须是指向有效 `application/schema+json` 资源的 URI。

  此文件不得接受任何敏感信息，例如密码、许可证密钥和证书。

  要处理密钥和证书安装，您可以向最终用户提供 pre-Add-on安装后或安装步骤。产品不应依赖任何外部许可证。产品应基于 AWS Marketplace 权利运行。

  有关 `aws_mp_configuration_schema.json` 限制的更多信息，请参阅 [附加组件配置要求和附加组件提供商的最佳做法](#eks-addon-configuration)。
+ **确定并创建要在其中部署软件的命名空间** - 在产品的第一个版本中，您必须通过添加模板化命名空间来确定要在其中部署软件的命名空间。
+ **自定义资源定义 (CRDs)** — Amazon EKS 插件框架不支持安装 CRDs和基于 CRDs 应用于同一插件的自定义资源声明。如果您的插件有自定义资源并且依赖于此 CRDs，则您可以：
  + **发布两个附加组件：**将 CRD 定义拆分为一个单独的附加组件（单独的 Helm 图表），并将实际的[自定义资源](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/)安装拆分为一个单独的附加组件。
  + **发布带有其他手动说明的单个插件：**发布一个 CRDs 在集群上安装的插件。提供使用说明以及 kubernetes 清单文件，供最终用户设置依赖这些文件的自定义资源。 CRDs
+ **`serviceAccount`如果适用，请创建** — 如果该软件是付费软件 AWS Marketplace 或者必须与其他软件连接 AWS 服务，请确保Helm图表是`serviceAccount`默认创建的。如果 `serviceAccount` 创建由 `values.yaml` 文件中的参数处理，请将参数值设置为 `true`。例如 `serviceAccount.create = true`。这是必需操作，因为客户可能会选择通过沿用已具有所需权限的底层节点实例中的权限来安装附加组件。如果 Helm 图表未创建 `serviceAccount`，则无法将权限绑定到 `serviceAccount`。
+ **可追踪的部署或 Daemonset** - 确保您的 Helm 图表有 Daemonset 或部署。Amazon EKS 附加组件框架使用它们跟踪您的 Amazon EKS 资源的部署。如果没有可追踪的部署或 Daemonset，您的附加组件将面临部署错误。如果您的附加组件没有部署或 Daemonset，例如，如果您的附加组件部署了一堆无法追踪的自定义资源或 Kubernetes 作业，请添加虚拟部署或 Daemonset 对象。
+ **支持 AMD 和 ARM 架构** — ARM64 如今，许多 Amazon EKS 客户都在使用 AWS Graviton 实例。第三方软件必须同时支持这两种架构。
+ **与许可或计量集 APIs 成 AWS Marketplace** — AWS Marketplace 支持多种计费模式。有关更多信息，请参阅 [容器产品计费、计量和许可集成](container-products-billing-integration.md)。如果您想通过 PAYG 机制销售产品，请参阅[使用 AWS Marketplace Metering Service 对容器产品配置自定义计量](container-metering-meterusage.md)。如果您想通过预付模式或合同模式销售产品，请参阅 [集装箱产品的合同定价 AWS License Manager](container-license-manager-integration.md)。
+ **上传软件以及所有构件和依赖项** - Helm 图表必须是独立的，并且不需要从外部来源（如 GitHub）获取依赖项。如果软件需要外部依赖项，则必须将依赖项推送到同一 AWS Marketplace 列表下的 AWS Marketplace 私有 Amazon ECR 存储库。
+ **在您的网站上提供部署说明** - 我们要求您为客户提供一份部署指南，说明如何通过 [create-addon](https://docs.aws.amazon.com/cli/latest/reference/eks/create-addon.html) 命令部署软件。
+ **附加 permissions/IAM 角色** — 如果从发布的插件 AWS Marketplace 需要访问 AWS 服务，则您的软件应有一个带有 IAM 策略注释的 Kubernetes 服务账户才能访问服务。 AWS 您可以从两个选项中进行选择，让您的服务帐号向 AWS 服务发出 API 请求：
  + 通过 IRSA 获取凭证：此选项允许软件从身份和访问管理（IAM）角色服务（IRSA）获取代入凭证。有关更多信息，请参阅[服务账户的 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html)。
  + Amazon EKS 容器身份：此选项允许您的软件使用亚马逊 EKS 容器的 Pod 身份向 AWS 服务发出 API 请求。有关更多信息，请参阅[了解 EKS Pod Identity 如何授予 pod 访问 AWS 服务的](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html)权限

  您的附加组件必须在 Helm 图表的顶层目录（即与当前自定义配置架构文件 `aws_mp_configuration_schema.json` 所在的同一目录）中，额外添加一个名为 `aws_mp_addon_parameters.json` 的配置文件。目前，该文件仅用于处理与容器组（pod）身份兼容的权限配置。文件格式如下：

  ```
  {
    "permissions": {
        "isPodIdentityCompatible" : true,
        "permissionsList": [
         {
          "serviceAccount" : "String",
          "managedPolicies" : ["Policy Arn"],
         }
       ]
      }
    }
  ```

  **文件名：`aws_mp_addon_parameters.json`**
**注意**  
`aws_mp_addon_parameters.json` 文件可在 Amazon EKS 控制台的**附加组件配置设置**页面中启用**附加组件访问权限**部分    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/marketplace/latest/userguide/container-product-policies.html)
**注意**  
Pay-as-you-go 来自的 (PAYG) 附加产品 AWS Marketplace 无法使用 Amazon EKS Pod 身份，必须使用服务账户的 IAM 角色 (IRSA) 进行访问控制。
+ **版本更新** - Amazon EKS 会在上游版本发布几周后发布新的 Kubernetes 版本。随着新的 Amazon EKS 集群版本正式发布，供应商有 45 天的时间来认证或更新其软件，使其与新的 Amazon EKS 集群版本兼容。如果您当前版本的附加组件支持新的 Kubernetes 版本，请对其进行验证和认证，以便我们更新版本兼容性矩阵。如果需要新的附加组件版本来支持新的 Kubernetes 版本，则请提交新版本以便载入。
+ 合作伙伴的软件必须属于以下类型之一，或者是能够增强 Kubernetes 或 Amazon EKS 的操作软件：Gitops \$1 监控 \$1 日志 \$1 证书管理 \$1 策略管理 \$1 成本管理 \$1 自动扩展 \$1 存储 \$1 kubernetes 管理 \$1 服务网格 \$1 etcd-backup \$1 \$1 负载均衡器 \$1 本地注册表\$1 网络 \$1 安全 \$1 备份 \$1 入口控制器 \$1 可观察性 ingress-service-type
+ 软件不能是[容器网络接口（CNI）](https://github.com/containernetworking/cni)。
+ 软件必须通过付费产品销售 AWS Marketplace 并与许可和计 APIs 量功能集成。不接受 BYOL 产品。

### 附加组件配置要求和附加组件提供商的最佳做法
<a name="eks-addon-configuration"></a>

Amazon EKS 要求附加组件提供商以 [Helm JSON 架构](https://helm.sh/docs/topics/charts/#schema-files)字符串的形式进行配置。需要必需配置或允许可选配置的插件必须包含已提交 Helm Chart 的`aws_mp_configuration_schema.json`文件。 AWS Marketplace Amazon EKS 将使用此架构来验证客户的配置输入，并拒绝输入值不符合该架构的 API 调用。附加组件配置通常分为两类：
+ 一般 Kubernetes 属性的配置，例如标签、容忍度、nodeSelector 等
+ 特定于附加组件的配置，例如许可证密钥 URLs、功能启用等。

本部分重点介绍与一般 Kubernetes 属性相关的第一类。

Amazon EKS 建议遵循有关配置 Amazon EKS 附加组件的最佳实践。
+ [架构要求](#schema-requirements)
+ [允许配置的常用参数](#parameters-allowed)
+ [不允许配置的常用参数](#parameters-not-available)

#### 架构要求
<a name="schema-requirements"></a>

定义 JSON 架构时，请确保您使用的是 Amazon EKS 附加组件支持的 jsonschema 版本。

支持的架构列表：
+ https://json-schema。 org/draft-04/schema
+ https://json-schema。 org/draft-06/schema
+ https://json-schema。 org/draft-07/schema
+ https://json-schema。 org/draft/2019-09/schema

使用任何其他 JSON 架构版本都与 Amazon EKS 附加组件不兼容，并且会导致该附加组件在问题得到解决之前无法发布。

**Helm 架构文件示例**

```
{
"$schema": "http://json-schema.org/schema#",
  "type": "object",
  "properties": {
"podAnnotations": {
"description": "Pod Annotations"
"type": "object"
    },
    "podLabels": {
"description": "Pod Labels"
"type": "string"
    },
    "resources": {
"type": "object"
"description": "Resources"
    },
    "logLevel": {
"description": "Logging Level"
"type": "string",
      "enum": [
        "info",
        "debug"
      ]
    },
    "config": {
"description": "Custom Configuration"
"type": "object"
    }
  }
}
```

**camelCase**  
配置参数必须采用 camelCase 格式，如果不符合此格式，则会被拒绝。

**描述为必填项**  
务必包含对架构属性的有意义的描述。此描述将用于在 Amazon EKS 控制台中为每个配置参数呈现标签名称。

**RBAC 定义**  
附加组件提供商需要根据最低权限原则，定义和提供成功安装附加组件所需的 RBAC 权限。如果需要针对新版本的附加组件或任何解决 CVE 问题的修复而更改 RBAC 权限，则附加组件提供商需要将此更改告知 Amazon EKS 团队。每个 Kubernetes 资源所需的权限应仅限于对象的资源名称。  

```
apiGroups: ["apps"]
resources: ["daemonsets"]
resourceNames: ["ebs-csi-node"]
verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
```

**密钥管理**  
本部分仅适用于需要客户配置机密信息（如应用程序密钥、API 密钥、密码等）的附加组件。由于存在安全隐患，Amazon EKS 目前 APIs 不支持以纯文本形式传递机密信息。但是，客户可以使用配置来传入包含附加组件所需密钥的 Kubernetes Secret 的名称。客户需要创建包含密钥的 Kubernetes Secret 对象，其命名空间与先决条件步骤中的相同，然后在创建附加组件时使用配置 blob 传入机密的名称。我们建议附加组件提供商为架构属性命名，这样客户就不会意外将其误认为是实际密钥。例如： appSecretName， connectionSecretName 等等。  
总之，附加组件提供商可以利用该架构，让客户传入机密的名称，但不允许传入实际持有机密的密钥。

**示例配置值**  
您可以在架构中包含配置示例，以帮助客户配置附加组件。以下示例来自 AWS Distro 的 OpenTelemetry 插件架构。  

```
"examples": [
      {
        "admissionWebhooks": {
          "namespaceSelector": {},
          "objectSelector": {}
        },
        "affinity": {},
        "collector": {
          "amp": {
            "enabled": true,
            "remoteWriteEndpoint": "https://aps-workspaces.us-west-2.amazonaws.com/workspaces/ws-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/api/v1/remote_write"
          },
          "cloudwatch": {
            "enabled": true
          },
          "mode": "deployment",
          "replicas": 1,
          "resources": {
            "limits": {
              "cpu": "256m",
              "memory": "512Mi"
            },
            "requests": {
              "cpu": "64m",
              "memory": "128Mi"
            }
          },
          "serviceAccount": {
            "annotations": {},
            "create": true,
            "name": "adot-collector"
          },
          "xray": {
            "enabled": true
          }
        },
        "kubeRBACProxy": {
          "enabled": true,
          "resources": {
            "limits": {
              "cpu": "500m",
              "memory": "128Mi"
            },
            "requests": {
              "cpu": "5m",
              "memory": "64Mi"
            }
          }
        },
        "manager": {
          "env": {},
          "resources": {
            "limits": {
              "cpu": "100m",
              "memory": "128Mi"
            },
            "requests": {
              "cpu": "100m",
              "memory": "64Mi"
            }
          }
        },
        "nodeSelector": {},
        "replicaCount": 1,
        "tolerations": []
      }
    ]
```

#### 允许配置的常用参数
<a name="parameters-allowed"></a>

以下是面向客户的 Helm 架构文件中的建议参数。


| 参数 | 说明 | 是否应该有默认值？ | 
| --- | --- | --- | 
| additionalLabels | 向附加组件管理的所有 Kubernetes 对象添加 Kubernetes 标签。 | 否 | 
| additionalAnnotations | 向附加组件管理的所有 Kubernetes 对象添加 Kubernetes 注释。 | 否 | 
| podLabels | 向附加组件管理的容器组（pod）添加 Kubernetes 标签。 | 否 | 
| podAnnotations | 向附加组件管理的容器组（pod）添加 Kubernetes 注释。 | 否 | 
| logLevel | 附加组件管理的组件的日志级别。 | 是 | 
| nodeSelector | 建议的最简单的节点选择约束形式。您可以在容器组（pod）规范中添加 nodeSelector 字段，并指定希望目标节点具有的节点标签。 | 例如，可能仅限 Linux 节点 | 
| tolerations | 容忍度适用于容器组（pod）。容忍度允许调度器调度带有匹配污点的容器组（pod）。容忍度允许调度，但不能保证调度。 | 也许，在 DaemonSet 中更常见 | 
| affinity | 亲和性功能由两种类型的亲和性组成：节点亲和性，功能类似于 nodeSelector 字段，但更具表现力，可使您指定软规则；容器组（pod）间亲和性/反亲和性，允许您针对其他容器组（pod）上的标签对容器组（pod）进行约束。 | 也许 | 
| topologySpreadConstraints | 您可以使用拓扑分布约束来控制容器组（pod）在集群内故障域（如区域、可用区、节点和其他用户定义的拓扑域）间的分布方式。这有助于实现高可用性以及高效的资源利用率。 | 也许 | 
| resource request/limits | 指定 cpu/memory 每个容器需要多少。强烈建议设置请求。可选择设置限制。 | 是 | 
| replicas | 附加组件管理的容器组（pod）的副本数量。不适用于 Daemonset。 | 是 | 

**注意**  
对于工作负载调度配置参数，您可能需要在必要时将架构中的顶级组件分开。例如，Amazon EBS CSI 驱动程序包含两个主要组件，即控制器和节点代理，客户需要 selectors/tolerations 为每个组件使用不同的节点。

**注意**  
JSON 架构中定义的默认值仅用于用户文档目的，并不能取代在 `values.yaml` 文件中使用正确默认值的必要性。如果使用该默认属性，请确保 `values.yaml` 中的默认值与架构中的默认值相匹配，并且每当对 Helm 图表进行更改时，两个构件（`values.schema.json` 和 `values.yaml`）都保持同步。

```
"affinity": {
            "default": {
              "affinity": {
                "nodeAffinity": {
                  "preferredDuringSchedulingIgnoredDuringExecution": [
                    {
                      "preference": {
                        "matchExpressions": [
                          {
                            "key": "eks.amazonaws.com/compute-type",
                            "operator": "NotIn",
                            "values": [
                              "fargate"
                            ]
                          }
                        ]
                      },
                      "weight": 1
                    }
                  ]
                },
                "podAntiAffinity": {
                  "preferredDuringSchedulingIgnoredDuringExecution": [
                    {
                      "podAffinityTerm": {
                        "labelSelector": {
                          "matchExpressions": [
                            {
                              "key": "app",
                              "operator": "In",
                              "values": [
                                "ebs-csi-controller"
                              ]
                            }
                          ]
                        },
                        "topologyKey": "kubernetes.io/hostname"
                      },
                      "weight": 100
                    }
                  ]
                }
              }
            },
            "description": "Affinity of the controller pod",
            "type": [
              "object",
              "null"
            ]
          }
```

### 不允许配置的常用参数
<a name="parameters-not-available"></a>

各种附加组件（例如 Elastic Load Balancing Controller）可能需要集群元数据参数，例如 `clusterName`、`region`、`vpcId`、`accountId` 和其他参数。Amazon EKS 服务已知的任何与这些参数相似的参数都将由 Amazon EKS 附加组件自动注入，用户无需负责指定为配置选项。这些参数包括：
+ AWS 区域
+ Amazon EKS 集群名称
+ 集群的 VPC ID
+ 容器注册表，专门用于 build-prod 账户，供网络附加组件使用
+ DNS 集群 IP，专门用于 coredns 附加组件
+ Amazon EKS 集群 API 端点
+ IPv4 已在集群上启用
+ IPv6 已在集群上启用
+ 在集群上 IPv6 启用的前缀委派

附加组件提供商需要确保您已为此类适用参数定义了模板。上述每个参数都将有一个由 Amazon EKS 定义的预定义 `parameterType` 属性。版本元数据将指定模板中参数 name/path 的`parameterType`和之间的映射。这样，Amazon EKS 就可以动态传入这些值，而无需客户通过配置进行指定，还可以让附加组件提供商灵活地定义自己的模板名称/路径。应从架构文件中排除 Amazon EKS 需要动态注入的上述参数。

**来自版本元数据的映射示例**

```
"defaultConfiguration": [
       {
            "key": "image.containerRegistry",
            "parameterType": "CONTAINER_REGISTRY"
       }
]
```

不建议在面向客户的 Helm 架构文件中配置以下参数。这些参数要么应具有不可修改的默认值，要么根本不包含在附加组件模板中。


| 参数 | 说明 | 是否应该有默认值？ | 
| --- | --- | --- | 
| image | 将部署在 Kubernetes 集群上的容器映像。 | 否，通过附加组件定义进行管理 | 
| imagePullSecrets | 将容器组（pod）配置为使用机密从私有注册表中提取。 | 不适用 | 
| livenessProbe | Kubelet 进程使用存活性探测器来知道何时重启容器。例如，存活性探测器可捕获死锁，即应用程序正在运行，但无法取得进展。尽管存在错误，但在这种状态下重启容器有助于提高应用程序的可用性。 | 是 | 
| readinessProbe | 为您的容器准备一个就绪性探测器至关重要。这样，在数据面板上运行的 Kubelet 进程就会知道容器何时已准备好提供流量。当容器组（pod）的所有容器都准备就绪时，容器组（pod）即被视为准备就绪。此信号的一个用途是控制哪些容器组（pod）用作服务的后端。当容器组（pod）未准备就绪时，它会从服务负载均衡器中移除。 | Yes | 
| startupProbe | kubelet 使用启动探测器来了解容器应用程序何时启动。如果配置了这种探测器，它会禁用存活性和就绪性检查，直到成功为止，以确保这些探测器不会干扰应用程序的启动。这可用于对启动缓慢的容器进行活性检查，避免它们在启动并运行之前就被 kubelet 终止。 | 可选 | 
| podDisruptionBudget | 定义 Pod Discruption Budget（PDB），确保在自愿中断期间，保持最低数量的容器组（pod）继续运行。PDB 限制了因自愿中断而同时关闭的复制应用程序的容器组（pod）数量。例如，基于法定人数的应用程序希望确保运行的副本数量永远不会低于法定人数所需的数量。Web 前端可能希望确保提供负载的副本数量永远不会低于总数的特定百分比。 | 是，如果默认为两个以上的副本 | 
| serviceAccount (name) | 容器组（pod）将在其下运行的服务账户的名称。 | 是 | 
| serviceAccount (annotations) | 应用于服务账户的注释。通常用于服务账户的 IAM 角色功能 | 否，IAM 服务账户角色 ARN 是在顶级 Amazon EKS 附加组件 API 中设置的。此规则的一个例外情况是，如果您的插件有多个插件 deployments/controllers （例如 Flux），并且需要单独的 IRSA 角色 ARNs。 | 
| priorityClassName | 优先级表示一个容器组（pod）相对于其他容器组（pod）的重要性。如果无法调度容器组（pod），调度器会尝试抢占（驱逐）优先级较低的容器组（pod），以便可以调度待处理的容器组（pod）。 | 可以。大多数附加组件对集群功能至关重要，默认情况下应设置优先级类别。 | 
| podSecurityContext | 安全上下文定义容器组（pod）或容器的权限和访问控制设置。通常用于设置 fsGroup，这是版本 1.19 及更低版本集群中的 IRSA 所必需的。 | 不太可能，因为 Amazon EKS 不再支持 Kubernetes v1.19 | 
| securityContext | 安全上下文定义容器组（pod）或容器的权限和访问控制设置。 | 是 | 
| updateStrategy | 指定用于用新容器组（pod）替换旧容器组（pod）的策略。 | 是 | 
| nameOverride | 覆盖容器组（pod）的名称。 | 否 | 
| podSecurityPolicy |  对参数实施限制。  | 不 PSPs 是-已弃用 | 
| extraVolumeMounts/额外卷 |  用于非 Amazon EKS 集群中的 IRSA。  | 否 | 