

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 的容器型產品需求 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 Chart 結構需求](#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 服務時，您必須使用下列其中一項：
  + 服務帳戶的 IAM 角色，適用於 Amazon Elastic Kubernetes Service (Amazon EKS) 工作負載。
  + 任務的 IAM 角色，適用於 Amazon Elastic Container Service (Amazon ECS) 工作負載。
+ 容器型產品必須只需要最低權限才能執行。如需詳細資訊，請參閱 [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)。
+ 根據預設，容器映像應設定為使用非根權限執行。
+ 容器不得包含任何硬式編碼秘密，例如系統使用者和服務的密碼 （即使是雜湊）、私有金鑰、登入資料等。
+ 在容器內執行的任何服務中的身分驗證都不得使用密碼型身分驗證，即使使用者在啟動時產生、重設或定義密碼。也不允許使用空密碼和空白密碼。
+ 容器映像不得包含具有不支援架構的層 （例如，傳入認證架構中繼資料）。

## 客戶資訊要求
<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>

 所有容器型產品都必須遵守下列產品使用需求：
+ 賣方只能列出功能完整的產品。不允許用於試用或評估目的的 Beta 版或發行前產品。如果賣方 AWS Marketplace 在提供免費版本的 90 天內提供對等的付費版本，則支援商業軟體版本的開發人員、社群和 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 Elastic Container Registry (Amazon ECR) 儲存庫 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 應該部署在 Amazon EKS、Amazon ECS AWS Fargate、Amazon EKS Anywhere、Amazon ECS Anywhere、Red Hat OpenShift Service on AWS (ROSA)、內部部署或 Amazon Elastic Compute Cloud 上。
+ 對於 Helm Chart 產品，容器映像參考必須根據 進行結構化[Helm Chart 結構需求](#helm-chart-structure-requirements)，以支援跨區域部署。
+ 如果您的容器型產品需要買方部署 Amazon Machine Image (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 Chart 結構需求
<a name="helm-chart-structure-requirements"></a>

提交至 的所有 Helm Chart 產品 AWS Marketplace 都必須遵守下列結構要求，以確保跨 AWS 區域的適當區域化和部署：
+ 容器映像參考必須僅在 `values.yaml` 檔案中定義，而不是在 Helm Chart 內的任何其他檔案中進行硬式編碼。這可讓 在將產品複寫至不同區域時 AWS Marketplace 自動取代這些參考。
+ `values.yaml` 檔案必須對所有容器映像參考使用變數。
+ 或者，您可以在與儲存庫相同的層級`tag`將 `registry`和 分成不同的欄位，以建置映像參考。
+ Helm 範本必須使用標準 Helm 範本語法 （例如 `{{ .Values.image.repository }}:{{ .Values.image.tag }}`) 來參考這些變數。
+ 避免在會略過 中定義之映像參考的範本中使用條件式邏輯`values.yaml`。
+ 使用不同的 AWS 區域測試 Helm Chart 時，請確保在 中變更區域會`values.yaml`正確更新已部署資源中的所有影像參考。

AWS Marketplace 在產品提交程序`values.yaml`期間， 會驗證檔案中所有容器映像參考是否已正確定義。不符合這些要求的產品將被拒絕。

### Helm Chart 中容器映像參考的需求
<a name="helm-chart-best-practices"></a>

以下示範在 Helm Chart 中建構容器映像參考的方法：

**`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 Chart 驗證錯誤
<a name="helm-chart-validation-errors"></a>

在產品提交過程中， 會對 Helm Chart 產品 AWS Marketplace 執行驗證檢查，以確保符合容器映像參考要求。如果您的 Helm Chart 不符合這些要求，您可能會遇到下列驗證錯誤：


| 錯誤 | 說明 | 
| --- | --- | 
| INCOMPATIBLE\$1HELM\$1OBJECTS | EKS 附加元件不支援指定的 Helm 物件。請參閱 [Amazon EKS 附加元件產品的需求](#publishing-eks-add-on)。 | 
| INVALID\$1DEPENDENT\$1HELM\$1CHARTS | 相依 Helm Chart 必須包含在父圖表目錄中，而非外部來源。 | 
| INVALID\$1HELM\$1SENSITIVE\$1CONFIG | 組態結構描述不能包含收集敏感資訊的欄位。組態結構描述不得接受密碼、API 金鑰、憑證或秘密。請改為提供客戶將分別建立的 Kubernetes 秘密名稱欄位。 | 
| INVALID\$1HELM\$1CHART\$1IMAGES | 所有映像，包括開放原始碼相依性，都必須推送至透過新增儲存庫請求建立的 AWS Marketplace Amazon ECR 儲存庫。 [步驟 1：新增儲存庫](container-add-version.md#add-repositories) | 
| INVALID\$1HELM\$1UNDECLARED\$1IMAGES | 所有容器映像參考都必須明確列在[新增版本](container-add-version.md#add-new-version)請求中。 | 
| INVALID\$1HELM\$1LINT | Helm Chart helm lint 驗證失敗。在helm lint本機執行 以識別和修正結構或語法問題。使用 Helm 版本 3.19.0 或更新版本。 | 
| INVALID\$1HELM\$1TEMPLATE | Helm Chart helm template 驗證失敗。圖表無法轉譯為有效的 Kubernetes 資訊清單。在本機使用 進行測試helm template，以識別範本語法或邏輯錯誤。使用 Helm 版本 3.19.0 或更新版本。 | 
| MISSING\$1HELM\$1DEPLOYMENT\$1CONFIG | Amazon EKS 附加元件的 Helm Chart 必須包含部署或 DaemonSet 資源。Amazon EKS 至少需要其中一個工作負載類型，才能進行附加元件生命週期管理。請參閱 [Amazon EKS 附加元件產品的需求](#publishing-eks-add-on)。 | 
| INCOMPATIBLE\$1CONFIGURATION\$1SCHEMA\$1VERSION | aws\$1mp\$1configuration\$1schema.json 不支援 中的 JSON 結構描述版本。如需支援的結構描述版本[結構描述要求](#schema-requirements)，請參閱 。 | 
| INVALID\$1IMAGE\$1REFERENCE | 所有映像都必須定義為 中的變數，values.yaml並使用 Helm 範本語法加以參考，如中所述[Helm Chart 結構需求](#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 Chart 使用說明
<a name="helm-chart-usage-instructions"></a>

建立 Helm Chart 產品的使用說明時：
+ 在您的 `values.yaml` 檔案中明確記錄所有可設定的參數，包括映像儲存庫、標籤和登錄參數。
+ 提供安裝 Helm Chart 時如何覆寫這些參數的範例。
+ 安裝圖表時，請勿指示使用者修改 `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。
+ 您的容器產品必須同時與 AMD64 和 ARM64 架構相容。
+ 您的容器產品不得使用自帶授權 (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 Public Gallery](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命令都使用 3.19.0 Helm版：
  + 支援所有`Capabilities`物件，但 除外`.APIVersions`。 `.APIVersions`不支援非內建的自訂 Kubernetes APIs。 non-built-in 
  + 僅支援 ```Release.Name`和 `Release.Namespace` 物件。
  + Helm 不支援勾點和 `lookup`函數。
  + 所有相依圖表都必須位於主Helm圖表中 （以儲存庫路徑檔案：//... 指定）。
  + 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 儲存庫。
+ **自訂組態** – 您可以在部署期間新增自訂變數。如需如何識別最終使用者體驗、命名軟體`aws_mp_configuration_schema.json`，以及使用Helm圖表封裝成包裝函式的詳細資訊，請參閱 [Amazon EKS 附加元件：進階組態](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，您可以：
  + 將**兩個附加元件：分割 CRD 定義發佈**至單獨的附加元件 （單獨的 Helm Chart)，並將實際的[自訂資源](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 Chart 未建立 `serviceAccount`，則許可無法繫結至 `serviceAccount`。
+ **可追蹤的部署或協助程式集** – 確保您的 Helm Chart 具有協助程式集或部署。Amazon EKS 附加元件架構會使用它們來追蹤 Amazon EKS 資源的部署。如果沒有可追蹤的部署或協助程式集，您的附加元件將面臨部署錯誤。如果您的附加元件沒有部署或協助程式集，例如，如果您的附加元件部署了大量自訂資源或無法追蹤的 Kubernetes 任務，請新增虛擬部署或協助程式集物件。
+ **支援 AMD 和 ARM 架構** – 許多 Amazon EKS 客戶現在使用 ARM64 來使用 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 Chart 必須獨立，且不得需要來自外部來源的相依性，例如 GitHub。如果軟體需要外部相依性，則必須將相依性推送至相同 AWS Marketplace 清單下的 AWS Marketplace 私有 Amazon ECR 儲存庫。
+ **在您的網站上提供部署指示** – 我們要求您託管部署指南，讓客戶了解如何透過 [create-addon](https://docs.aws.amazon.com/cli/latest/reference/eks/create-addon.html) 命令部署您的軟體。
+ **附加元件許可/IAM 角色** – 如果您從 發佈的附加元件 AWS Marketplace 需要存取 AWS 服務，您的軟體應該有一個 Kubernetes 服務帳戶，並標註 IAM 政策來存取 AWS 服務。您可以從服務帳戶的兩個選項中選擇，以向 AWS 服務提出 API 請求：
  + 透過 IRSA 的登入資料：此選項可讓您的軟體從 Identity and Access Management (IAM) Role Service (IRSA) 取得擔任登入資料。如需詳細資訊，請參閱[服務帳戶的 IAM 角色。 ](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html)
  + Amazon EKS Pod 身分：此選項可讓您的軟體使用 Amazon EKS Pod 的 Pod 身分向 AWS 服務提出 API 請求。如需詳細資訊，請參閱[了解 EKS Pod Identity 如何授予 Pod 對 AWS 服務的存取權](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html)

  您的附加元件必須在與目前自訂組態結構描述 () 相同的目錄中，在 Helm Chart `aws_mp_addon_parameters.json` 的最上層具有名為 的額外組態檔案`aws_mp_configuration_schema.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_tw/marketplace/latest/userguide/container-product-policies.html)
**注意**  
來自 Pay-as-you-go(PAYG) 附加元件產品 AWS Marketplace 無法使用 Amazon EKS Pod 身分，且必須使用 IAM Roles for Service Accounts (IRSA) 進行存取控制。
+ **版本更新** – Amazon EKS 會在上游發行數週後發行新的 Kubernetes 版本。隨著新的 Amazon EKS 叢集版本正式推出，廠商有 45 天的時間來認證或更新其軟體，使其與新的 Amazon EKS 叢集版本版本相容。如果您目前的附加元件版本支援新的 Kubernetes 版本，請驗證並認證相同的 ，以便我們可以更新版本相容性矩陣。如果需要新的附加元件版本來支援新的 Kubernetes 版本版本，請提交新版本以供加入。
+ 合作夥伴的軟體必須屬於下列其中一種類型，或是可增強 Kubernetes 或 Amazon EKS 的操作軟體：Gitops \$1 監控 \$1 記錄 \$1 cert-management \$1 政策管理 \$1 成本管理 \$1 Autoscaling \$1 儲存 \$1 kubernetes-management \$1 service-mesh \$1 etcd-backup \$1 ingress-service-type \$1 load-balancer \$1 local-registry \$1 networking \$1 Security \$1 備份 \$1 輸入控制器 \$1 可觀測性
+ 軟體不能是[容器網路界面 (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 許可。如果 RBAC 許可需要變更較新版本的附加元件或任何修正以解決 CVE，則附加元件提供者將需要將此變更通知 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 傳入 Secret 的名稱。我們建議附加元件提供者為結構描述屬性命名，這樣客戶就不會意外誤認為實際金鑰。例如：appSecretName、connectionSecretName 等。  
總而言之，附加元件提供者可以利用結構描述，允許客戶傳入秘密的名稱，但不能傳遞實際上會保留秘密本身的金鑰。

**範例組態值**  
您可以在結構描述中包含組態範例，以協助客戶設定附加元件。下列範例來自 AWS Distro for 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 結構描述檔案中的建議參數。


| 參數 | Description | 應該有預設值嗎？ | 
| --- | --- | --- | 
| additionalLabels | 將 Kubernetes 標籤新增至附加元件管理的所有 Kubernetes 物件。 | 否 | 
| additionalAnnotations | 將 Kubernetes 註釋新增至附加元件管理的所有 Kubernetes 物件。 | 否 | 
| podLabels | 將 Kubernetes 標籤新增至 附加元件管理的 Pod。 | 否 | 
| podAnnotations | 將 Kubernetes 註釋新增至附加元件管理的 Pod。 | 否 | 
| logLevel | 由附加元件管理之元件的日誌層級。 | 是 | 
| nodeSelector | 建議最簡單的節點選取限制條件。您可以將 nodeSelector 欄位新增至 Pod 規格，並指定您希望目標節點擁有的節點標籤。 | 可能，例如僅限 Linux 節點 | 
| 容差 | 公差會套用至 Pod。容錯允許排程器使用相符的污點來排程 Pod。容錯允許排程，但不保證排程。 | 或許， 協助程式集更常見 | 
| 親和性 | 親和性功能包含兩種類型的親和性：節點親和性函數，例如 nodeSelector 欄位，但更具表達性，並可讓您指定軟性規則，Pod 間親和性/反親和性可讓您限制 Pod 與其他 Pod 上的標籤。 | 也許可以 | 
| topologySpreadConstraints | 您可以使用拓撲分散限制來控制 Pod 如何在故障網域之間分散到叢集，例如區域、區域、節點和其他使用者定義的拓撲網域。這有助於實現高可用性以及高效的資源使用率。 | 也許可以 | 
| 資源請求/限制 | 指定每個容器需要多少 cpu/記憶體。強烈建議設定請求。限制是選用的。 | 是 | 
| 複本 | 附加元件管理的 Pod 複本數量。不適用於協助程式集。 | 是 | 

**注意**  
對於工作負載排程組態參數，您可能需要在必要時將結構描述中的頂層元件分開。例如，Amazon EBS CSI 驅動程式包含兩個主要元件：控制器和節點代理程式 - 客戶需要每個元件的不同節點選擇器/容錯。

**注意**  
JSON 結構描述中定義的預設值僅用於使用者文件，不會取代`values.yaml`檔案中具有正確預設值的需求。如果使用預設屬性，請確保 中的預設值`values.yaml`符合結構描述中的預設值，且每當對 Helm Chart 進行變更時，兩個成品 (`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 控制器） `clusterName` `region`可能需要叢集中繼資料參數，例如 `vpcId`、`accountId`、、 和其他參數。Amazon EKS 服務已知的任何類似參數都會由 Amazon EKS 附加元件自動注入，而不會承擔使用者將 指定為組態選項的責任。這些參數包括：
+ AWS 區域
+ Amazon EKS 叢集名稱
+ 叢集的 VPC ID
+ 容器登錄檔，特別是用於 build-prod 帳戶，供聯網附加元件使用
+ DNS 叢集 IP，特別是核心附加元件
+ Amazon EKS 叢集 API 端點
+ 叢集上已啟用 IPv4 
+ 叢集上已啟用 IPv6 
+ 叢集上啟用 IPv6 的字首委派

附加元件提供者需要確保您已為此類適用參數定義範本。上述每個參數都有由 Amazon EKS 定義的預先定義`parameterType`屬性。發行中繼資料將指定 範本中 參數`parameterType`的名稱/路徑之間的映射。如此一來，Amazon EKS 即可動態傳入這些值，而無需客戶透過組態指定這些值，也提供附加元件提供者彈性來定義自己的範本名稱/路徑。Amazon EKS 動態注入所需的上述參數應該從結構描述檔案中排除。

**來自發行中繼資料的範例映射**

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

以下是不建議在面向客戶的 Helm 結構描述檔案中設定的參數。這些參數應具有不可修改的預設值，或完全不包含在附加元件範本中。


| 參數 | Description | 應該有預設值嗎？ | 
| --- | --- | --- | 
| image | 將部署在 Kubernetes 叢集上的容器映像。 | 否，透過附加元件定義進行管理 | 
| imagePullSecrets | 設定 Pod 以使用秘密從私有登錄檔提取。 | N/A | 
| livenessProbe | Kubelet 程序使用活體探查來知道何時重新啟動容器。例如，活體探測可能會捕捉應用程式正在執行但無法進行進度的死結。重新啟動處於此類狀態的容器有助於讓應用程式在發生錯誤時更可用。 | 是 | 
| readinessProbe | 請務必為您的容器建立整備探查。如此一來，在資料平面上執行的 Kubelet 程序就會知道容器何時準備好為流量提供服務。當 Pod 的所有容器都就緒時，就會將其視為就緒。此訊號的其中一個用途是控制哪些 Pod 用作 服務的後端。當 Pod 尚未就緒時，會從服務負載平衡器中移除。 | 是 | 
| startupProbe | kubelet 使用啟動探查來了解容器應用程式何時啟動。如果已設定此類探查，則會停用活體和準備度檢查，直到成功為止，確保這些探查不會干擾應用程式啟動。這可用於在啟動緩慢的容器上採用活體檢查，避免它們在啟動和執行之前被 kubelet 刪除。 | 選用 | 
| podDisruptionBudget | 定義 Pod 中斷預算 (PDB)，以確保在自願中斷期間持續執行的 PODS 數量下限。PDB 會限制複寫應用程式因自願中斷而同時關閉的 Pod 數量。例如，以規定人數為基礎的應用程式想要確保執行的複本數目永遠不會低於規定人數所需的數目。Web 前端可能想要確保提供負載的複本數目永遠不會低於總數的特定百分比。 | 是，如果預設為兩個以上的複本 | 
| serviceAccount （名稱） | 服務帳戶 Pod 的名稱將在 下執行。 | 是 | 
| serviceAccount （註釋） | 套用至服務帳戶的註釋。通常用於服務帳戶的 IAM 角色功能 | 否，IAM 服務帳戶角色 ARN 是在頂層 Amazon EKS 附加元件 API 中設定。此規則的例外是，如果您的附加元件有多個部署/控制器 （例如 Flux)，並且需要單獨的 IRSA 角色 ARNs。 | 
| priorityClassName | 優先順序表示 Pod 相對於其他 Pod 的重要性。如果無法排程 Pod，排程器會嘗試先佔 （移出） 優先順序較低的 Pod，以便排程擱置中的 Pod。 | 是。大多數附加元件對叢集功能至關重要，且預設應設定優先順序類別。 | 
| podSecurityContext | 安全內容會定義 Pod 或容器的權限和存取控制設定。通常用於設定 fsGroup - 這是 v1.19 和較低叢集中 IRSA 所需的。 | 不太可能，指定的 Amazon EKS 不再支援 Kubernetes v1.19 | 
| securityContext | 安全內容會定義 Pod 或容器的權限和存取控制設定。 | 是 | 
| updateStrategy | 指定用來將舊 Pod 取代為新 Pod 的策略。 | 是 | 
| nameOverride | 覆寫 Pod 的名稱。 | 否 | 
| podSecurityPolicy |  對參數強制執行限制。  | 否 - PSPs已棄用 | 
| extraVolumeMounts/extraVolumes |  用於非 Amazon EKS 叢集中的 IRSA。  | 否 | 