

 **協助改進此頁面** 

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

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

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

# EKS 功能
<a name="capabilities"></a>

**提示**  
入門：[建立 ACK 功能](create-ack-capability.md) \$1 [建立 Argo CD 功能](create-argocd-capability.md) \$1 [建立 kro 功能](create-kro-capability.md) 

Amazon EKS 功能是一組分層的全受管叢集功能，可協助加速開發人員速度，並卸載使用 Kubernetes 建置和擴展的複雜性。EKS 功能是 Kubernetes 原生功能，用於宣告式持續部署、 AWS 資源管理和 Kubernetes 資源撰寫和協同運作，全部由 完全管理 AWS。透過 EKS 功能，您可以更專注於建置和擴展工作負載，並將這些基礎平台服務的營運負擔卸載至 AWS。這些功能會在 EKS 而非叢集中執行，無需在工作者節點上安裝、維護和擴展關鍵平台元件。

若要開始使用，您可以在新的或現有的 EKS 叢集上建立一或多個 EKS 功能。若要這樣做，您可以使用 AWS CLI、 AWS 管理主控台、EKS APIs、eksctl 或您偏好的infrastructure-as-code工具。雖然 EKS 功能旨在共同運作，但它們是獨立的雲端資源，您可以根據使用案例和需求來挑選和選擇。

EKS 功能支援 EKS 支援的所有 Kubernetes 版本。

**注意**  
EKS 功能可在提供 Amazon EKS 的所有 AWS 商業區域中使用。如需支援區域的清單，請參閱《 AWS 一般參考》中的 [Amazon EKS 端點和配額](https://docs.aws.amazon.com/general/latest/gr/eks.html)。

## 可用的功能
<a name="_available_capabilities"></a>

### AWS Kubernetes (ACK) 的控制器
<a name="shared_aws_controllers_for_kubernetes_ack"></a>

ACK 可讓您使用 Kubernetes APIs 管理 AWS 資源，讓您使用 Kubernetes 自訂 AWS 資源建立和管理 S3 儲存貯體、RDS 資料庫、IAM 角色和其他資源。ACK 會持續協調您所需的狀態與 中的實際狀態 AWS，修正一段時間內的任何偏離，以保持您的系統運作狀態，並依指定設定您的資源。您可以使用相同的工具和工作流程來管理 AWS 資源與 Kubernetes 工作負載，並支援 50 多種 AWS 服務，包括 S3、RDS、DynamoDB 和 Lambda。ACK 支援跨帳戶和跨區域資源管理，可啟用複雜的多帳戶、多叢集系統管理架構。ACK 支援唯讀資源和唯讀採用，有助於將其他基礎設施作為程式碼工具遷移到以 Kubernetes 為基礎的系統。

 [進一步了解 ACK →](ack.md) 

### Argo CD
<a name="_argo_cd"></a>

Argo CD 使用 Git 儲存庫做為工作負載和系統狀態的真實來源，為您的應用程式實作 GitOps 型持續部署。Argo CD 會自動從 Git 儲存庫同步應用程式資源到您的叢集，偵測並修復偏離，以確保您部署的應用程式符合您所需的狀態。您可以從單一 Argo CD 執行個體跨多個叢集部署和管理應用程式，並在每次遞交變更時從 Git 儲存庫自動部署。同時使用 Argo CD 和 ACK 可提供基礎 GitOps 系統，簡化工作負載相依性管理，並支援整個系統設計，包括大規模的叢集和基礎設施管理。Argo CD 與 AWS Identity Center 整合以進行身分驗證和授權，並提供託管 Argo UI 以視覺化應用程式運作狀態和部署狀態。

 [進一步了解 Argo CD →](argocd.md) 

### kro (Kube Resource Orchestrator)
<a name="_kro_kube_resource_orchestrator"></a>

kro 可讓您建立自訂 Kubernetes APIs，將多個資源組成更高階的抽象，讓平台團隊為常見的資源組合雲端建置區塊定義可重複使用的模式。使用 kro， 您可以將 Kubernetes 和資源 AWS 組合成統一的抽象概念， 使用簡單的語法來啟用動態組態和條件式邏輯。 kro 可讓平台團隊以適當的護欄提供自助式功能。 可讓開發人員使用簡單的 佈建複雜的基礎設施 專用 APIs同時維護組織標準和最佳實務。kro 資源只是 Kubernetes 資源， 和 在可存放在 Git 的 Kubernetes 資訊清單中指定， 或 推送至 OCI 相容登錄檔，例如 Amazon ECR，以進行廣泛的組織分佈。

 [進一步了解 kro →](kro.md) 

## EKS 功能的優點
<a name="_benefits_of_eks_capabilities"></a>

EKS 功能完全由 管理 AWS，無需安裝、維護和擴展基礎叢集服務。 AWS 處理安全修補、更新和操作管理，讓您的團隊專注於使用 建置 AWS ，而不是叢集操作。與使用叢集資源的傳統 Kubernetes 附加元件不同，功能在 EKS 中執行，而不是在工作者節點上執行。這可為您的工作負載釋放叢集容量和資源，同時將管理叢集內控制器和其他平台元件的操作負擔降至最低。

透過 EKS 功能，您可以使用原生 Kubernetes APIs 和 等工具來管理部署、 AWS 資源、自訂 Kubernetes 資源和組合`kubectl`。所有功能都會在您的叢集內容中運作，自動偵測和修正應用程式和雲端基礎設施資源中的組態偏離。您可以從單一控制點跨多個叢集、 AWS 帳戶和區域部署和管理資源，簡化複雜、分散式環境中的操作。

EKS 功能專為 GitOps 工作流程設計，提供宣告性、版本控制的基礎設施和應用程式管理。透過系統變更 Git 的流程，提供稽核線索、回復功能和與現有開發實務整合的協作工作流程。這種 Kubernetes 原生方法表示您不需要使用多個工具或管理叢集外部的infrastructure-as-code系統，而且有單一事實來源可供參考。您在版本控制 Kubernetes 宣告式組態中定義的所需狀態會在您的環境中持續強制執行。

## 定價
<a name="_pricing"></a>

使用 EKS 功能，無需預付承諾或最低費用。您需要為 Amazon EKS 叢集上每個作用中小時的每個功能資源支付費用。由 EKS 功能管理的特定 Kubernetes 資源也會以每小時費率計費。

如需最新的定價資訊，請參閱 [Amazon EKS 定價頁面](https://aws.amazon.com/eks/pricing/)。

**提示**  
您可以使用 AWS Cost Explorer 和成本和用量報告，與其他 EKS 費用分開追蹤功能成本。您可以使用叢集名稱、功能類型和其他詳細資訊來標記您的功能，以用於成本分配目的。

## EKS 功能的運作方式
<a name="_how_eks_capabilities_work"></a>

每個功能都是您在 EKS 叢集上建立 AWS 的資源。建立後，此功能會在 EKS 中執行，並由 完全管理 AWS。

**注意**  
您可以為指定叢集建立每種類型的一個功能資源 (Argo CD、ACK 和 kro)。您無法在相同叢集上建立相同類型的多個功能資源。

您可以使用標準 Kubernetes APIs 和工具與叢集中的功能互動：
+ 使用 `kubectl`套用 Kubernetes 自訂資源
+ 使用 Git 儲存庫做為 GitOps 工作流程的事實來源

有些功能支援其他工具。例如：
+ 使用 Argo CD CLI 來設定和管理 Argo CD 功能中的儲存庫和叢集
+ 使用 Argo CD UI 視覺化和管理由 Argo CD 功能管理的應用程式

功能旨在共同運作，但獨立且完全選擇加入。您可以根據您的需求啟用一個、兩個或全部三個功能，並隨著需求的變化更新組態。

所有 EKS 運算類型都支援與 EKS 功能搭配使用。如需詳細資訊，請參閱[使用節點管理運算資源](eks-compute.md)。

如需 IAM 角色的安全組態和詳細資訊，請參閱 [EKS 功能的安全考量](capabilities-security.md)。如需多叢集架構模式，請參閱 [EKS 功能考量事項](capabilities-considerations.md)。

## 常用案例
<a name="_common_use_cases"></a>

 **適用於應用程式和基礎設施的 GitOps ** 

使用 Argo CD 部署應用程式和操作元件，以及從 Git 儲存庫管理叢集組態和佈建基礎設施的 ACK。您的整個堆疊 - 應用程式、資料庫、儲存和聯網 - 定義為程式碼並自動部署。

範例：開發團隊將變更推送至 Git。Argo CD 部署更新的應用程式，且 ACK 會佈建具有正確組態的新 RDS 資料庫。所有變更皆可稽核、可逆且跨環境保持一致。

 **具有自助式服務的平台工程** 

使用 kro 建立構成 ACK 和 Kubernetes 資源APIs。平台團隊使用護欄定義核准的模式。應用程式團隊使用簡單的高階 APIs 來佈建完整的堆疊。

範例：平台團隊會建立佈建部署、服務、輸入和 S3 儲存貯體的「WebApplication」 API。開發人員使用此 API，而不需要了解基礎複雜性或 AWS 許可。

 **多叢集應用程式管理** 

使用 Argo CD 在不同區域或帳戶中跨多個 EKS 叢集部署應用程式。使用一致的政策和工作流程，從單一 Argo CD 執行個體管理所有部署。

範例：將相同的應用程式部署到跨多個區域的開發、預備和生產叢集。Argo CD 可確保每個環境與其對應的 Git 分支保持同步。

 **多叢集管理** 

使用 ACK 定義和佈建 EKS 叢集、使用組織標準自訂叢集組態的 kro，以及管理叢集生命週期和組態的 Argo CD。這提供從建立到持續操作end-to-end叢集管理。

範例：使用 ACK 和 kro 定義 EKS 叢集來佈建和管理叢集基礎設施，定義聯網、安全政策、附加元件和其他組態的組織標準。使用 Argo CD，利用一致的標準和自動化生命週期管理，在整個機群中建立並持續管理叢集、組態和 Kubernetes 版本更新。

 **遷移和現代化** 

使用原生雲端資源佈建和 GitOps 工作流程簡化遷移至 EKS。使用 ACK 來採用現有 AWS 資源，而不重新建立這些資源，並使用 Argo CD 從 Git 操作工作負載部署。

範例：從 EC2 遷移至 EKS 的團隊會使用 ACK 採用其現有的 RDS 資料庫和 S3 儲存貯體，然後使用 Argo CD 從 Git 部署容器化應用程式。遷移路徑很清楚，操作從第一天開始就會標準化。

 **帳戶和區域引導** 

使用 Argo CD 和 ACK 自動化跨帳戶和區域的基礎設施推展。在 Git 中將基礎設施定義為程式碼，並讓 功能處理部署和管理。

範例：平台團隊會維護 Git 儲存庫，定義標準帳戶組態：VPCs、IAM 角色、RDS 執行個體和監控堆疊。Argo CD 會自動將這些組態部署到新帳戶和區域，確保一致性並將手動設定時間從幾天縮短到幾分鐘。

# 使用 功能資源
<a name="working-with-capabilities"></a>

本主題說明管理所有功能類型的功能資源的常見操作。

## EKS 功能資源
<a name="_eks_capability_resources"></a>

EKS 功能是可在 Amazon EKS 叢集上啟用受管功能 AWS 的資源。功能在 EKS 中執行，無需在工作者節點上安裝和維護控制器和其他操作元件。系統會針對特定 EKS 叢集建立功能，並在叢集的整個生命週期內與該叢集保持關聯。

每個功能資源都有：
+ 叢集內的唯一名稱
+ 功能類型 (ACK、ARGOCD 或 KRO)
+ Amazon Resource Name (ARN)，同時指定名稱和類型
+ 功能 IAM 角色
+ 指出其目前狀態的狀態
+ 組態，包括通用和特定於功能類型

## 了解功能狀態
<a name="_understanding_capability_status"></a>

功能資源的狀態會指出其目前狀態。您可以在 EKS 主控台或使用 AWS CLI 檢視功能狀態和運作狀態。

 **主控台**：

1. 在以下網址開啟 Amazon EKS 主控台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 選取您的叢集名稱。

1. 選擇**功能**索引標籤以檢視所有功能的狀態。

1. 如需詳細運作狀態資訊，請選擇**可觀測性**索引標籤，然後選擇**監控叢集**，然後選擇**功能**索引標籤。

 ** AWS CLI**：

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-capability-name
```

### 功能狀態
<a name="_capability_statuses"></a>

 **CREATING**：正在設定功能。您可以離開 主控台，此功能將繼續在背景中建立。

 **ACTIVE**：功能正在執行並準備好使用。如果資源未如預期般運作，請檢查資源狀態和 IAM 許可。如需指引，請參閱[對 EKS 功能進行故障診斷](capabilities-troubleshooting.md)。

 **正在更新**：正在套用組態變更。等待狀態傳回 `ACTIVE`。

 **刪除**：正在從叢集中移除功能。

 **CREATE\$1FAILED**：設定發生錯誤。常見原因包括：
+ IAM 角色信任政策不正確或遺失
+ IAM 角色不存在或無法存取
+ 叢集存取問題
+ 無效的組態參數

如需特定錯誤詳細資訊，請參閱功能運作狀態區段。

 **UPDATE\$1FAILED**：組態更新失敗。檢查功能運作狀態區段以取得詳細資訊，並確認 IAM 許可。

**提示**  
如需詳細的故障診斷指引，請參閱：  
 [對 EKS 功能進行故障診斷](capabilities-troubleshooting.md) - 一般功能疑難排解
 [對 ACK 功能的問題進行故障診斷](ack-troubleshooting.md) - ACK 特定問題
 [對 Argo CD 功能的問題進行故障診斷](argocd-troubleshooting.md) - Argo CD 特定問題
 [對 kro 功能的問題進行故障診斷](kro-troubleshooting.md) - kro 特定問題

## 建立 功能
<a name="_create_capabilities"></a>

若要在您的叢集上建立功能，請參閱下列主題：
+  [建立 ACK 功能](create-ack-capability.md) – 建立 ACK 功能，以使用 Kubernetes APIs 管理 AWS 資源
+  [建立 Argo CD 功能](create-argocd-capability.md) – 為 GitOps 持續交付建立 Argo CD 功能
+  [建立 kro 功能](create-kro-capability.md) – 建立資源合成和協同運作的 kro 功能

## 列出功能
<a name="_list_capabilities"></a>

您可以列出叢集上的所有功能資源。

### 主控台
<a name="_console"></a>

1. 在以下網址開啟 Amazon EKS 主控台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 選取您的叢集名稱以開啟叢集詳細資訊頁面。

1. 選擇**功能**索引標籤。

1. 在**受**管功能下檢視功能資源。

### AWS CLI
<a name="shared_aws_cli"></a>

使用 `list-capabilities`命令來檢視叢集上的所有功能。將 *region-code* 取代為您的叢集所在的 AWS 區域，並將 *my-cluster* 取代為您的叢集名稱。

```
aws eks list-capabilities \
  --region region-code \
  --cluster-name my-cluster
```

```
{
    "capabilities": [
        {
            "capabilityName": "my-ack",
            "arn": "arn:aws:eks:us-west-2:111122223333:capability/my-cluster/ack/my-ack/abc123",
            "type": "ACK",
            "status": "ACTIVE",
            "createdAt": "2025-11-02T10:30:00.000000-07:00",
            "modifiedAt": "2025-11-02T10:32:15.000000-07:00",
        },
        {
            "capabilityName": "my-kro",
            "arn": "arn:aws:eks:us-west-2:111122223333:capability/my-cluster/kro/my-kro/abc123",
            "type": "KRO",
            "status": "ACTIVE",
            "version": "v0.6.3",
            "createdAt": "2025-11-02T10:30:00.000000-07:00",
            "modifiedAt": "2025-11-02T10:32:15.000000-07:00",
        },
        {
            "capabilityName": "my-argocd",
            "arn": "arn:aws:eks:us-west-2:111122223333:capability/my-cluster/argocd/my-argocd/abc123",
            "type": "ARGOCD",
            "status": "ACTIVE",
            "version": "3.1.8-eks-1",
            "createdAt": "2025-11-21T08:22:28.486000-05:00",
            "modifiedAt": "2025-11-21T08:22:28.486000-05:00"
        }
    ]
}
```

## 描述功能
<a name="_describe_a_capability"></a>

取得特定功能的詳細資訊，包括其組態和狀態。

### 主控台
<a name="_console_2"></a>

1. 在以下網址開啟 Amazon EKS 主控台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 選取您的叢集名稱以開啟叢集詳細資訊頁面。

1. 選擇**功能**索引標籤。

1. 選擇您要從**受管功能檢視的功能**。

1. 檢視功能詳細資訊，包括狀態、組態和建立時間。

### AWS CLI
<a name="shared_aws_cli"></a>

使用 `describe-capability`命令來檢視詳細資訊。將 *region-code* 取代為您的叢集所在的 AWS 區域，將 *my-cluster* 取代為您的叢集名稱，並將 *capability-name* 取代為功能名稱 (ack、argocd 或 kro)。

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name capability-name
```

 **輸出範例：**

```
{
  "capability": {
    "capabilityName": "my-ack",
    "capabilityArn": "arn:aws:eks:us-west-2:111122223333:capability/my-cluster/ack/my-ack/abc123",
    "clusterName": "my-cluster",
    "type": "ACK",
    "roleArn": "arn:aws:iam::111122223333:role/AmazonEKSCapabilityACKRole",
    "status": "ACTIVE",
    "configuration": {},
    "tags": {},
    "health": {
      "issues": []
    },
    "createdAt": "2025-11-19T17:11:30.242000-05:00",
    "modifiedAt": "2025-11-19T17:11:30.242000-05:00",
    "deletePropagationPolicy": "RETAIN"
  }
}
```

## 更新 功能的組態
<a name="_update_the_configuration_of_a_capability"></a>

您可以在建立後更新功能組態的某些層面。特定組態選項會因功能類型而有所不同。

**注意**  
EKS 功能資源受到完整管理，包括修補和版本更新。更新功能會更新資源組態，而且不會導致受管功能元件的版本更新。

### AWS CLI
<a name="shared_aws_cli"></a>

使用 `update-capability`命令來修改功能：

```
aws eks update-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name capability-name \
  --role-arn arn:aws:iam::[.replaceable]111122223333:role/NewCapabilityRole
```

**注意**  
並非所有功能屬性都可以在建立後更新。如需可修改內容的詳細資訊，請參閱功能特定的文件。

## 刪除功能
<a name="_delete_a_capability"></a>

當您不再需要叢集上的功能時，您可以刪除功能資源。

**重要**  
 **在刪除功能之前刪除叢集資源。**  
刪除功能資源不會自動刪除透過該功能建立的資源：  
所有 Kubernetes 自訂資源定義 (CRDs仍安裝在您的叢集中。
ACK 資源會保留在您的叢集中，而對應的 AWS 資源會保留在您的帳戶中
Argo CD 應用程式及其 Kubernetes 資源會保留在您的叢集中
kro ResourceGraphDefinitions 和執行個體會保留在您的叢集中
您應該在刪除功能之前刪除這些資源，以避免孤立的資源。  
您可以選擇保留與 ACK Kubernetes AWS 資源相關聯的資源。請參閱 [ACK 考量事項](ack-considerations.md) 

### 主控台
<a name="_console_3"></a>

1. 在以下網址開啟 Amazon EKS 主控台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 選取您的叢集名稱以開啟叢集詳細資訊頁面。

1. 選擇**功能**索引標籤。

1. 從**受管功能清單中選擇要刪除的功能**。

1. 選擇**刪除功能**。

1. 在確認對話方塊中，輸入確認刪除的功能名稱。

1. 選擇 **刪除**。

### AWS CLI
<a name="shared_aws_cli"></a>

使用 `delete-capability`命令刪除功能資源：

將 *region-code* 取代為您的叢集所在的 AWS 區域，將 *my-cluster* 取代為您的叢集名稱，並將 *capability-name* 取代為要刪除的功能名稱。

```
aws eks delete-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name capability-name
```

## 後續步驟
<a name="_next_steps"></a>
+  [功能 Kubernetes 資源](capability-kubernetes-resources.md) – 了解每個功能類型提供的 Kubernetes 資源
+  [ACK 概念](ack-concepts.md) – 了解 ACK 概念和資源生命週期
+  [使用 Argo CD](working-with-argocd.md) – 使用適用於 GitOps 工作流程的 Argo CD 功能
+  [kro 概念](kro-concepts.md) – 了解 kro 概念和資源合成

# 功能 Kubernetes 資源
<a name="capability-kubernetes-resources"></a>

在叢集上啟用功能後，您通常會透過在叢集中建立和管理 Kubernetes 自訂資源來與其互動。每個功能都提供自己的一組自訂資源定義 (CRDs)，以功能特定的功能擴展 Kubernetes API。

## Argo CD 資源
<a name="_argo_cd_resources"></a>

當您啟用 Argo CD 功能時，您可以建立和管理下列 Kubernetes 資源：

 **Application (應用程式)**   
定義從 Git 儲存庫到目標叢集的部署。 `Application` 資源會指定來源儲存庫、目標命名空間和同步政策。每個 Argo CD 功能執行個體最多可以建立 1000 個`Application`資源。

 **ApplicationSet**   
從 範本產生多個`Application`資源，啟用多叢集和多環境部署。 `ApplicationSet` 資源會使用產生器，根據叢集清單、Git 目錄或其他來源動態建立`Application`資源。

 **AppProject**   
提供 `Application` 資源的邏輯分組和存取控制。 `AppProject` 資源會定義`Application`資源可以使用哪些儲存庫、叢集和命名空間，進而啟用多租戶和安全性界限。

資源範例`Application`：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/org/repo
    targetRevision: main
    path: manifests
  destination:
    server: https://kubernetes.default.svc
    namespace: production
```

如需 Argo CD 資源和概念的詳細資訊，請參閱 [Argo CD 概念](argocd-concepts.md)。

## kro 資源
<a name="_kro_resources"></a>

啟用 kro 功能時，您可以建立和管理下列 Kubernetes 資源：

 **ResourceGraphDefinition (RGD)**   
定義將多個 Kubernetes AWS 和資源組成為更高層級抽象的自訂 API。平台團隊會建立 `ResourceGraphDefinition` 資源，以提供具有護欄的可重複使用模式。

 **自訂資源執行個體**   
建立`ResourceGraphDefinition`資源後，您可以建立由 定義的自訂 API 執行個體`ResourceGraphDefinition`。 kro 會自動建立和管理 中指定的資源`ResourceGraphDefinition`。

資源範例`ResourceGraphDefinition`：

```
apiVersion: kro.run/v1alpha1
kind: ResourceGraphDefinition
metadata:
  name: web-application
spec:
  schema:
    apiVersion: v1alpha1
    kind: WebApplication
    spec:
      name: string
      replicas: integer
  resources:
    - id: deployment
      template:
        apiVersion: apps/v1
        kind: Deployment
        # ... deployment spec
    - id: service
      template:
        apiVersion: v1
        kind: Service
        # ... service spec
```

範例`WebApplication`執行個體：

```
apiVersion: v1alpha1
kind: WebApplication
metadata:
  name: my-web-app
  namespace: default
spec:
  name: my-web-app
  replicas: 3
```

當您套用此執行個體時，kro 會自動建立 中`Service`定義的 `Deployment`和資源`ResourceGraphDefinition`。

如需 kro 資源和概念的詳細資訊，請參閱 [kro 概念](kro-concepts.md)。

## ACK 資源
<a name="_ack_resources"></a>

啟用 ACK 功能時，您可以使用 Kubernetes 自訂 AWS 資源來建立和管理資源。ACK 為超過 50 種 AWS 服務提供超過 200 CRDs，可讓您在 Kubernetes 工作負載旁定義 AWS 資源，並使用 Kubernetes 管理專用 AWS 基礎設施資源。

ACK 資源的範例：

 **S3 儲存貯體**   
 `Bucket` 資源會使用版本控制、加密和生命週期政策來建立和管理 Amazon S3 儲存貯體。

 **RDS DBInstance**   
 `DBInstance` 資源使用自動備份和維護時段佈建和管理 Amazon RDS 資料庫執行個體。

 **DynamoDB 資料表**   
 `Table` 資源會使用佈建或隨需容量建立和管理 DynamoDB 資料表。

 **IAM 角色**   
 `Role` 資源使用信任政策和 AWS 服務存取的許可政策來定義 IAM 角色。

 **Lambda 函數**   
 `Function` 資源會使用程式碼、執行時間和執行角色組態來建立和管理 Lambda 函數。

`Bucket` 資源的範例規格：

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-app-bucket
spec:
  name: my-unique-bucket-name-12345
  versioning:
    status: Enabled
  encryption:
    rules:
      - applyServerSideEncryptionByDefault:
          sseAlgorithm: AES256
```

如需 ACK 資源和概念的詳細資訊，請參閱 [ACK 概念](ack-concepts.md)。

## 資源限制
<a name="_resource_limits"></a>

EKS 功能具有下列資源限制：

 **Argo CD 用量限制**：
+ 每個 Argo CD 功能執行個體最多 1000 個`Application`資源
+ 每個 Argo CD 功能執行個體最多設定 100 個遠端叢集

 **資源組態限制**：
+ Argo CD 中每個資源最多 150 個 Kubernetes `Application` 資源
+ kro `ResourceGraphDefinition`中每個資源最多 64 個 Kubernetes 資源

**注意**  
這些限制適用於每個功能執行個體管理的資源數量。如果您需要更高的限制，您可以在多個叢集之間部署功能。

## 後續步驟
<a name="_next_steps"></a>

如需功能特定的任務和進階組態，請參閱下列主題：
+  [ACK 概念](ack-concepts.md) – 了解 ACK 概念和資源生命週期
+  [使用 Argo CD](working-with-argocd.md) – 使用適用於 GitOps 工作流程的 Argo CD 功能
+  [kro 概念](kro-concepts.md) – 了解 kro 概念和資源合成

# EKS 功能考量事項
<a name="capabilities-considerations"></a>

本主題涵蓋使用 EKS 功能的重要考量，包括存取控制設計、EKS 功能與自我管理解決方案之間的選擇、多叢集部署的架構模式，以及操作最佳實務。

## 功能 IAM 角色和 Kubernetes RBAC
<a name="_capability_iam_roles_and_kubernetes_rbac"></a>

每個 EKS 功能資源都有一個已設定的功能 IAM 角色。功能角色用於授予 AWS 服務許可，讓 EKS 功能代表您採取行動。例如，若要使用 ACK 的 EKS 功能來管理 Amazon S3 儲存貯體，您將授予 功能的 S3 儲存貯體管理許可，使其能夠建立和管理儲存貯體。

設定功能後，即可使用叢集中的 Kubernetes 自訂資源建立和管理 AWS 中的 S3 資源。Kubernetes RBAC 是叢集內存取控制機制，用於判斷哪些使用者和群組可以建立和管理這些自訂資源。例如，授予特定 Kubernetes RBAC 使用者和群組在您選擇的命名空間中建立和管理`Bucket`資源的許可。

如此一來，IAM 和 Kubernetes RBAC 是end-to-end存取控制系統的一半，可管理與 EKS 功能和資源相關的許可。請務必為您的使用案例設計正確的 IAM 許可和 RBAC 存取政策組合。

如需功能 IAM 角色和 Kubernetes 許可的詳細資訊，請參閱 [EKS 功能的安全考量](capabilities-security.md)。

## 多叢集架構模式
<a name="_multi_cluster_architecture_patterns"></a>

在多個叢集之間部署功能時，請考慮這些常見的架構模式：

 **使用集中式管理進行對話** 

在集中受管叢集中執行這三種功能，以協調工作負載和管理跨多個工作負載叢集的雲端基礎設施。
+ 管理叢集上的 Argo CD 會將應用程式部署到不同區域或帳戶中的工作負載叢集
+ 管理叢集上的 ACK 會為所有叢集佈建 AWS 資源 (RDS、S3、IAM)
+ 管理叢集上的 kro 會建立適用於所有叢集的可攜式平台抽象

此模式會集中工作負載和雲端基礎設施管理，並可簡化管理許多叢集的組織操作。

 **分散式 GitOps** 

工作負載和雲端基礎設施由執行工作負載的相同叢集上的功能管理。
+ Argo CD 會管理本機叢集上的應用程式資源。
+ ACK 資源用於叢集和工作負載需求。
+ 安裝 kro 平台抽象並協調本機資源。

此模式會分散操作，讓團隊在一或多個叢集中管理自己的專用平台服務。

 **使用混合 ACK 部署的中樞和發言** 

結合集中式和分散式模型，以及根據範圍和擁有權的集中式應用程式部署和資源管理。
+ Hub 叢集：
  + Argo CD 會管理本機叢集和所有遠端工作負載叢集的 GitOps 部署
  + ACK 用於管理範圍資源的管理叢集 （生產資料庫、IAM 角色、VPCs)
  + kro 用於管理叢集上，用於可重複使用的平台抽象化
+ 呼叫叢集：
  + 工作負載是透過集中式中樞叢集上的 Argo CD 進行管理
  + ACK 在本機用於工作負載範圍的資源 (S3 儲存貯體、ElastiCache 執行個體、SQS 佇列）
  + kro 在本機用於資源組成和建置區塊模式

此模式可區分考量，平台團隊會集中管理管理叢集上的關鍵基礎設施，選擇性地包括工作負載叢集，而應用程式團隊則會指定和管理雲端資源與工作負載。

 **選擇模式** 

選取架構時，請考量下列因素：
+  **組織結構**：集中化平台團隊偏好中樞模式；分散式團隊可能偏好每個叢集的功能
+  **資源範圍**：管理員範圍的資源 （資料庫、IAM) 通常受益於集中管理；工作負載資源 （儲存貯體、佇列） 可在本機管理
+  **自助式服務**：集中式平台團隊可以撰寫和分發規範性自訂資源，以針對常見的工作負載需求啟用雲端資源的安全自助式服務
+  **叢集機群管理**：集中式管理叢集為 EKS 叢集機群管理提供客戶擁有的控制平面，以及其他管理員範圍的資源
+  **合規要求**：某些組織需要集中控制以進行稽核和控管
+  **操作複雜性**：功能執行個體較少可簡化操作，但可能會產生瓶頸

**注意**  
您可以從一個模式開始，並在您的平台成熟時發展為另一個模式。功能是獨立的，您可以根據您的需求，在叢集之間以不同的方式部署這些功能。

## 比較 EKS 功能與自我管理解決方案
<a name="_comparing_eks_capabilities_to_self_managed_solutions"></a>

EKS 功能為在 EKS 中執行的熱門 Kubernetes 工具和控制器提供全受管體驗。這與您在叢集中安裝和操作的自我管理解決方案不同。

### 主要差異
<a name="_key_differences"></a>

 **部署和管理** 

 AWS 完全管理 EKS 功能，無需安裝、設定或維護元件軟體。 會自動在叢集中 AWS 安裝和管理所有必要的 Kubernetes 自訂資源定義 (CRDs)。

透過自我管理解決方案，您可以使用 Helm Chart、kubectl 或其他運算子來安裝和設定叢集軟體。您可以完全控制自我管理解決方案的軟體生命週期和執行期組態，在解決方案的任何層提供自訂。

 **操作和維護** 

 AWS 透過自動更新和安全性修補程式，管理 EKS 功能的修補和其他軟體生命週期操作。EKS 功能與簡化組態 AWS 的功能整合，提供內建的高可用性和容錯能力，並消除控制器工作負載的叢集內故障診斷。

自我管理解決方案需要您監控元件運作狀態和日誌、套用安全修補程式和版本更新、使用多個複本和 Pod 中斷預算設定高可用性、疑難排解和修復控制器工作負載問題，以及管理版本和版本。您可以完全控制部署，但這通常需要針對私有叢集存取和其他整合的自訂解決方案，這些解決方案必須符合組織標準和安全合規要求。

 **資源耗用** 

EKS 功能會在 EKS 和叢集之外執行，釋放節點資源和叢集資源。功能不會使用叢集工作負載資源、不會在工作者節點上使用 CPU 或記憶體、自動擴展，以及對叢集容量規劃的影響降到最低。

自我管理的解決方案會在工作者節點上執行控制器和其他元件，並直接使用工作者節點資源、叢集 IPs 和其他叢集資源。管理叢集服務需要工作負載的容量規劃，而且需要資源請求和限制的規劃和組態，才能管理擴展和高可用性需求。

 **功能支援** 

EKS 功能是全受管服務功能，與自我管理解決方案相比，依其本質進行評價。雖然 功能將支援大多數功能和使用案例，但與自我管理解決方案相比，涵蓋範圍會有所不同。

透過自我管理解決方案，您可以完全控制軟體的組態、選用功能和其他功能層面。您可以選擇執行自己的自訂映像、自訂組態的所有層面，以及完全控制自我管理的解決方案功能。

 **成本考量** 

每個 EKS 功能資源都有相關的每小時成本，因功能類型而異。由 功能管理的叢集資源也具有相關聯的每小時成本和自己的定價。如需詳細資訊，請參閱 [Amazon EKS 定價](https://aws.amazon.com/eks/pricing/)。

自我管理解決方案沒有與 AWS 費用相關的直接成本，但您需要支付控制器和相關工作負載使用的叢集運算資源。除了節點和叢集資源耗用之外，使用自我管理解決方案的總體擁有成本包括營運開銷，以及維護、故障診斷和支援的費用。

### 在 EKS 功能和自我管理解決方案之間進行選擇
<a name="_choosing_between_eks_capabilities_and_self_managed_solutions"></a>

 **EKS 功能** 當您想要減少營運開銷並專注於軟體和系統中的差異化價值，而不是叢集平台操作的基本需求時，請考慮此選項。當您想要將安全修補程式和軟體生命週期管理的操作負擔降至最低、釋放應用程式工作負載的節點和叢集資源、簡化組態和安全管理，以及從 AWS 支援涵蓋範圍中獲益時，請使用 EKS 功能。EKS 功能適用於大多數生產使用案例，是新部署的建議方法。

 **自我管理解決方案** 當您需要特定的 Kubernetes 資源 API 版本、自訂控制器建置、根據自我管理部署建置現有的自動化和工具，或需要控制器執行期組態的深度自訂時，請考慮此選項。自我管理解決方案可為特殊使用案例提供彈性，而且您可以完全控制部署和執行期組態。

**注意**  
EKS 功能可以與自我管理解決方案共存於叢集中，並且可以實現逐步遷移。

### 功能特定比較
<a name="_capability_specific_comparisons"></a>

如需功能特定功能、上游差異和遷移路徑等詳細比較，請參閱：
+  [比較 ACK 與自我管理 ACK 的 EKS 功能](ack-comparison.md) 
+  [比較 Argo CD 與自我管理 Argo CD 的 EKS 功能](argocd-comparison.md) 
+  [比較 kro 與自我管理 kro 的 EKS 功能](kro-comparison.md) 

# 使用 AWS Controllers for Kubernetes (ACK) 從 Kubernetes 部署 AWS 資源
<a name="ack"></a>

 AWS Kubernetes (ACK) 的控制器可讓您直接從 Kubernetes 定義和管理 AWS 服務資源。使用 AWS Controllers for Kubernetes (ACK)，您可以使用 Kubernetes 自訂資源來管理工作負載資源和雲端基礎設施，以及使用熟悉的 Kubernetes APIs 和工具的應用程式工作負載。

透過 EKS 功能，ACK 完全由 管理 AWS，無需在叢集上安裝、維護和擴展 ACK 控制器。

## ACK 的運作方式
<a name="_how_ack_works"></a>

ACK 會將 Kubernetes 自訂資源規格轉換為 AWS API 呼叫。當您建立、更新或刪除代表 AWS 服務資源的 Kubernetes 自訂資源時，ACK 會進行必要的 AWS API 呼叫來建立、更新或刪除 AWS 資源。

ACK 支援的每個 AWS 資源都有自己的自訂資源定義 (CRD)，可定義用於指定其組態的 Kubernetes API 結構描述。例如，ACK 為 S3 提供 CRDs，包括儲存貯體、儲存貯體政策和其他 S3 資源。

ACK 會持續將 AWS 資源的狀態與 Kubernetes 自訂資源中定義的所需狀態進行協調。如果資源偏離其所需狀態，ACK 會偵測到此情況並採取修正動作，使其重新對齊。Kubernetes 資源的變更會立即反映在 AWS 資源狀態中，而上游 AWS 資源變更的被動偏離偵測和修復可能需要長達 10 小時 （重新同步期間），但通常會更快發生。

 **範例 S3 儲存貯體資源資訊清單** 

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-ack-bucket
spec:
  name: my-unique-bucket-name
```

當您將此自訂資源套用至叢集時，如果帳戶尚未存在，ACK 會在帳戶中建立 Amazon S3 儲存貯體。此資源的後續變更，例如指定非預設儲存層或新增政策，將會套用至其中的 S3 資源 AWS。從叢集刪除此資源時，預設 AWS 會刪除 中的 S3 儲存貯體。

## ACK 的優點
<a name="_benefits_of_ack"></a>

ACK 提供 Kubernetes 原生 AWS 資源管理，可讓您使用與應用程式相同的 Kubernetes APIs 和工具來管理 AWS 資源。這種統一的方法可簡化您的基礎設施管理工作流程，無需在不同工具之間切換或學習單獨的infrastructure-as-code系統。您可以在 Kubernetes 資訊清單中宣告地定義 AWS 資源，讓 GitOps 工作流程和基礎設施成為與現有開發程序無縫整合的程式碼實務。

ACK 會持續協調 AWS 資源的所需狀態及其實際狀態，修正偏離並確保基礎設施的一致性。此持續對帳表示對 AWS 資源進行必要的out-of-band變更會自動還原，以符合您宣告的組態，以維護基礎設施的完整性做為程式碼。您可以設定 ACK 以跨多個 AWS 帳戶和區域管理資源，啟用複雜的多帳戶架構，無需額外的工具。

對於從其他基礎設施管理工具遷移的組織，ACK 支援資源採用，可讓您在 ACK 管理下使用現有 AWS 資源，而無需重新建立。ACK 也提供唯讀資源，無需修改存取即可進行 AWS 資源觀察，以及即使從叢集刪除 Kubernetes 資源，也可以選擇保留 AWS 資源的註釋。

若要進一步了解並開始使用適用於 ACK 的 EKS 功能，請參閱 [ACK 概念](ack-concepts.md)和 [EKS 的 ACK 考量事項](ack-considerations.md)。

## 支援 AWS 的服務
<a name="supported_shared_aws_services"></a>

ACK 支援廣泛的 AWS 服務，包括但不限於：
+ Amazon EC2
+ Amazon S3
+ Amazon RDS
+ Amazon DynamoDB
+ Amazon ElastiCache
+ Amazon EKS
+ Amazon SQS
+ Amazon SNS
+  AWS Lambda
+  AWS IAM

ACK 的 EKS 功能支援所有列為一般可用的上游 AWS 服務。如需詳細資訊，請參閱[支援 AWS 的服務完整清單](https://aws-controllers-k8s.github.io/community/docs/community/services/)。

## 與其他 EKS 受管功能的整合
<a name="_integration_with_other_eks_managed_capabilities"></a>

ACK 與其他 EKS 受管功能整合。
+  **Argo CD**：使用 Argo CD 管理跨多個叢集的 ACK 資源部署，為您的 AWS 基礎設施啟用 GitOps 工作流程。
  + ACK 與 ArgoCD 搭配使用時可延伸 GitOps 的優點，但 ACK 不需要與 git 整合。
+  **kro (Kube Resource Orchestrator)**：使用 kro 從 ACK 資源編寫複雜的資源，建立更高階的抽象，簡化資源管理。
  + 您可以使用同時定義 Kubernetes 資源和資源的 kro 建立複合自訂 AWS 資源。團隊成員可以使用這些自訂資源快速部署複雜的應用程式。

## ACK 入門
<a name="_getting_started_with_ack"></a>

若要開始使用 ACK 的 EKS 功能：

1. 建立並設定具有必要許可的 IAM 功能角色，讓 ACK 代表您管理 AWS 資源。

1.  透過 AWS 主控台、 AWS CLI 或您偏好的基礎設施做為程式碼工具，在您的 EKS 叢集上[建立 ACK 功能資源](create-ack-capability.md)。

1. 將 Kubernetes 自訂資源套用至您的叢集，以開始在 Kubernetes 中管理您的 AWS 資源。

# 建立 ACK 功能
<a name="create-ack-capability"></a>

本章說明如何在 Amazon EKS 叢集上建立 ACK 功能。

## 先決條件
<a name="_prerequisites"></a>

建立 ACK 功能之前，請確定您有：
+ Amazon EKS 叢集
+ IAM 功能角色，具有 ACK 管理 AWS 資源的許可
+ 足夠的 IAM 許可，可在 EKS 叢集上建立功能資源
+ 安裝和設定適當的 CLI 工具，或存取 EKS 主控台

如需建立 IAM 功能角色的說明，請參閱 [Amazon EKS 功能 IAM 角色](capability-role.md)。

**重要**  
ACK 是一種基礎設施管理功能，可授予建立、修改和刪除 AWS 資源的能力。這是應謹慎控制的管理員範圍功能。有權在叢集中建立 Kubernetes 資源的任何人都可以有效透過 ACK 建立 AWS 資源，但需受 IAM 功能角色許可的約束。您提供的 IAM 功能角色會決定 ACK 可以建立和管理哪些 AWS 資源。如需建立具有最低權限許可之適當角色的指引，請參閱 [Amazon EKS 功能 IAM 角色](capability-role.md)和 [EKS 功能的安全考量](capabilities-security.md)。

## 選擇您的工具
<a name="_choose_your_tool"></a>

您可以使用、 AWS 管理主控台 AWS CLI 或 eksctl 建立 ACK 功能：
+  [使用主控台建立 ACK 功能](ack-create-console.md) - 使用 主控台進行引導式體驗
+  [使用 CLI 建立 ACK AWS 功能](ack-create-cli.md) - 使用 AWS CLI 進行指令碼編寫和自動化
+  [使用 eksctl 建立 ACK 功能](ack-create-eksctl.md) - 使用 eksctl 進行 Kubernetes 原生體驗

## 建立 ACK 功能時會發生什麼情況
<a name="_what_happens_when_you_create_an_ack_capability"></a>

當您建立 ACK 功能時：

1. EKS 會建立 ACK 功能服務，並將其設定為監控和管理叢集中的資源

1. 您的叢集中已安裝自訂資源定義 (CRDs)

1. 會自動為您的 IAM 功能角色建立存取項目，其中包含授予基準 Kubernetes 許可的特定功能存取項目政策 （請參閱 [EKS 功能的安全考量](capabilities-security.md))

1. 該功能假設您提供的 IAM 功能角色

1. ACK 開始在您的叢集中監看其自訂資源

1. 功能狀態從 變更為 `CREATING` `ACTIVE` 

啟用後，您可以在叢集中建立 ACK 自訂資源來管理 AWS 資源。

**注意**  
自動建立的存取項目包含授予 ACK 管理 AWS 資源許可`AmazonEKSACKPolicy`的 。有些參考 Kubernetes 秘密的 ACK 資源 （例如具有密碼的 RDS 資料庫） 需要額外的存取項目政策。若要進一步了解存取項目以及如何設定其他許可，請參閱 [EKS 功能的安全考量](capabilities-security.md)。

## 後續步驟
<a name="_next_steps"></a>

建立 ACK 功能之後：
+  [ACK 概念](ack-concepts.md) - 了解 ACK 概念並開始使用 AWS 資源
+  [ACK 概念](ack-concepts.md) - 了解對帳、欄位匯出和資源採用模式
+  [設定 ACK 許可](ack-permissions.md) - 設定 IAM 許可和多帳戶模式

# 使用主控台建立 ACK 功能
<a name="ack-create-console"></a>

本主題說明如何使用 建立 Kubernetes 專用 AWS 控制器 (ACK) 功能 AWS 管理主控台。

## 建立 ACK 功能
<a name="_create_the_ack_capability"></a>

1. 在以下網址開啟 Amazon EKS 主控台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 選取您的叢集名稱以開啟叢集詳細資訊頁面。

1. 選擇**功能**索引標籤。

1. 在左側導覽中，選擇 **Kubernetes (ACK) 的 AWS 控制器**。

1. 選擇**建立 Kubernetes 功能的 AWS 控制器**。

1. 對於 **IAM 功能角色**：
   + 如果您已經有 IAM 功能角色，請從下拉式清單中選取它
   + 如果您需要建立角色，請選擇**建立管理員角色** 

     這會在新標籤中開啟 IAM 主控台，其中包含預先填入的信任政策和 `AdministratorAccess`受管政策。您可以取消選取此政策，並視需要新增其他許可。

     建立角色後，返回 EKS 主控台並自動選取角色。
**重要**  
建議`AdministratorAccess`的政策授予廣泛的許可，旨在簡化入門。針對生產用途，請以自訂政策取代此政策，該政策僅授予您計劃使用 ACK 管理之特定 AWS 服務所需的許可。如需建立最低權限政策的指引，請參閱 [設定 ACK 許可](ack-permissions.md)和 [EKS 功能的安全考量](capabilities-security.md)。

1. 選擇**建立**。

功能建立程序開始。

## 驗證功能是否處於作用中狀態
<a name="_verify_the_capability_is_active"></a>

1. 在**功能**索引標籤上，檢視 ACK 功能狀態。

1. 等待狀態從 變更為 `CREATING` `ACTIVE`。

1. 啟用後，此功能即可使用。

如需功能狀態和故障診斷的資訊，請參閱 [使用 功能資源](working-with-capabilities.md)。

## 確認可用的自訂資源
<a name="_verify_custom_resources_are_available"></a>

功能處於作用中狀態後，請確認叢集中可用的 ACK 自訂資源。

 **使用主控台** 

1. 在 Amazon EKS 主控台中導覽至您的叢集

1. 選擇**資源**索引標籤

1. 選擇**延伸模組** 

1. 選擇 **CustomResourceDefinitions** 

您應該會看到一些針對 AWS 資源列出的 CRDs。

 **使用 kubectl** 

```
kubectl api-resources | grep services.k8s.aws
```

您應該會看到一些針對 AWS 資源列出的 APIs。

**注意**  
適用於 Kubernetes 的 AWS 控制器功能將為各種 AWS 資源安裝多個 CRDs。

## 後續步驟
<a name="_next_steps"></a>
+  [ACK 概念](ack-concepts.md) - 了解 ACK 概念並開始使用
+  [設定 ACK 許可](ack-permissions.md) - 設定其他服務的 IAM 許可 AWS 
+  [使用 功能資源](working-with-capabilities.md) - 管理您的 ACK 功能資源

# 使用 CLI 建立 ACK AWS 功能
<a name="ack-create-cli"></a>

本主題說明如何使用 CLI 建立 AWS Controllers for Kubernetes (ACK) AWS 功能。

## 先決條件
<a name="_prerequisites"></a>
+  ** AWS CLI** – 版本 `2.12.3` 或更新版本。若要檢查您的版本，請執行 `aws --version`。如需詳細資訊，請參閱《 AWS 命令列界面使用者指南》中的[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。
+  ** `kubectl` **：命令列工具，適用於使用 Kubernetes 叢集。如需詳細資訊，請參閱[設定 `kubectl` 和 `eksctl`](install-kubectl.md)。

## 步驟 1：建立 IAM 功能角色
<a name="_step_1_create_an_iam_capability_role"></a>

建立信任政策檔案：

```
cat > ack-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

建立 IAM 角色：

```
aws iam create-role \
  --role-name ACKCapabilityRole \
  --assume-role-policy-document file://ack-trust-policy.json
```

將 `AdministratorAccess`受管政策連接至角色：

```
aws iam attach-role-policy \
  --role-name ACKCapabilityRole \
  --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
```

**重要**  
建議`AdministratorAccess`的政策授予廣泛的許可，旨在簡化入門。對於生產用途，請以自訂政策取代此政策，該政策僅授予您計劃使用 ACK 管理之特定 AWS 服務所需的許可。如需建立最低權限政策的指引，請參閱 [設定 ACK 許可](ack-permissions.md)和 [EKS 功能的安全考量](capabilities-security.md)。

## 步驟 2：建立 ACK 功能
<a name="_step_2_create_the_ack_capability"></a>

在叢集上建立 ACK 功能資源。將 *region-code* 取代為您的叢集所在的 AWS 區域，並將 *my-cluster* 取代為您的叢集名稱。

```
aws eks create-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-ack \
  --type ACK \
  --role-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/ACKCapabilityRole \
  --delete-propagation-policy RETAIN
```

命令會立即傳回，但當 EKS 建立所需的功能基礎設施和元件時，功能需要一些時間才會變成作用中。EKS 會在建立叢集時，在叢集中安裝與此功能相關的 Kubernetes 自訂資源定義。

**注意**  
如果您收到叢集不存在或您沒有許可的錯誤，請驗證：  
叢集名稱正確
您的 AWS CLI 已設定為正確的區域
您擁有必要的 IAM 許可

## 步驟 3：確認功能處於作用中狀態
<a name="_step_3_verify_the_capability_is_active"></a>

等待 功能變成作用中。將 *region-code* 取代為您的叢集所在的 AWS 區域，並將 *my-cluster* 取代為您的叢集名稱。

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-ack \
  --query 'capability.status' \
  --output text
```

當狀態顯示 時，此功能已就緒`ACTIVE`。在狀態為 之前，請勿繼續下一個步驟`ACTIVE`。

您也可以檢視完整的功能詳細資訊：

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-ack
```

## 步驟 4：確認可用的自訂資源
<a name="_step_4_verify_custom_resources_are_available"></a>

功能處於作用中狀態後，請確認叢集中是否有可用的 ACK 自訂資源：

```
kubectl api-resources | grep services.k8s.aws
```

您應該會看到一些針對 AWS 資源列出的 APIs。

**注意**  
適用於 Kubernetes 的 AWS 控制器功能將為各種 AWS 資源安裝多個 CRDs。

## 後續步驟
<a name="_next_steps"></a>
+  [ACK 概念](ack-concepts.md) - 了解 ACK 概念並開始使用
+  [設定 ACK 許可](ack-permissions.md) - 設定其他服務的 IAM 許可 AWS 
+  [使用 功能資源](working-with-capabilities.md) - 管理您的 ACK 功能資源

# 使用 eksctl 建立 ACK 功能
<a name="ack-create-eksctl"></a>

本主題說明如何使用 eksctl 建立 AWS Controllers for Kubernetes (ACK) 功能。

**注意**  
下列步驟需要 eksctl 版本 `0.220.0` 或更新版本。若要檢查您的版本，請執行 `eksctl version`。

## 步驟 1：建立 IAM 功能角色
<a name="_step_1_create_an_iam_capability_role"></a>

建立信任政策檔案：

```
cat > ack-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

建立 IAM 角色：

```
aws iam create-role \
  --role-name ACKCapabilityRole \
  --assume-role-policy-document file://ack-trust-policy.json
```

將 `AdministratorAccess`受管政策連接至角色：

```
aws iam attach-role-policy \
  --role-name ACKCapabilityRole \
  --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
```

**重要**  
建議`AdministratorAccess`的政策授予廣泛的許可，旨在簡化入門。對於生產用途，請以自訂政策取代此政策，該政策僅授予您計劃使用 ACK 管理之特定 AWS 服務所需的許可。如需建立最低權限政策的指引，請參閱 [設定 ACK 許可](ack-permissions.md)和 [EKS 功能的安全考量](capabilities-security.md)。

**重要**  
此政策使用 授予 S3 儲存貯體管理的許可`"Resource": "*"`，允許對所有 S3 儲存貯體執行操作。  
對於生產用途：\$1 將 `Resource` 欄位限制為特定儲存貯體 ARNs或名稱模式 \$1 使用 IAM 條件索引鍵來限制資源標籤的存取 \$1 僅授予使用案例所需的最低許可  
如需其他服務 AWS ，請參閱 [設定 ACK 許可](ack-permissions.md)。

將政策連接到角色：

```
aws iam attach-role-policy \
  --role-name ACKCapabilityRole \
  --policy-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):policy/ACKS3Policy
```

## 步驟 2：建立 ACK 功能
<a name="_step_2_create_the_ack_capability"></a>

使用 eksctl 建立 ACK 功能。將 *region-code* 取代為您的叢集所在的 AWS 區域，並將 *my-cluster* 取代為您的叢集名稱。

```
eksctl create capability \
  --cluster [.replaceable]`my-cluster` \
  --region [.replaceable]`region-code` \
  --name ack \
  --type ACK \
  --role-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/ACKCapabilityRole \
  --ack-service-controllers s3
```

**注意**  
`--ack-service-controllers` 旗標為選用。如果省略，ACK 會啟用所有可用的控制器。為了獲得更好的效能和安全性，請考慮僅啟用您需要的控制器。您可以指定多個控制器： `--ack-service-controllers s3,rds,dynamodb`

命令會立即傳回，但 功能需要一些時間才會變成作用中。

## 步驟 3：確認功能處於作用中狀態
<a name="_step_3_verify_the_capability_is_active"></a>

檢查功能狀態：

```
eksctl get capability \
  --cluster [.replaceable]`my-cluster` \
  --region [.replaceable]`region-code` \
  --name ack
```

當狀態顯示 時，此功能已就緒`ACTIVE`。

## 步驟 4：確認可用的自訂資源
<a name="_step_4_verify_custom_resources_are_available"></a>

功能處於作用中狀態後，請確認叢集中是否有可用的 ACK 自訂資源：

```
kubectl api-resources | grep services.k8s.aws
```

您應該會看到一些針對 AWS 資源列出的 APIs。

**注意**  
適用於 Kubernetes 的 AWS 控制器功能將為各種 AWS 資源安裝多個 CRDs。

## 後續步驟
<a name="_next_steps"></a>
+  [ACK 概念](ack-concepts.md) - 了解 ACK 概念並開始使用
+  [設定 ACK 許可](ack-permissions.md) - 設定其他服務的 IAM 許可 AWS 
+  [使用 功能資源](working-with-capabilities.md) - 管理您的 ACK 功能資源

# ACK 概念
<a name="ack-concepts"></a>

ACK 透過 Kubernetes APIs 持續協調資訊清單中的所需狀態與實際狀態，來管理 AWS 資源 AWS。當您建立或更新 Kubernetes 自訂資源時，ACK 會進行必要的 AWS API 呼叫來建立或修改對應的 AWS 資源，然後監控資源是否有偏離，並更新 Kubernetes 狀態以反映目前的狀態。此方法可讓您使用熟悉的 Kubernetes 工具和工作流程來管理基礎設施，同時保持叢集與 之間的一致性 AWS。

本主題說明 ACK 如何透過 Kubernetes APIs 管理 AWS 資源的基本概念。

## ACK 入門
<a name="_getting_started_with_ack"></a>

建立 ACK 功能後 （請參閱 [建立 ACK 功能](create-ack-capability.md))，您可以開始使用叢集中的 Kubernetes 資訊清單來管理 AWS 資源。

例如，在 中建立此 S3 儲存貯體資訊清單`bucket.yaml`，選擇您自己的唯一儲存貯體名稱。

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-test-bucket
  namespace: default
spec:
  name: my-unique-bucket-name-12345
```

套用資訊清單：

```
kubectl apply -f bucket.yaml
```

檢查狀態：

```
kubectl get bucket my-test-bucket
kubectl describe bucket my-test-bucket
```

驗證儲存貯體是否已在 中建立 AWS：

```
aws s3 ls | grep my-unique-bucket-name-12345
```

刪除 Kubernetes 資源：

```
kubectl delete bucket my-test-bucket
```

確認儲存貯體已從下列位置刪除 AWS：

```
aws s3 ls | grep my-unique-bucket-name-12345
```

儲存貯體不應再出現在清單中，示範 ACK 會管理 AWS 資源的完整生命週期。

如需 ACK 入門的詳細資訊，請參閱 [ACK 入門](https://aws-controllers-k8s.github.io/community/docs/user-docs/getting-started/)。

## 資源生命週期和對帳
<a name="_resource_lifecycle_and_reconciliation"></a>

ACK 使用持續對帳迴圈，確保您的 AWS 資源符合 Kubernetes 資訊清單中定義的所需狀態。

 **對帳的運作方式**：

1. 您可以建立或更新 Kubernetes 自訂資源 （例如 S3 儲存貯體）

1. ACK 會偵測變更，並將所需的狀態與 中的實際狀態進行比較 AWS 

1. 如果不同，ACK 會呼叫 AWS API 以協調差異

1. ACK 會更新 Kubernetes 中的資源狀態，以反映目前狀態

1. 迴圈會持續重複，通常每隔幾小時重複一次

當您建立新的 Kubernetes 資源、更新現有資源的 ，或當 ACK AWS 從 ACK 外部的手動變更偵測到偏離時`spec`，就會觸發調校。此外，ACK 會在 10 小時的重新同步期間執行定期調校。Kubernetes 資源的變更會觸發立即對帳，而上游 AWS 資源變更的被動偏離偵測則會在定期重新同步期間發生。

處理上述入門範例時，ACK 會執行下列步驟：

1. 檢查儲存貯體是否存在於 AWS 

1. 如果沒有， 會呼叫 `s3:CreateBucket` 

1. 使用儲存貯體 ARN 和狀態更新 Kubernetes 狀態

1. 繼續監控偏離

若要進一步了解 ACK 的運作方式，請參閱 [ACK 調校](https://aws-controllers-k8s.github.io/community/docs/user-docs/reconciliation/)。

## 狀態條件
<a name="_status_conditions"></a>

ACK 資源使用狀態條件來傳達其狀態。了解這些條件可協助您疑難排解問題並了解資源運作狀態。
+  **就緒**：表示資源已就緒可供使用 （標準化 Kubernetes 條件）。
+  **ACK.ResourceSynced**：表示資源規格符合 AWS 資源狀態。
+  **ACK.Terminal**：表示發生無法復原的錯誤。
+  **ACK.Adopted**：表示資源是從現有資源採用，而不是建立新的 AWS 資源。
+  **ACK.Recoverable**：表示可在不更新規格的情況下解決的可復原錯誤。
+  **ACK.Advisory**：提供有關資源的諮詢資訊。
+  **ACK.LateInitialized**：指出欄位的延遲初始化是否已完成。
+  **ACK.ReferencesResolved**：指出是否已解析所有`AWSResourceReference`欄位。
+  **ACK.IAMRoleSelected**：指出是否已選取 IAMRoleSelector 來管理此資源。

檢查資源狀態：

```
# Check if resource is ready
kubectl get bucket my-bucket -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'

# Check for terminal errors
kubectl get bucket my-bucket -o jsonpath='{.status.conditions[?(@.type=="ACK.Terminal")]}'
```

範例狀態：

```
status:
  conditions:
  - type: Ready
    status: "True"
    lastTransitionTime: "2024-01-15T10:30:00Z"
  - type: ACK.ResourceSynced
    status: "True"
    lastTransitionTime: "2024-01-15T10:30:00Z"
  - type: ACK.Terminal
    status: "True"
  ackResourceMetadata:
    arn: arn:aws:s3:::my-unique-bucket-name
    ownerAccountID: "111122223333"
    region: us-west-2
```

若要進一步了解 ACK 狀態和條件，請參閱 [ACK 條件](https://aws-controllers-k8s.github.io/community/docs/user-docs/conditions/)。

## 刪除政策
<a name="_deletion_policies"></a>

ACK 的刪除政策會控制當您刪除 Kubernetes 資源時 AWS ，資源會發生什麼情況。

 **刪除 （預設）** 

刪除 Kubernetes 資源時會刪除 AWS 資源：這是預設行為。

```
# No annotation needed - this is the default
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: temp-bucket
spec:
  name: temporary-bucket
```

刪除此資源會刪除其中的 S3 儲存貯體 AWS。

 **保留** 

當您刪除 Kubernetes 資源時， AWS 資源會保留：

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: important-bucket
  annotations:
    services.k8s.aws/deletion-policy: "retain"
spec:
  name: production-data-bucket
```

刪除此資源會將其從 Kubernetes 中移除，但會保留 S3 儲存貯體 AWS。

此`retain`政策適用於生產資料庫，這些資料庫應超過 Kubernetes 資源、多個應用程式使用的共用資源、具有不應意外刪除重要資料的資源，或您採用資源的暫時 ACK 管理、進行設定，然後將其釋出給手動管理。

若要進一步了解 ACK 刪除政策，請參閱 [ACK 刪除政策](https://aws-controllers-k8s.github.io/community/docs/user-docs/deletion-policy/)。

## 資源採用
<a name="_resource_adoption"></a>

採用可讓您在 ACK 管理下使用現有 AWS 資源，而無需重新建立這些資源。

何時使用採用：
+ 將現有基礎設施遷移至 ACK 管理
+ 在 Kubernetes 中意外刪除 AWS 資源時復原孤立的資源
+ 匯入其他工具建立的資源 (CloudFormation、Terraform)

採用方式的運作方式：

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: existing-bucket
  annotations:
    services.k8s.aws/adoption-policy: "adopt-or-create"
spec:
  name: my-existing-bucket-name
```

當您建立此資源時：

1. ACK 會檢查具有該名稱的儲存貯體是否存在於 AWS 

1. 如果找到，ACK 會採用它 （沒有要建立的 API 呼叫）

1. ACK 會從 讀取目前的組態 AWS 

1. ACK 會更新 Kubernetes 狀態以反映實際狀態

1. 未來的更新會正常協調資源

採用後，資源會像任何其他 ACK 資源一樣受到管理，除非您使用`retain`刪除政策，否則刪除 Kubernetes 資源將會刪除 AWS 資源。

採用資源時， AWS 資源必須已存在，且 ACK 需要讀取許可才能探索資源。如果資源存在，`adopt-or-create`政策會採用該資源，如果資源不存在，則建立該資源。當您想要可運作資源是否存在的宣告式工作流程時，這會很有用。

若要進一步了解 ACK 資源採用，請參閱 [ACK 資源採用](https://aws-controllers-k8s.github.io/community/docs/user-docs/adopted-resource/)。

## 跨帳戶和跨區域資源
<a name="_cross_account_and_cross_region_resources"></a>

ACK 可以從單一叢集管理不同 AWS 帳戶和區域中的資源。

 **跨區域資源註釋** 

您可以使用 註釋指定 AWS 資源的區域：

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: eu-bucket
  annotations:
    services.k8s.aws/region: eu-west-1
spec:
  name: my-eu-bucket
```

您也可以指定在指定命名空間中建立的所有 AWS 資源的區域：

 **命名空間註釋** 

為命名空間中的所有資源設定預設區域：

```
apiVersion: v1
kind: Namespace
metadata:
  name: production
  annotations:
    services.k8s.aws/default-region: us-west-2
```

在此命名空間中建立的資源會使用此區域，除非以資源層級註釋覆寫。

 **跨帳戶** 

使用 IAM 角色選取器將特定 IAM 角色映射至命名空間：

```
apiVersion: services.k8s.aws/v1alpha1
kind: IAMRoleSelector
metadata:
  name: target-account-config
spec:
  arn: arn:aws:iam::444455556666:role/ACKTargetAccountRole
  namespaceSelector:
    names:
      - production
```

在映射命名空間中建立的資源會自動使用指定的角色。

若要進一步了解 IAM 角色選取器，請參閱 [ACK 跨帳戶資源管理](https://aws-controllers-k8s.github.io/docs/guides/cross-account)。如需跨帳戶組態詳細資訊，請參閱 [設定 ACK 許可](ack-permissions.md)。

## 錯誤處理和重試行為
<a name="_error_handling_and_retry_behavior"></a>

ACK 會自動處理暫時性錯誤並重試失敗的操作。

重試策略：
+ 暫時性錯誤 （速率限制、暫時性服務問題、許可不足） 觸發自動重試
+ 指數退避可防止壓倒 AWS APIs
+ 重試嘗試次數上限因錯誤類型而異
+ 永久錯誤 （無效的參數、資源名稱衝突） 不會重試

使用 檢查資源狀態的錯誤詳細資訊`kubectl describe`：

```
kubectl describe bucket my-bucket
```

尋找包含錯誤訊息的狀態條件、顯示最近調校嘗試的事件，以及狀態條件中解釋失敗的 `message` 欄位。常見的錯誤包括 IAM 許可不足、資源名稱衝突 AWS、 中的組態值無效`spec`，以及超出 AWS 服務配額。

如需常見錯誤的疑難排解，請參閱 [對 ACK 功能的問題進行故障診斷](ack-troubleshooting.md)。

## kro 的資源合成
<a name="_resource_composition_with_kro"></a>

若要編寫和連接多個 ACK 資源，請使用適用於 kro 的 EKS 功能 (Kube Resource Orchestrator)。kro 提供宣告式方法來定義資源群組，直接在資源之間傳遞組態以管理複雜的基礎設施模式。

如需使用 ACK 資源建立自訂資源組合的詳細範例，請參閱 [kro 概念](kro-concepts.md) 

## 後續步驟
<a name="_next_steps"></a>
+  [EKS 的 ACK 考量事項](ack-considerations.md) - EKS 特定的模式和整合策略

# 設定 ACK 許可
<a name="ack-permissions"></a>

ACK 需要 IAM 許可，才能代表您建立和管理 AWS 資源。本主題說明 IAM 如何與 ACK 搭配使用，並提供設定不同使用案例許可的指引。

## IAM 如何與 ACK 搭配使用
<a name="_how_iam_works_with_ack"></a>

ACK 使用 IAM 角色對 資源進行身分驗證 AWS 和執行動作。提供許可給 ACK 的方式有兩種：

 **功能角色**：您在建立 ACK 功能時提供的 IAM 角色。根據預設，所有 ACK 操作都會使用此角色。

 **IAM 角色選取器**：可映射至特定命名空間或資源的其他 IAM 角色。這些角色會覆寫其範圍內資源的功能角色。

當 ACK 需要建立或管理資源時，它會決定要使用的 IAM 角色：

1. 檢查 IAMRoleSelector 是否符合資源的命名空間

1. 如果找到相符項目，請擔任該 IAM 角色

1. 否則，請使用 功能角色

此方法可實現從簡單的單一角色設定到複雜多帳戶、多團隊組態的彈性許可管理。

## 入門：簡易許可設定
<a name="_getting_started_simple_permission_setup"></a>

對於開發、測試或簡單使用案例，您可以將所有必要的服務許可直接新增至功能角色。

此方法在下列情況下運作良好：
+ 您即將開始使用 ACK
+ 所有資源都在同一個 AWS 帳戶中
+ 單一團隊管理所有 ACK 資源
+ 您信任所有 ACK 使用者都具有相同的許可

## 生產最佳實務：IAM 角色選取器
<a name="_production_best_practice_iam_role_selectors"></a>

對於生產環境，請使用 IAM 角色選取器實作最低權限存取和命名空間層級隔離。

使用 IAM 角色選取器時，功能角色只需要 `sts:AssumeRole`和 `sts:TagSession`許可，即可擔任服務特定的角色。您不需要將任何 AWS 服務許可 （例如 S3 或 RDS) 新增至功能角色本身，這些許可會授予功能角色擔任的個別 IAM 角色。

 **在許可模型之間進行選擇**：

在下列情況下使用**直接許可** （將服務許可新增至功能角色）：
+ 您正在開始使用，並想要最簡單的設定
+ 所有資源都與您的叢集位於相同的帳戶
+ 您有全叢集的管理許可要求
+ 所有團隊都可以共用相同的許可

在下列情況下使用 **IAM 角色選取器**：
+ 跨多個 AWS 帳戶管理資源
+ 不同的團隊或命名空間需要不同的許可
+ 您需要每個命名空間的精細存取控制
+ 您想要遵循最低權限的安全實務

您可以從直接許可開始，並在需求增加之後遷移至 IAM 角色選取器。

 **為什麼要在生產環境中使用 IAM 角色選取器：**
+  **最低權限**：每個命名空間只會取得所需的許可
+  **團隊隔離**：團隊 A 不會意外使用團隊 B 的許可
+  **更容易稽核**：明確映射命名空間使用哪個角色
+  **跨帳戶支援**：管理多個帳戶中的資源時需要
+  **問題分離**：不同的服務或環境使用不同的角色

### 基本 IAM 角色選取器設定
<a name="_basic_iam_role_selector_setup"></a>

 **步驟 1：建立服務特定的 IAM 角色** 

建立具有特定 AWS 服務許可的 IAM 角色：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": "*"
    }
  ]
}
```

設定信任政策以允許能力角色擔任它：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/ACKCapabilityRole"
      },
      "Action": ["sts:AssumeRole", "sts:TagSession"]
    }
  ]
}
```

 **步驟 2：將 AssumeRole 許可授予能力角色** 

將許可新增至 功能角色以擔任服務特定角色：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["sts:AssumeRole", "sts:TagSession"],
      "Resource": "arn:aws:iam::111122223333:role/ACK-S3-Role"
    }
  ]
}
```

 **步驟 3：建立 IAMRoleSelector** 

將 IAM 角色映射至命名空間：

```
apiVersion: services.k8s.aws/v1alpha1
kind: IAMRoleSelector
metadata:
  name: s3-namespace-config
spec:
  arn: arn:aws:iam::111122223333:role/ACK-S3-Role
  namespaceSelector:
    names:
      - s3-resources
```

 **步驟 4：在映射的命名空間中建立資源** 

`s3-resources` 命名空間中的資源會自動使用指定的角色：

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-bucket
  namespace: s3-resources
spec:
  name: my-production-bucket
```

## 多帳戶管理
<a name="_multi_account_management"></a>

使用 IAM 角色選取器來管理多個 AWS 帳戶的資源。

 **步驟 1：建立跨帳戶 IAM 角色** 

在目標帳戶 (444455556666 中，建立信任來源帳戶能力角色的角色：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/ACKCapabilityRole"
      },
      "Action": ["sts:AssumeRole", "sts:TagSession"]
    }
  ]
}
```

將服務特定的許可連接到此角色。

 **步驟 2：授予 AssumeRole 許可** 

在來源帳戶 (111122223333 中，允許能力角色擔任目標帳戶角色：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["sts:AssumeRole", "sts:TagSession"],
      "Resource": "arn:aws:iam::444455556666:role/ACKTargetAccountRole"
    }
  ]
}
```

 **步驟 3：建立 IAMRoleSelector** 

將跨帳戶角色映射至命名空間：

```
apiVersion: services.k8s.aws/v1alpha1
kind: IAMRoleSelector
metadata:
  name: production-account-config
spec:
  arn: arn:aws:iam::444455556666:role/ACKTargetAccountRole
  namespaceSelector:
    names:
      - production
```

 **步驟 4：建立資源** 

`production` 命名空間中的資源會在目標帳戶中建立：

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-bucket
  namespace: production
spec:
  name: my-cross-account-bucket
```

## 工作階段標籤
<a name="_session_tags"></a>

EKS ACK 功能會自動在所有 AWS API 請求上設定工作階段標籤。這些標籤透過識別每個請求的來源來啟用精細存取控制和稽核。

### 可用的工作階段標籤
<a name="_available_session_tags"></a>

ACK 所做的每個 AWS API 呼叫都會包含下列工作階段標籤：


| 標籤索引鍵 | Description | 
| --- | --- | 
|   `eks:eks-capability-arn`   |  提出請求之 EKS 功能的 ARN  | 
|   `eks:kubernetes-namespace`   |  受管資源的 Kubernetes 命名空間  | 
|   `eks:kubernetes-api-group`   |  資源的 Kubernetes API 群組 （例如 `s3.services.k8s.aws`)  | 

### 使用工作階段標籤進行存取控制
<a name="_using_session_tags_for_access_control"></a>

您可以在 IAM 政策條件下使用這些工作階段標籤，以限制 ACK 可以管理哪些資源。這除了以命名空間為基礎的 IAM 角色選取器之外，還提供額外的安全層。

 **範例：依命名空間限制** 

只有在請求來自`production`命名空間時，才允許 ACK 建立 S3 儲存貯體：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:CreateBucket",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/eks:kubernetes-namespace": "production"
        }
      }
    }
  ]
}
```

 **範例：依功能限制** 

僅允許來自特定 ACK 功能的動作：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/eks:eks-capability-arn": "arn:aws:eks:us-west-2:111122223333:capability/my-cluster/ack/my-ack"
        }
      }
    }
  ]
}
```

**注意**  
工作階段標籤與自我管理 ACK 不同，其預設不會設定這些標籤。這可透過 受管功能啟用更精細的存取控制。

## 進階 IAM 角色選取器模式
<a name="_advanced_iam_role_selector_patterns"></a>

如需進階組態，包括標籤選擇器、資源特定角色映射和其他範例，請參閱 [ACK IRSA 文件](https://aws-controllers-k8s.github.io/community/docs/user-docs/irsa/)。

## 後續步驟
<a name="_next_steps"></a>
+  [ACK 概念](ack-concepts.md) - 了解 ACK 概念和資源生命週期
+  [ACK 概念](ack-concepts.md) - 了解資源採用和刪除政策
+  [EKS 功能的安全考量](capabilities-security.md) - 了解 功能的安全最佳實務

# EKS 的 ACK 考量事項
<a name="ack-considerations"></a>

本主題涵蓋使用 ACK 的 EKS 功能的重要考量，包括 IAM 組態、多帳戶模式，以及與其他 EKS 功能的整合。

## IAM 組態模式
<a name="_iam_configuration_patterns"></a>

ACK 功能使用 IAM 功能角色進行身分驗證 AWS。根據您的需求選擇正確的 IAM 模式。

### 簡單：單一功能角色
<a name="_simple_single_capability_role"></a>

對於開發、測試或簡單使用案例，請將所有必要的許可直接授予能力角色。

 **使用時機**：
+ ACK 入門
+ 單一帳戶部署
+ 由一個團隊管理的所有資源
+ 開發和測試環境

 **範例**：使用資源標記條件將 S3 和 RDS 許可新增至您的能力角色：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": ["us-west-2", "us-east-1"]
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": ["rds:*"],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": ["us-west-2", "us-east-1"]
        },
      }
    }
  ]
}
```

此範例會將 S3 和 RDS 操作限制在特定區域，並要求 RDS 資源具有`ManagedBy: ACK`標籤。

### 生產：IAM 角色選取器
<a name="_production_iam_role_selectors"></a>

對於生產環境，請使用 IAM 角色選取器實作最低權限存取和命名空間層級隔離。

 **使用時機**：
+ 生產環境
+ 多團隊叢集
+ 多帳戶資源管理
+ 最低權限的安全需求
+ 不同的服務需要不同的許可

 **優點**：
+ 每個命名空間只會取得所需的許可
+ 團隊隔離 - 團隊 A 無法使用團隊 B 的許可
+ 更輕鬆地稽核和合規
+ 跨帳戶資源管理的必要項目

如需詳細的 IAM 角色選取器組態，請參閱 [設定 ACK 許可](ack-permissions.md)。

## 與其他 EKS 功能整合
<a name="_integration_with_other_eks_capabilities"></a>

### 使用 Argo CD 的 GitOps
<a name="_gitops_with_argo_cd"></a>

使用適用於 Argo CD 的 EKS 功能從 Git 儲存庫部署 ACK 資源，啟用基礎設施管理的 GitOps 工作流程。

 **考量：**
+ 將 ACK 資源與end-to-end GitOps 的應用程式資訊清單一起存放
+ 根據您的團隊結構，依環境、服務或資源類型進行組織
+ 使用 Argo CD 的自動同步進行持續調校
+ 啟用剔除以自動移除已刪除的資源
+ 考慮多叢集基礎設施管理的hub-and-spoke模式

GitOps 提供稽核追蹤、復原功能和宣告式基礎設施管理。如需 Argo CD 的詳細資訊，請參閱[使用 Argo CD](working-with-argocd.md)。

### kro 的資源合成
<a name="_resource_composition_with_kro"></a>

使用 kro 的 EKS 功能 (Kube Resource Orchestrator)，將多個 ACK 資源組成更高層級的抽象和自訂 APIs。

 **何時搭配 ACK 使用 kro**：
+ 為常見的基礎設施堆疊建立可重複使用的模式 （資料庫 \$1 備份 \$1 監控）
+ 為應用程式團隊建置具有簡化 APIs自助式平台
+ 管理資源相依性，並在資源之間傳遞值 (S3 儲存貯體 ARN 至 Lambda 函數）
+ 標準化跨團隊的基礎設施組態
+ 透過隱藏自訂資源後方的實作詳細資訊來降低複雜性

 **範例模式**：
+ 應用程式堆疊：S3 儲存貯體 \$1 SQS 佇列 \$1 通知組態
+ 資料庫設定：RDS 執行個體 \$1 參數群組 \$1 安全群組 \$1 秘密
+ 網路：VPC \$1 子網路 \$1 路由表 \$1 安全群組

kro 會處理編寫資源的相依性排序、狀態傳播和生命週期管理。如需 kro 的詳細資訊，請參閱[kro 概念](kro-concepts.md)。

## 組織您的 資源
<a name="_organizing_your_resources"></a>

使用 Kubernetes 命名空間和資源標籤組織 ACK AWS 資源，以獲得更好的管理、存取控制和成本追蹤。

### 命名空間組織
<a name="_namespace_organization"></a>

使用 Kubernetes 命名空間，以邏輯方式依環境 （生產、預備、開發）、團隊 （平台、資料、ml) 或應用程式分隔 ACK 資源。

 **優點**：
+ 用於存取控制的命名空間範圍 RBAC
+ 使用註釋設定每個命名空間的預設區域
+ 更輕鬆地進行資源管理和清理
+ 符合組織結構的邏輯分隔

### 資源標記
<a name="_resource_tagging"></a>

EKS ACK 功能會自動將預設標籤套用至其建立的所有 AWS 資源。這些標籤與自我管理的 ACK 不同，並提供增強的可追蹤性。

 **功能套用的預設標籤**：


| 標籤索引鍵 | Description | 
| --- | --- | 
|   `eks:controller-version`   |  ACK 控制器的版本  | 
|   `eks:kubernetes-namespace`   |  ACK 資源的 Kubernetes 命名空間  | 
|   `eks:kubernetes-resource-name`   |  Kubernetes 資源的名稱  | 
|   `eks:kubernetes-api-group`   |  Kubernetes API 群組 （例如 `s3.services.k8s.aws`)  | 
|   `eks:eks-capability-arn`   |  EKS ACK 功能的 ARN  | 

**注意**  
自我管理 ACK 使用不同的預設標籤： `services.k8s.aws/controller-version`和 `services.k8s.aws/namespace`。功能的標籤使用 `eks:`字首，以與其他 EKS 功能保持一致。

 **其他建議標籤**：

為成本分配、所有權追蹤和組織用途新增自訂標籤：
+ 環境 （生產、預備、開發）
+ 團隊或部門擁有權
+ 帳單分配的成本中心
+ 應用程式或服務名稱

## 從其他Infrastructure-as-code工具遷移
<a name="_migration_from_other_infrastructure_as_code_tools"></a>

許多組織發現在 Kubernetes 上標準化工作負載協同運作之外的價值。將基礎設施 AWS 和資源管理遷移到 ACK 可讓您使用 Kubernetes APIs 和應用程式工作負載來標準化基礎設施管理。

 **在適用於基礎設施的 Kubernetes 上標準化的優勢**：
+  **單一事實來源**：在 Kubernetes 中管理應用程式和基礎設施，實現end-to-end GitOps 實務
+  **統一工具**：團隊使用 Kubernetes 資源和工具，而不是學習多個工具和架構
+  **一致的對帳**：ACK 會持續對 Kubernetes 對工作負載所做的 AWS 資源進行對帳，並與必要工具相比，偵測和修正偏離
+  **原生組成**：使用 kro 和 ACK， AWS 直接在應用程式和資源資訊清單中參考資源，在資源之間傳遞連線字串和 ARNs 
+  **簡化的操作**：在整個系統中部署、復原和可觀測性的單一控制平面

ACK 支援採用現有的 AWS 資源，無需重新建立這些資源，可從 CloudFormation、Terraform 或叢集外部的資源進行零停機時間遷移。

 **採用現有資源**：

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: existing-bucket
  annotations:
    services.k8s.aws/adoption-policy: "adopt-or-create"
spec:
  name: my-existing-bucket-name
```

一旦採用，資源將由 ACK 管理，並且可以透過 Kubernetes 資訊清單進行更新。您可以逐步遷移，視需要採用資源，同時維護其他資源的現有 IaC 工具。

ACK 也支援唯讀資源。對於您希望參考但未修改的其他團隊或工具管理的資源，請將採用與`retain`刪除政策結合，並僅授予讀取 IAM 許可。這可讓應用程式透過 Kubernetes API 探索共用基礎設施 (VPCs、IAM 角色、KMS 金鑰），而不會有修改的風險。 APIs 

如需資源採用的詳細資訊，請參閱[ACK 概念](ack-concepts.md)。

## 刪除政策
<a name="_deletion_policies"></a>

當您刪除對應的 AWS Kubernetes 資源時，刪除政策會控制資源會發生的情況。根據資源生命週期和您的操作需求，選擇正確的政策。

### 刪除 （預設）
<a name="_delete_default"></a>

 AWS 刪除 Kubernetes 資源時會刪除資源。這可維持叢集與 之間的一致性 AWS，確保資源不會累積。

 **何時使用刪除**：
+ 清理很重要的開發和測試環境
+ 與應用程式生命週期繫結的暫時性資源 （測試資料庫、臨時儲存貯體）
+ 不應讓應用程式過期的資源 (SQS 佇列、ElastiCache 叢集）
+ 成本最佳化 - 自動清除未使用的資源
+ 使用 GitOps 管理的環境，其中從 Git 移除資源應刪除基礎設施

預設刪除政策符合 Kubernetes 的宣告式模型：叢集中的內容符合 中存在的內容 AWS。

### 保留
<a name="_retain"></a>

當您刪除 Kubernetes 資源時， AWS 會保留資源。這可保護關鍵資料，並允許資源超過其 Kubernetes 表示。

 **何時使用 保留**：
+ 生產資料庫具有必須承受叢集變更的關鍵資料
+ 具有合規或稽核要求的長期儲存貯體
+ 多個應用程式或團隊使用的共用資源
+ 要遷移至不同管理工具的資源
+ 您希望保留基礎設施的災難復原案例
+ 具有複雜相依性的資源需要謹慎解除委任

```
apiVersion: rds.services.k8s.aws/v1alpha1
kind: DBInstance
metadata:
  name: production-db
  annotations:
    services.k8s.aws/deletion-policy: "retain"
spec:
  dbInstanceIdentifier: prod-db
  # ... configuration
```

**重要**  
保留的資源會持續產生 AWS 成本，且必須在不再需要 AWS 時從 手動刪除。使用資源標記來追蹤保留的資源以進行清除。

如需刪除政策的詳細資訊，請參閱 [ACK 概念](ack-concepts.md)。

## 上游文件
<a name="_upstream_documentation"></a>

如需使用 ACK 的詳細資訊：
+  [ACK 使用指南](https://aws-controllers-k8s.github.io/community/docs/user-docs/usage/) - 建立和管理資源
+  [ACK API 參考](https://aws-controllers-k8s.github.io/community/reference/) - 所有服務的完整 API 文件
+  [ACK 文件](https://aws-controllers-k8s.github.io/community/docs/) - 完整的使用者文件

## 後續步驟
<a name="_next_steps"></a>
+  [設定 ACK 許可](ack-permissions.md) - 設定 IAM 許可和多帳戶模式
+  [ACK 概念](ack-concepts.md) - 了解 ACK 概念和資源生命週期
+  [對 ACK 功能的問題進行故障診斷](ack-troubleshooting.md) - 故障診斷 ACK 問題
+  [使用 Argo CD](working-with-argocd.md) - 使用 GitOps 部署 ACK 資源
+  [kro 概念](kro-concepts.md) - 將 ACK 資源編寫為更高層級的抽象概念

# 對 ACK 功能的問題進行故障診斷
<a name="ack-troubleshooting"></a>

本主題提供 ACK 的 EKS 功能疑難排解指引，包括功能運作狀態檢查、資源狀態驗證和 IAM 許可問題。

**注意**  
EKS 功能是完全受管的，並在叢集外部執行。您無法存取控制器日誌或控制器命名空間。故障診斷著重於功能運作狀態、資源狀態和 IAM 組態。

## 功能是 ACTIVE，但資源尚未建立
<a name="_capability_is_active_but_resources_arent_being_created"></a>

如果您的 ACK 功能顯示`ACTIVE`狀態，但未在其中建立資源 AWS，請檢查功能運作狀態、資源狀態和 IAM 許可。

 **檢查功能運作狀態**：

您可以在 EKS 主控台或使用 AWS CLI 檢視功能運作狀態和狀態問題。

 **主控台**：

1. 在以下網址開啟 Amazon EKS 主控台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 選取您的叢集名稱。

1. 選擇**可觀測性**索引標籤。

1. 選擇**監控叢集**。

1. 選擇**功能**索引標籤以檢視所有功能的運作狀態和狀態。

 ** AWS CLI**：

```
# View capability status and health
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-ack

# Look for issues in the health section
```

 **常見原因**：
+  **IAM 許可遺失**：功能角色缺少 AWS 服務的許可
+  **命名空間錯誤**：在命名空間中建立的資源沒有適當的 IAMRoleSelector
+  **無效的資源規格**：檢查資源狀態條件是否有驗證錯誤
+  **API 限流**：達到 AWS API 速率限制
+  **許可 Webhook**：許可 Webhook 封鎖控制器修補資源狀態

 **檢查資源狀態**：

```
# Describe the resource to see conditions and events
kubectl describe bucket my-bucket -n default

# Look for status conditions
kubectl get bucket my-bucket -n default -o jsonpath='{.status.conditions}'

# View resource events
kubectl get events --field-selector involvedObject.name=my-bucket -n default
```

 **驗證 IAM 許可**：

```
# View the Capability Role's policies
aws iam list-attached-role-policies --role-name my-ack-capability-role
aws iam list-role-policies --role-name my-ack-capability-role

# Get specific policy details
aws iam get-role-policy --role-name my-ack-capability-role --policy-name policy-name
```

## 在 中建立 AWS 但未在 Kubernetes 中顯示的資源
<a name="resources_created_in_shared_aws_but_not_showing_in_kubernetes"></a>

ACK 只會追蹤透過 Kubernetes 資訊清單建立的資源。若要使用 ACK 管理現有 AWS 資源，請使用採用功能。

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: existing-bucket
  annotations:
    services.k8s.aws/adoption-policy: "adopt-or-create"
spec:
  name: my-existing-bucket-name
```

如需資源採用的詳細資訊，請參閱[ACK 概念](ack-concepts.md)。

## 未建立跨帳戶資源
<a name="_cross_account_resources_not_being_created"></a>

如果使用 IAM 角色選取器時未在目標 AWS 帳戶中建立資源，請驗證信任關係和 IAMRoleSelector 組態。

 **驗證信任關係**：

```
# Check the trust policy in the target account role
aws iam get-role --role-name cross-account-ack-role --query 'Role.AssumeRolePolicyDocument'
```

信任政策必須允許來源帳戶的 功能角色擔任該角色。

 **確認 IAMRoleSelector 組態**：

```
# List IAMRoleSelectors (cluster-scoped)
kubectl get iamroleselector

# Describe specific selector
kubectl describe iamroleselector my-selector
```

 **驗證命名空間對齊**：

IAMRoleSelectors 是叢集範圍的資源，但以特定命名空間為目標。確保您的 ACK 資源位於符合 IAMRoleSelector 命名空間選擇器的命名空間中：

```
# Check resource namespace
kubectl get bucket my-cross-account-bucket -n production

# List all IAMRoleSelectors (cluster-scoped)
kubectl get iamroleselector

# Check which namespace the selector targets
kubectl get iamroleselector my-selector -o jsonpath='{.spec.namespaceSelector}'
```

 **檢查 IAMRoleSelected 條件**：

檢查`ACK.IAMRoleSelected`條件，確認 IAMRoleSelector 已成功符合您的資源：

```
# Check if IAMRoleSelector was matched
kubectl get bucket my-cross-account-bucket -n production -o jsonpath='{.status.conditions[?(@.type=="ACK.IAMRoleSelected")]}'
```

如果條件為 `False`或遺失，IAMRoleSelector 的命名空間選擇器不符合資源的命名空間。確認選取器的 `namespaceSelector`符合您資源的命名空間標籤。

 **檢查功能角色許可**：

功能角色對目標帳戶角色的需求`sts:AssumeRole`和`sts:TagSession`許可：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["sts:AssumeRole", "sts:TagSession"],
      "Resource": "arn:aws:iam::[.replaceable]`444455556666`:role/[.replaceable]`cross-account-ack-role`"
    }
  ]
}
```

如需跨帳戶組態的詳細資訊，請參閱 [設定 ACK 許可](ack-permissions.md)。

## 後續步驟
<a name="_next_steps"></a>
+  [EKS 的 ACK 考量事項](ack-considerations.md) - ACK 考量事項和最佳實務
+  [設定 ACK 許可](ack-permissions.md) - 設定 IAM 許可和多帳戶模式
+  [ACK 概念](ack-concepts.md) - 了解 ACK 概念和資源生命週期
+  [對 EKS 功能進行故障診斷](capabilities-troubleshooting.md) - 一般功能故障診斷指引

# 比較 ACK 與自我管理 ACK 的 EKS 功能
<a name="ack-comparison"></a>

EKS 的 ACK 功能提供與自我管理 ACK 控制器相同的功能，但具有顯著的操作優勢。如需 EKS 功能與自我管理解決方案的一般比較，請參閱 [EKS 功能考量事項](capabilities-considerations.md)。本主題著重於 ACK 特定的差異。

## 與上游 ACK 的差異
<a name="_differences_from_upstream_ack"></a>

ACK 的 EKS 功能是以上游 ACK 控制器為基礎，但在 IAM 整合中有所不同。

 **IAM 功能角色**：此功能使用專用 IAM 角色搭配信任政策，允許`capabilities.eks.amazonaws.com`服務主體，而不是 IRSA （服務帳戶的 IAM 角色）。您可以直接將 IAM 政策連接至功能角色，而不需要建立或註釋 Kubernetes 服務帳戶或設定 OIDC 供應商。生產使用案例的最佳實務是使用 設定服務許可`IAMRoleSelector`。如需詳細資訊，請參閱[設定 ACK 許可](ack-permissions.md)。

 **工作階段標籤**： 受管功能會自動在所有 AWS API 請求上設定工作階段標籤，啟用精細存取控制和稽核。標籤包括 `eks:eks-capability-arn`、 `eks:kubernetes-namespace`和 `eks:kubernetes-api-group`。這與自我管理的 ACK 不同，其預設不會設定這些標籤。如需在 [設定 ACK 許可](ack-permissions.md) IAM 政策中使用工作階段標籤的詳細資訊，請參閱 。

 **資源標籤**： 功能會將不同的預設標籤套用至 AWS 資源，而非自我管理的 ACK。此功能使用字`eks:`首標籤 （例如 `eks:kubernetes-namespace`、`eks:eks-capability-arn`)，而不是自我管理 ACK 使用的`services.k8s.aws/`標籤。如需預設資源標籤的完整清單，[EKS 的 ACK 考量事項](ack-considerations.md)請參閱 。

 **資源相容性**：ACK 自訂資源的運作方式與上游 ACK 相同，不會變更您的 ACK 資源 YAML 檔案。該功能使用相同的 Kubernetes APIs 和 CRDs，因此 等工具`kubectl`的運作方式相同。支援來自上游 ACK 的所有 GA 控制器和資源。

如需完整的 ACK 文件和服務特定指南，請參閱 [ACK 文件](https://aws-controllers-k8s.github.io/community/)。

## 遷移路徑
<a name="_migration_path"></a>

您可以從自我管理的 ACK 遷移到受管功能，無需停機：

1. 更新您的自我管理 ACK 控制器以`kube-system`用於領導者選擇租用，例如：

   ```
   helm upgrade --install ack-s3-controller \
     oci://public.ecr.aws/aws-controllers-k8s/s3-chart \
     --namespace ack-system \
     --set leaderElection.namespace=kube-system
   ```

   這會將控制器的租用移至 `kube-system`，允許受管功能與其協調。

1. 在叢集上建立 ACK 功能 （請參閱 [建立 ACK 功能](create-ack-capability.md))

1. 受管功能可識別現有的 ACK 受管 AWS 資源並接管對帳

1. 逐步縮減或移除自我管理控制器部署：

   ```
   helm uninstall ack-s3-controller --namespace ack-system
   ```

此方法可讓兩個控制器在遷移期間安全地共存。受管功能會自動採用先前由自我管理控制器管理的資源，確保持續對帳而不會發生衝突。

## 後續步驟
<a name="_next_steps"></a>
+  [建立 ACK 功能](create-ack-capability.md) - 建立 ACK 功能資源
+  [ACK 概念](ack-concepts.md) - 了解 ACK 概念和資源生命週期
+  [設定 ACK 許可](ack-permissions.md) - 設定 IAM 和許可

# 使用 Argo CD 持續部署
<a name="argocd"></a>

Argo CD 是 Kubernetes 的宣告式 GitOps 持續交付工具。使用 Argo CD，您可以自動化跨多個叢集和環境的應用程式部署和生命週期管理。Argo CD 支援多種來源類型，包括 Git 儲存庫、Helm 登錄檔 (HTTP 和 OCI) 和 OCI 映像，為具有不同安全和合規要求的組織提供靈活性。

透過 EKS 功能，Argo CD 完全由 管理 AWS，無需在叢集上安裝、維護和擴展 Argo CD 控制器及其相依性。

## Argo CD 的運作方式
<a name="_how_argo_cd_works"></a>

Argo CD 遵循 GitOps 模式，其中您的應用程式來源 (Git 儲存庫、Helm 登錄檔或 OCI 映像） 是定義所需應用程式狀態的事實來源。當您建立 Argo CD `Application` 資源時，您可以指定包含應用程式資訊清單的來源，以及目標 Kubernetes 叢集和命名空間。Argo CD 會持續監控叢集中的來源和即時狀態，自動同步任何變更，以確保叢集狀態符合所需的狀態。

**注意**  
使用適用於 Argo CD 的 EKS 功能，Argo CD 軟體會在 AWS 控制平面中執行，而不是在您的工作者節點上執行。這表示您的工作者節點不需要直接存取 Git 儲存庫或 Helm 登錄檔，此功能會處理來自 AWS 帳戶的來源存取。

Argo CD 提供三種主要資源類型：
+  **應用程式**：定義從 Git 儲存庫到目標叢集的部署
+  **ApplicationSet**：從多叢集部署的範本產生多個應用程式
+  **AppProject**：提供應用程式的邏輯分組和存取控制

 **範例：建立 Argo CD 應用程式** 

下列範例示範如何建立 Argo CD `Application` 資源：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    targetRevision: HEAD
    path: guestbook
  destination:
    name: in-cluster
    namespace: guestbook
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
```

**注意**  
`destination.name` 使用 與您在註冊叢集時使用的叢集名稱 （例如`in-cluster`本機叢集的 )。`destination.server` 欄位也適用於 EKS 叢集 ARNs，但建議使用叢集名稱以提高可讀性。

## Argo CD 的優點
<a name="_benefits_of_argo_cd"></a>

Argo CD 實作 GitOps 工作流程，您可以在 Git 儲存庫中定義應用程式組態，Argo CD 會自動同步您的應用程式以符合所需的狀態。這種以 Git 為中心的方法提供所有變更的完整稽核線索、輕鬆復原，並自然地與您現有的程式碼檢閱和核准程序整合。Argo CD 會自動偵測並協調 Git 中所需狀態與叢集中實際狀態之間的偏離，確保您的部署與您的宣告組態保持一致。

使用 Argo CD，您可以從單一 Argo CD 執行個體跨多個叢集部署和管理應用程式，簡化多叢集和多區域環境中的操作。Argo CD UI 提供視覺化和監控功能，可讓您檢視應用程式的部署狀態、運作狀態和歷史記錄。UI 與 AWS Identity Center （先前稱為 AWS SSO) 整合，以實現無縫身分驗證和授權，讓您能夠使用現有的身分管理基礎設施來控制存取。

作為 EKS 受管功能的一部分，Argo CD 由 完全管理 AWS，無需安裝、設定和維護 Argo CD 基礎設施。 會 AWS 處理擴展、修補和操作管理，讓您的團隊專注於應用程式交付，而不是工具維護。

## 與 AWS Identity Center 整合
<a name="integration_with_shared_aws_identity_center"></a>

EKS 受管功能提供 Argo CD 和 AWS Identity Center 之間的直接整合，為您的使用者啟用無縫身分驗證和授權。當您啟用 Argo CD 功能時，您可以設定 AWS Identity Center 整合，將 Identity Center 群組和使用者映射至 Argo CD RBAC 角色，讓您控制誰可以存取和管理 Argo CD 中的應用程式。

## 與其他 EKS 受管功能的整合
<a name="_integration_with_other_eks_managed_capabilities"></a>

Argo CD 與其他 EKS 受管功能整合。
+  ** AWS Kubernetes (ACK) 控制器**：使用 Argo CD 管理跨多個叢集的 ACK 資源部署，為您的 AWS 基礎設施啟用 GitOps 工作流程。
+  **kro (Kube Resource Orchestrator)**：使用 Argo CD 跨多個叢集部署 kro 組合，在您的 Kubernetes 資產中實現一致的資源組合。

## Argo CD 入門
<a name="_getting_started_with_argo_cd"></a>

若要開始使用適用於 Argo CD 的 EKS 功能：

1. 建立並設定具有 Argo CD 必要許可的 IAM 功能角色，以存取您的來源和管理應用程式。

1.  透過 AWS 主控台、 AWS CLI 或您偏好的基礎設施做為程式碼工具，在 EKS 叢集上[建立 Argo CD 功能資源](create-argocd-capability.md)。

1. 設定儲存庫存取並註冊叢集以進行應用程式部署。

1. 建立應用程式資源，從您的宣告來源部署應用程式。

# 建立 Argo CD 功能
<a name="create-argocd-capability"></a>

本主題說明如何在 Amazon EKS 叢集上建立 Argo CD 功能。

## 先決條件
<a name="_prerequisites"></a>

建立 Argo CD 功能之前，請確定您有：
+ 執行支援 Kubernetes 版本的現有 Amazon EKS 叢集 （支援標準和延伸支援中的所有版本）
+  ** AWS 已設定身分中心** - Argo CD 身分驗證需要 （不支援本機使用者）
+ 具有 Argo CD 許可的 IAM 功能角色
+ 足夠的 IAM 許可，可在 EKS 叢集上建立功能資源
+  `kubectl` 設定為與您的叢集通訊
+ （選用） 為簡化叢集和儲存庫管理而安裝的 Argo CD CLI
+ （適用於 CLI/eksctl) 安裝和設定適當的 CLI 工具

如需建立 IAM 功能角色的說明，請參閱 [Amazon EKS 功能 IAM 角色](capability-role.md)。如需 Identity Center 設定，請參閱 [AWS Identity Center 入門](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)。

**重要**  
您提供的 IAM 功能角色會決定 Argo CD 可存取 AWS 的資源。這包括透過 CodeConnections 和 Secrets Manager 中的秘密存取 Git 儲存庫。如需建立具有最低權限許可之適當角色的指引，請參閱 [Amazon EKS 功能 IAM 角色](capability-role.md)和 [EKS 功能的安全考量](capabilities-security.md)。

## 選擇您的工具
<a name="_choose_your_tool"></a>

您可以使用、 AWS 管理主控台 AWS CLI 或 eksctl 建立 Argo CD 功能：
+  [使用主控台建立 Argo CD 功能](argocd-create-console.md) - 使用 主控台進行引導式體驗
+  [使用 CLI 建立 Argo CD AWS 功能](argocd-create-cli.md) - 使用 AWS CLI 進行指令碼編寫和自動化
+  [使用 eksctl 建立 Argo CD 功能](argocd-create-eksctl.md) - 使用 eksctl 進行 Kubernetes 原生體驗

## 當您建立 Argo CD 功能時會發生什麼情況
<a name="_what_happens_when_you_create_an_argo_cd_capability"></a>

當您建立 Argo CD 功能時：

1. EKS 在 AWS 控制平面中建立 Argo CD 功能服務

1. 您的叢集中已安裝自訂資源定義 (CRDs)

1. 會自動為您的 IAM 功能角色建立存取項目，其中包含授予基準 Kubernetes 許可的特定功能存取項目政策 （請參閱 [EKS 功能的安全考量](capabilities-security.md))

1. Argo CD 開始觀看其自訂資源 （應用程式、ApplicationSets、AppProjects)

1. 功能狀態從 變更為 `CREATING` `ACTIVE` 

1. Argo CD UI 可透過其 URL 存取

啟用後，您可以在叢集中建立 Argo CD 應用程式，以從宣告性來源部署。

**注意**  
自動建立的存取項目不會授予將應用程式部署到叢集的許可。若要部署應用程式，您必須為每個目標叢集設定額外的 Kubernetes RBAC 許可。[註冊目標叢集](argocd-register-clusters.md) 如需註冊叢集和設定存取的詳細資訊，請參閱 。

## 後續步驟
<a name="_next_steps"></a>

建立 Argo CD 功能之後：
+  [Argo CD 概念](argocd-concepts.md) - 了解 GitOps 原則、同步政策和多叢集模式
+  [使用 Argo CD](working-with-argocd.md) - 設定儲存庫存取、註冊目標叢集和建立應用程式
+  [Argo CD 考量事項](argocd-considerations.md) - 探索多叢集架構模式和進階組態

# 使用主控台建立 Argo CD 功能
<a name="argocd-create-console"></a>

本主題說明如何使用 建立 Argo CD 功能 AWS 管理主控台。

## 先決條件
<a name="_prerequisites"></a>
+  ** AWS 已設定 Identity Center** – Argo CD 需要 AWS Identity Center 進行身分驗證。不支援本機使用者。如果您沒有設定 AWS Identity Center，請參閱 [AWS Identity Center 入門](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)以建立 Identity Center 執行個體，以及[新增使用者](https://docs.aws.amazon.com/singlesignon/latest/userguide/addusers.html)和[新增群組](https://docs.aws.amazon.com/singlesignon/latest/userguide/addgroups.html)以建立使用者和群組以進行 Argo CD 存取。

## 建立 Argo CD 功能
<a name="_create_the_argo_cd_capability"></a>

1. 在以下網址開啟 Amazon EKS 主控台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 選取您的叢集名稱以開啟叢集詳細資訊頁面。

1. 選擇**功能**索引標籤。

1. 在左側導覽中，選擇 **Argo CD**。

1. 選擇**建立 Argo CD 功能**。

1. 對於 **IAM 功能角色**：
   + 如果您已經有 IAM 功能角色，請從下拉式清單中選取它
   + 如果您需要建立角色，請選擇**建立 Argo CD 角色** 

     這會在新標籤中開啟 IAM 主控台，其中包含預先填入的信任政策和 Secrets Manager 的完整讀取存取權。預設不會新增其他許可，但您可以視需要新增許可。如果您計劃使用 CodeCommit 儲存庫或其他 AWS 服務，請在建立角色之前新增適當的許可。

     建立角色後，返回 EKS 主控台並自動選取角色。
**注意**  
如果您計劃使用與 AWS Secrets Manager 或 AWS CodeConnections 的選用整合，您將需要將許可新增至角色。如需 IAM 政策範例和組態指引，請參閱 [使用 AWS Secrets Manager 管理應用程式秘密](integration-secrets-manager.md)和 [使用 AWS CodeConnections 連線至 Git 儲存庫](integration-codeconnections.md)。

1. 設定 AWS Identity Center 整合：

   1. 選取**啟用 AWS Identity Center 整合**。

   1. 從下拉式清單中選擇您的 Identity Center 執行個體。

   1. 透過將使用者或群組指派給 Argo CD 角色 (ADMIN、EDITOR 或 VIEWER) 來設定 RBAC 的角色映射

1. 選擇**建立**。

功能建立程序開始。

## 驗證功能是否處於作用中狀態
<a name="_verify_the_capability_is_active"></a>

1. 在**功能**索引標籤上，檢視 Argo CD 功能狀態。

1. 等待狀態從 變更為 `CREATING` `ACTIVE`。

1. 啟用後，此功能即可使用。

如需功能狀態和故障診斷的資訊，請參閱 [使用 功能資源](working-with-capabilities.md)。

## 存取 Argo CD UI
<a name="_access_the_argo_cd_ui"></a>

啟用此功能後，您可以存取 Argo CD UI：

1. 在 Argo CD 功能頁面上，選擇**開啟 Argo CD UI**。

1. Argo CD UI 會在新的瀏覽器索引標籤中開啟。

1. 您現在可以透過 UI 建立應用程式和管理部署。

## 後續步驟
<a name="_next_steps"></a>
+  [使用 Argo CD](working-with-argocd.md) - 設定儲存庫、註冊叢集和建立應用程式
+  [Argo CD 考量事項](argocd-considerations.md) - 多叢集架構和進階組態
+  [使用 功能資源](working-with-capabilities.md) - 管理您的 Argo CD 功能資源

# 使用 CLI 建立 Argo CD AWS 功能
<a name="argocd-create-cli"></a>

本主題說明如何使用 CLI 建立 Argo CD AWS 功能。

## 先決條件
<a name="_prerequisites"></a>
+  ** AWS CLI** – 版本 `2.12.3` 或更新版本。若要檢查您的版本，請執行 `aws --version`。如需詳細資訊，請參閱《 AWS 命令列界面使用者指南》中的[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。
+  ** `kubectl` **：命令列工具，適用於使用 Kubernetes 叢集。如需詳細資訊，請參閱[設定 `kubectl` 和 `eksctl`](install-kubectl.md)。
+  ** AWS 已設定 Identity Center** – Argo CD 需要 AWS Identity Center 進行身分驗證。不支援本機使用者。如果您沒有設定 AWS Identity Center，請參閱 [AWS Identity Center 入門](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)以建立 Identity Center 執行個體，以及[新增使用者](https://docs.aws.amazon.com/singlesignon/latest/userguide/addusers.html)和[新增群組](https://docs.aws.amazon.com/singlesignon/latest/userguide/addgroups.html)以建立使用者和群組以進行 Argo CD 存取。

## 步驟 1：建立 IAM 功能角色
<a name="_step_1_create_an_iam_capability_role"></a>

建立信任政策檔案：

```
cat > argocd-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

建立 IAM 角色：

```
aws iam create-role \
  --role-name ArgoCDCapabilityRole \
  --assume-role-policy-document file://argocd-trust-policy.json
```

**注意**  
如果您計劃使用與 AWS Secrets Manager 或 AWS CodeConnections 的選用整合，您將需要將許可新增至角色。如需 IAM 政策範例和組態指引，請參閱 [使用 AWS Secrets Manager 管理應用程式秘密](integration-secrets-manager.md)和 [使用 AWS CodeConnections 連線至 Git 儲存庫](integration-codeconnections.md)。

## 步驟 2：建立 Argo CD 功能
<a name="_step_2_create_the_argo_cd_capability"></a>

在叢集上建立 Argo CD 功能資源。

首先，為您的 Identity Center 組態設定環境變數：

```
# Get your Identity Center instance ARN (replace region if your IDC instance is in a different region)
export IDC_INSTANCE_ARN=$(aws sso-admin list-instances --region [.replaceable]`region` --query 'Instances[0].InstanceArn' --output text)

# Get a user ID for RBAC mapping (replace with your username and region if needed)
export IDC_USER_ID=$(aws identitystore list-users \
  --region [.replaceable]`region` \
  --identity-store-id $(aws sso-admin list-instances --region [.replaceable]`region` --query 'Instances[0].IdentityStoreId' --output text) \
  --query 'Users[?UserName==`your-username`].UserId' --output text)

echo "IDC_INSTANCE_ARN=$IDC_INSTANCE_ARN"
echo "IDC_USER_ID=$IDC_USER_ID"
```

使用 Identity Center 整合建立 功能。將 *region-code* 取代為您叢集所在的 AWS 區域，並將 *my-cluster* 取代為您的叢集名稱，並將 *idc-region-code* 取代為您設定 IAM Identity Center 的區域代碼：

```
aws eks create-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-argocd \
  --type ARGOCD \
  --role-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/ArgoCDCapabilityRole \
  --delete-propagation-policy RETAIN \
  --configuration '{
    "argoCd": {
      "awsIdc": {
        "idcInstanceArn": "'$IDC_INSTANCE_ARN'",
        "idcRegion": "'[.replaceable]`idc-region-code`'"
      },
      "rbacRoleMappings": [{
        "role": "ADMIN",
        "identities": [{
          "id": "'$IDC_USER_ID'",
          "type": "SSO_USER"
        }]
      }]
    }
  }'
```

命令會立即傳回，但當 EKS 建立所需的功能基礎設施和元件時，功能需要一些時間才會變成作用中。EKS 會在建立叢集時，在叢集中安裝與此功能相關的 Kubernetes 自訂資源定義。

**注意**  
如果您收到叢集不存在或您沒有許可的錯誤，請驗證：  
叢集名稱正確
您的 AWS CLI 已針對正確的區域設定
您擁有必要的 IAM 許可

## 步驟 3：確認功能處於作用中狀態
<a name="_step_3_verify_the_capability_is_active"></a>

等待 功能變成作用中。將 *region-code* 取代為您的叢集所在的 AWS 區域，並將 *my-cluster* 取代為您的叢集名稱。

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-argocd \
  --query 'capability.status' \
  --output text
```

當狀態顯示 時，此功能已就緒`ACTIVE`。在狀態為 之前，請勿繼續下一個步驟`ACTIVE`。

您也可以檢視完整的功能詳細資訊：

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-argocd
```

## 步驟 4：確認可用的自訂資源
<a name="_step_4_verify_custom_resources_are_available"></a>

功能處於作用中狀態後，請確認叢集中是否有可用的 Argo CD 自訂資源：

```
kubectl api-resources | grep argoproj.io
```

您應該會看到列出的 `ApplicationSet` `Application`和資源類型。

## 後續步驟
<a name="_next_steps"></a>
+  [使用 Argo CD](working-with-argocd.md) - 設定儲存庫、註冊叢集和建立應用程式
+  [Argo CD 考量事項](argocd-considerations.md) - 多叢集架構和進階組態
+  [使用 功能資源](working-with-capabilities.md) - 管理您的 Argo CD 功能資源

# 使用 eksctl 建立 Argo CD 功能
<a name="argocd-create-eksctl"></a>

本主題說明如何使用 eksctl 建立 Argo CD 功能。

**注意**  
下列步驟需要 eksctl 版本 `0.220.0` 或更新版本。若要檢查您的版本，請執行 `eksctl version`。

## 步驟 1：建立 IAM 功能角色
<a name="_step_1_create_an_iam_capability_role"></a>

建立信任政策檔案：

```
cat > argocd-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

建立 IAM 角色：

```
aws iam create-role \
  --role-name ArgoCDCapabilityRole \
  --assume-role-policy-document file://argocd-trust-policy.json
```

**注意**  
對於此基本設定，不需要額外的 IAM 政策。如果您打算將 Secrets Manager 用於儲存庫登入資料或 CodeConnections，則需要將許可新增至角色。如需 IAM 政策範例和組態指引，請參閱 [使用 AWS Secrets Manager 管理應用程式秘密](integration-secrets-manager.md)和 [使用 AWS CodeConnections 連線至 Git 儲存庫](integration-codeconnections.md)。

## 步驟 2：取得 AWS Identity Center 組態
<a name="step_2_get_your_shared_aws_identity_center_configuration"></a>

取得 RBAC 組態的 Identity Center 執行個體 ARN 和使用者 ID：

```
# Get your Identity Center instance ARN
aws sso-admin list-instances --query 'Instances[0].InstanceArn' --output text

# Get a user ID for admin access (replace 'your-username' with your Identity Center username)
aws identitystore list-users \
  --identity-store-id $(aws sso-admin list-instances --query 'Instances[0].IdentityStoreId' --output text) \
  --query 'Users[?UserName==`your-username`].UserId' --output text
```

請注意這些值 - 您將在下一個步驟中使用這些值。

## 步驟 3：建立 eksctl 組態檔案
<a name="_step_3_create_an_eksctl_configuration_file"></a>

建立名為 `argocd-capability.yaml` 且具有下列內容的檔案。將預留位置值取代為您叢集的名稱、叢集的區域、IAM 角色 ARN、Identity Center 執行個體 ARN、Identity Center 區域和使用者 ID：

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: my-cluster
  region: cluster-region-code

capabilities:
  - name: my-argocd
    type: ARGOCD
    roleArn: arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole
    deletePropagationPolicy: RETAIN
    configuration:
      argocd:
        awsIdc:
          idcInstanceArn: arn:aws:sso:::instance/ssoins-123abc
          idcRegion: idc-region-code
        rbacRoleMappings:
          - role: ADMIN
            identities:
              - id: 38414300-1041-708a-01af-5422d6091e34
                type: SSO_USER
```

**注意**  
您可以將多個使用者或群組新增至 RBAC 映射。對於群組，請使用 `type: SSO_GROUP`並提供群組 ID。可用的角色為 `ADMIN`、 `EDITOR`和 `VIEWER`。

## 步驟 4：建立 Argo CD 功能
<a name="_step_4_create_the_argo_cd_capability"></a>

套用組態檔案：

```
eksctl create capability -f argocd-capability.yaml
```

命令會立即傳回，但 功能需要一些時間才會變成作用中。

## 步驟 5：確認功能已啟用
<a name="_step_5_verify_the_capability_is_active"></a>

檢查功能狀態。將 *region-code* 取代為您的叢集所在的 AWS 區域，並將 *my-cluster* 取代為您的叢集名稱。

```
eksctl get capability \
  --region region-code \
  --cluster my-cluster \
  --name my-argocd
```

當狀態顯示 時，此功能已就緒`ACTIVE`。

## 步驟 6：確認可用的自訂資源
<a name="_step_6_verify_custom_resources_are_available"></a>

功能處於作用中狀態後，請確認叢集中是否有可用的 Argo CD 自訂資源：

```
kubectl api-resources | grep argoproj.io
```

您應該會看到列出的 `ApplicationSet` `Application`和資源類型。

## 後續步驟
<a name="_next_steps"></a>
+  [使用 Argo CD](working-with-argocd.md) - 了解如何建立和管理 Argo CD 應用程式
+  [Argo CD 考量事項](argocd-considerations.md) - 設定 SSO 和多叢集存取
+  [使用 功能資源](working-with-capabilities.md) - 管理您的 Argo CD 功能資源

# Argo CD 概念
<a name="argocd-concepts"></a>

Argo CD 透過將 Git 視為應用程式部署的單一事實來源來實作 GitOps。本主題會逐步解說實際範例，然後說明使用 Argo CD 的 EKS 功能時，您需要了解的核心概念。

## Argo CD 入門
<a name="_getting_started_with_argo_cd"></a>

建立 Argo CD 功能後 （請參閱 [建立 Argo CD 功能](create-argocd-capability.md))，您可以開始部署應用程式。此範例會逐步解說註冊叢集和建立應用程式。

### 步驟 1：設定
<a name="_step_1_set_up"></a>

 **註冊您的叢集** （必要）

註冊您要部署應用程式的叢集。在此範例中，我們將註冊執行 Argo CD 的相同叢集 （您可以使用 名稱`in-cluster`來與大多數 Argo CD 範例相容）：

```
# Get your cluster ARN
CLUSTER_ARN=$(aws eks describe-cluster \
  --name my-cluster \
  --query 'cluster.arn' \
  --output text)

# Register the cluster using Argo CD CLI
argocd cluster add $CLUSTER_ARN \
  --aws-cluster-name $CLUSTER_ARN \
  --name in-cluster \
  --project default
```

**注意**  
如需設定 Argo CD CLI 以在 EKS 中使用 Argo CD 功能的詳細資訊，請參閱 [搭配 受管功能使用 Argo CD CLI](argocd-comparison.md#argocd-cli-configuration)。

或者，使用 Kubernetes Secret 註冊叢集 （如需詳細資訊[註冊目標叢集](argocd-register-clusters.md)，請參閱 )。

 **設定儲存庫存取** （選用）

此範例使用公有 GitHub 儲存庫，因此不需要儲存庫組態。對於私有儲存庫，請使用 AWS Secrets Manager、CodeConnections 或 Kubernetes Secrets 設定存取權 （如需詳細資訊[設定儲存庫存取](argocd-configure-repositories.md)，請參閱 )。

對於 AWS 服務 (ECR for Helm Charts、CodeConnections 和 CodeCommit)，您可以直接在應用程式資源中參考它們，而無需建立儲存庫。功能角色必須具有必要的 IAM 許可。如需詳細資訊，請參閱 [設定儲存庫存取](argocd-configure-repositories.md)。

### 步驟 2：建立應用程式
<a name="_step_2_create_an_application"></a>

在 中建立此應用程式資訊清單`my-app.yaml`：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    targetRevision: HEAD
    path: guestbook
  destination:
    name: in-cluster
    namespace: guestbook
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
```

套用應用程式：

```
kubectl apply -f my-app.yaml
```

套用此應用程式後，Argo CD：1。將應用程式從 Git 同步到您的叢集 （初始部署） 2. 監控 Git 儲存庫的變更 3。自動同步叢集 4 的後續變更。偵測並修正來自所需狀態 5 的任何偏離。在 UI 中提供運作狀態和同步歷史記錄

檢視應用程式狀態：

```
kubectl get application guestbook -n argocd
```

您也可以使用 Argo CD CLI 或 Argo CD UI （可從叢集功能索引標籤下的 EKS 主控台存取） 檢視應用程式。

**注意**  
搭配 受管功能使用 Argo CD CLI 時，請指定命名空間字首為 的應用程式`argocd app get argocd/guestbook`。

**注意**  
在 中使用叢集名稱 `destination.name`（您在註冊叢集時使用的名稱）。受管功能不支援本機叢集內預設值 (`kubernetes.default.svc`)。

## 核心概念
<a name="_core_concepts"></a>

### GitOps 原則和來源類型
<a name="_gitops_principles_and_source_types"></a>

Argo CD 實作 GitOps，其中您的應用程式來源是部署的單一事實來源：
+  **宣告** - 使用 YAML 資訊清單、Helm Chart 或 Kustomize 浮水印宣告所需狀態
+  **已版本化** - 使用完整的稽核線索追蹤每個變更
+  **自動化** - Argo CD 會持續監控來源並自動同步變更
+  **自我修復** - 偵測並修正所需叢集狀態與實際叢集狀態之間的偏離

 **支援的來源類型**：
+  **Git 儲存庫** - GitHub、GitLab、Bitbucket、CodeCommit (HTTPS、SSH 或 CodeConnections)
+  **Helm 登錄檔** - HTTP 登錄檔 （如 `https://aws.github.io/eks-charts`) 和 OCI 登錄檔 （如 `public.ecr.aws`)
+  **OCI 影像** - 包含資訊清單或 Helm Chart 的容器影像 （例如 `oci://registry-1.docker.io/user/my-app`)

這種靈活性可讓組織選擇符合其安全和合規要求的來源。例如，限制從叢集存取 Git 的組織可以使用 Helm Chart 或 OCI 映像的 ECR。

如需詳細資訊，請參閱 Argo CD 文件中的[應用程式來源](https://argo-cd.readthedocs.io/en/stable/user-guide/application-sources/)。

### 同步和調校
<a name="_sync_and_reconciliation"></a>

Argo CD 會持續監控您的來源和叢集，以偵測和修正差異：

1. 輪詢來源以進行變更 （預設：每 6 分鐘）

1. 比較所需狀態與叢集狀態

1. 將應用程式標記為 `Synced`或 `OutOfSync` 

1. 自動同步變更 （如果已設定） 或等待手動核准

1. 同步後監控資源運作狀態

 使用註釋**同步波浪**控制資源建立順序：

```
metadata:
  annotations:
    argocd.argoproj.io/sync-wave: "0"  # Default if not specified
```

資源會依波動順序套用 （數字越小，包括負數，例如 `-1`)。如果未指定 Wave`0`，則預設為 Wave。這可讓您在部署 (wave `-1`) 之前建立相依性，例如 命名空間 (wave )，再部署 (wave `0`) 服務 (wave `1`)。

 **自我修復**會自動還原手動變更：

```
spec:
  syncPolicy:
    automated:
      selfHeal: true
```

**注意**  
受管功能使用註釋型資源追蹤 （非標籤型），以便與 Kubernetes 慣例和其他工具更相容。

如需同步階段、勾點和進階模式的詳細資訊，請參閱 [Argo CD 同步文件](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/)。

### 應用程式運作狀態
<a name="_application_health"></a>

Argo CD 會監控應用程式中所有資源的運作狀態：

 **運作狀態**：\$1 **正常運作** - 所有資源如預期執行 \$1 **進行中** - 正在建立或更新的資源 \$1 **降級** - 部分資源運作狀態不佳 (Pod 當機、任務失敗） \$1 **已暫停** - 應用程式刻意暫停 \$1 **遺失** - Git 中定義的資源不存在於叢集中

Argo CD 具有常見 Kubernetes 資源 （部署、StatefulSets、任務等） 的內建運作狀態檢查，並支援 CRDs的自訂運作狀態檢查。

應用程式運作狀態由其所有資源決定 - 如果任何資源為 `Degraded`，則應用程式為 `Degraded`。

如需詳細資訊，請參閱 Argo CD 文件中的[資源運作](https://argo-cd.readthedocs.io/en/stable/operator-manual/health/)狀態。

### 多叢集模式
<a name="_multi_cluster_patterns"></a>

Argo CD 支援兩種主要部署模式：

 **Hub-and-spoke** - 在部署到多個工作負載叢集的專用管理叢集上執行 Argo CD： \$1 集中控制和可見性 \$1 跨所有叢集的一致政策 \$1 一個要管理的 Argo CD 執行個體 \$1 控制平面和工作負載之間的明確分離

 **每個叢集** - 在每個叢集上執行 Argo CD，僅管理該叢集的應用程式：\$1 叢集分離 （一個故障不會影響其他故障） \$1 簡化聯網 （無跨叢集通訊） \$1 更輕鬆地初始設定 （無叢集註冊）

為管理許多叢集的平台團隊選擇hub-and-spoke，或為獨立團隊選擇每個叢集，或當叢集必須完全隔離時。

如需多叢集組態的詳細資訊，請參閱 [Argo CD 考量事項](argocd-considerations.md)。

### 專案
<a name="_projects"></a>

專案提供應用程式的邏輯分組和存取控制：
+  **來源限制** - 限制哪些 Git 儲存庫可以使用
+  **目的地限制** - 限制哪些叢集和命名空間可以成為目標
+  **資源限制** - 限制可以部署哪些 Kubernetes 資源類型
+  **RBAC 整合** - 將專案映射至 AWS Identity Center 使用者和群組 IDs

應用程式屬於單一專案。如果未指定，他們會使用 `default`專案，該專案預設沒有限制。針對生產用途，請編輯`default`專案以限制存取，並建立具有適當限制的新專案。

如需專案組態和 RBAC 模式，請參閱 [設定 Argo CD 許可](argocd-permissions.md)。

### 同步選項
<a name="_sync_options"></a>

使用常用選項微調同步行為：
+  `CreateNamespace=true` - 自動建立目的地命名空間
+  `ServerSideApply=true` - 使用伺服器端套用以獲得更好的衝突解決
+  `SkipDryRunOnMissingResource=true` - 當 CRDs尚不存在時略過試轉 （適用於 kro 執行個體）

```
spec:
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
    - ServerSideApply=true
    - SkipDryRunOnMissingResource=true
```

如需同步選項的完整清單，請參閱 [Argo CD 同步選項文件](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-options/)。

## 後續步驟
<a name="_next_steps"></a>
+  [設定儲存庫存取](argocd-configure-repositories.md) - 設定 Git 儲存庫存取
+  [註冊目標叢集](argocd-register-clusters.md) - 註冊目標叢集以進行部署
+  [建立應用程式](argocd-create-application.md) - 建立您的第一個應用程式
+  [Argo CD 考量事項](argocd-considerations.md) - EKS 特定模式、Identity Center 整合和多叢集組態
+  [Argo CD 文件](https://argo-cd.readthedocs.io/en/stable/) - 完整的 Argo CD 文件，包括同步勾點、運作狀態檢查和進階模式

# 設定 Argo CD 許可
<a name="argocd-permissions"></a>

Argo CD 受管功能與 AWS Identity Center 整合以進行身分驗證，並使用內建的 RBAC 角色進行授權。本主題說明如何設定使用者和團隊的許可。

## 許可如何使用 Argo CD
<a name="_how_permissions_work_with_argo_cd"></a>

Argo CD 功能使用 AWS Identity Center 進行身分驗證，並提供三個內建 RBAC 角色進行授權。

當使用者存取 Argo CD 時：

1. 他們使用 AWS Identity Center 進行身分驗證 （可聯合到您的公司身分提供者）

1.  AWS Identity Center 提供使用者和群組資訊給 Argo CD

1. Argo CD 會根據您的組態，將使用者和群組映射至 RBAC 角色

1. 使用者只會看到他們有權存取的應用程式和資源

## 內建 RBAC 角色
<a name="_built_in_rbac_roles"></a>

Argo CD 功能提供三個您映射到 AWS Identity Center 使用者和群組的內建角色。這些是**全球範圍的角色**，可控制對 Argo CD 資源的存取，例如專案、叢集和儲存庫。

**重要**  
全域角色控制對 Argo CD 本身的存取，而不是對應用程式等專案範圍的資源的存取。EDITOR 和 VIEWER 使用者預設無法查看或管理應用程式，他們需要專案角色來存取專案範圍的資源。[專案角色和專案範圍存取](#project-roles) 如需授予應用程式和其他專案範圍資源存取權的詳細資訊，請參閱 。

 **ADMIN** 

完整存取所有 Argo CD 資源和設定：
+ 在任何專案中建立、更新和刪除應用程式和 ApplicationSets 
+ 管理 Argo CD 組態
+ 註冊和管理部署目標叢集
+ 設定儲存庫存取
+ 建立和管理專案
+ 檢視所有應用程式狀態和歷史記錄
+ 列出和存取所有叢集和儲存庫

 **EDITOR** 

可以更新專案並設定專案角色，但無法變更全域 Argo CD 設定：
+ 更新現有專案 （無法建立或刪除專案）
+ 設定專案角色和許可
+ 檢視 GPG 金鑰和憑證
+ 無法變更全域 Argo CD 組態
+ 無法直接管理叢集或儲存庫
+ 無法查看或管理沒有專案角色的應用程式

 **檢視程式** 

對 Argo CD 資源的唯讀存取權：
+ 檢視專案組態
+ 列出所有專案 （包括未指派給使用者的專案）
+ 檢視 GPG 金鑰和憑證
+ 無法列出叢集或儲存庫
+ 無法進行任何變更
+ 無法查看或管理沒有專案角色的應用程式

**注意**  
若要授予 EDITOR 或 VIEWER 使用者對應用程式的存取權，ADMIN 或 EDITOR 必須建立專案角色，將 Identity Center 群組映射至專案中的特定許可。

## 專案角色和專案範圍存取
<a name="project-roles"></a>

全域角色 (ADMIN、EDITOR、VIEWER) 控制對 Argo CD 本身的存取。專案角色控制對特定專案中資源和功能的存取，包括：
+  **資源**：應用程式、ApplicationSets、儲存庫登入資料、叢集登入資料
+  **功能**：日誌存取、執行應用程式 Pod 的存取

 **了解兩層許可模型**：
+  **全域範圍**：內建角色決定使用者可以對專案、叢集、儲存庫和 Argo CD 設定執行的操作
+  **專案範圍**：專案角色決定使用者可以對特定專案中的資源和功能執行的動作

這表示：
+ ADMIN 使用者可以存取所有專案資源和功能，無需額外的組態
+ 必須授予 EDITOR 和 VIEWER 使用者存取專案資源和功能的專案角色
+ EDITOR 使用者可以建立專案角色，授予自己和其他人可以更新的專案存取權

 **工作流程範例**：

1. ADMIN 會將 Identity Center 群組映射至全域 EDITOR 角色

1. ADMIN 會為團隊建立專案

1. EDITOR 會設定該專案內的專案角色，以授予團隊成員對專案範圍資源的存取權

1. 團隊成員 （可能有 VIEWER 全球角色） 現在可以根據其專案角色許可查看和管理該專案中的應用程式

如需設定專案角色的詳細資訊，請參閱 [專案型存取控制](#_project_based_access_control)。

## 設定角色映射
<a name="_configure_role_mappings"></a>

在建立或更新功能時，將 AWS Identity Center 使用者和群組映射至 Argo CD 角色。

 **範例角色映射**：

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["AdminGroup", "alice@example.com"],
    "EDITOR": ["DeveloperGroup", "DevOpsTeam"],
    "VIEWER": ["ReadOnlyGroup", "bob@example.com"]
  }
}
```

**注意**  
角色名稱區分大小寫，且必須為大寫 (ADMIN、EDITOR、VIEWER)。

**重要**  
EKS 功能與 AWS Identity Center 整合支援每個 Argo CD 功能最多 1，000 個身分。身分可以是使用者或群組。

 **更新角色映射**：

```
aws eks update-capability \
  --region us-east-1 \
  --cluster-name cluster \
  --capability-name capname \
  --endpoint "https://eks.ap-northeast-2.amazonaws.com" \
  --role-arn "arn:aws:iam::[.replaceable]111122223333:role/[.replaceable]`EKSCapabilityRole`" \
  --configuration '{
    "argoCd": {
      "rbacRoleMappings": {
        "addOrUpdateRoleMappings": [
          {
            "role": "ADMIN",
            "identities": [
              { "id": "686103e0-f051-7068-b225-e6392b959d9e", "type": "SSO_USER" }
            ]
          }
        ]
      }
    }
  }'
```

## 管理員帳戶用量
<a name="_admin_account_usage"></a>

管理員帳戶專為初始設定和管理任務而設計，例如註冊叢集和設定儲存庫。

 **當管理員帳戶適當時**：
+ 初始功能設定和組態
+ Solo 開發或快速示範
+ 管理任務 （叢集註冊、儲存庫組態、專案建立）

 **管理員帳戶的最佳實務**：
+ 不要將帳戶字符遞交至版本控制
+ 如果權杖公開，請立即輪換權杖
+ 將帳戶字符用量限制為設定和管理任務
+ 設定短過期時間 （最長 12 小時）
+ 任何指定時間只能建立 5 個帳戶字符

 **改用專案型存取的時機**：
+ 與多個使用者共用開發環境
+ 任何類似生產的環境
+ 當您需要執行動作之人員的稽核線索時
+ 當您需要強制執行資源限制或存取界限時

對於生產環境和多使用者案例，請使用專案型存取控制搭配映射至 AWS Identity Center 群組的專用 RBAC 角色。

## 專案型存取控制
<a name="_project_based_access_control"></a>

使用 Argo CD Projects (AppProject) 為團隊提供精細的存取控制和資源隔離。

**重要**  
將使用者或群組指派給專案特定角色之前，您必須先在功能組態中將這些角色映射至全域 Argo CD 角色 (ADMIN、EDITOR 或 VIEWER)。使用者在沒有全域角色映射的情況下無法存取 Argo CD，即使他們已指派給專案角色。  
考慮將使用者映射到全域 VIEWER 角色，然後透過專案特定角色授予其他許可。這可提供基準存取，同時允許在專案層級進行精細控制。

專案提供：
+  **來源限制**：限制哪些 Git 儲存庫可以使用
+  **目的地限制**：限制哪些叢集和命名空間可以成為目標
+  **資源限制**：限制可以部署哪些 Kubernetes 資源類型
+  **RBAC 整合**：將專案映射至 AWS Identity Center 群組或 Argo CD 角色

 **團隊隔離的範例專案**：

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  description: Team A applications

  # Required: Specify which namespaces this project watches for Applications
  sourceNamespaces:
  - argocd

  # Source restrictions
  sourceRepos:
  - https://github.com/myorg/team-a-apps

  # Destination restrictions
  destinations:
  - namespace: team-a-*
    server: arn:aws:eks:us-west-2:111122223333:cluster/production

  # Resource restrictions
  clusterResourceWhitelist:
  - group: ''
    kind: Namespace
  namespaceResourceWhitelist:
  - group: 'apps'
    kind: Deployment
  - group: ''
    kind: Service
  - group: ''
    kind: ConfigMap
```

### 來源命名空間
<a name="_source_namespaces"></a>

使用 EKS Argo CD 功能時，AppProject 定義中需要 `spec.sourceNamespaces` 欄位。此欄位指定哪些命名空間可以包含參考此專案的應用程式或 ApplicationSets。

**重要**  
EKS Argo CD 功能僅支援應用程式和 ApplicationSets 的單一命名空間 - 您在建立功能時指定的命名空間 （通常是 `argocd`)。這與支援多個命名空間的開放原始碼 Argo CD 不同。

 **AppProject 組態** 

所有 AppProjects 都必須在 中包含 功能的已設定命名空間`sourceNamespaces`：

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a-project
  namespace: argocd
spec:
  description: Applications for Team A

  # Required: Specify the capability's configured namespace (configuration.argoCd.namespace)
  sourceNamespaces:
    - argocd  # Must match your capability's namespace configuration

  # Source repositories this project can deploy from
  sourceRepos:
    - 'https://github.com/my-org/team-a-*'

  # Destination restrictions
  destinations:
    - namespace: 'team-a-*'
      server: arn:aws:eks:us-west-2:111122223333:cluster/my-cluster
```

**注意**  
如果您從 省略 功能的命名空間`sourceNamespaces`，則該命名空間中的應用程式或 ApplicationSets 無法參考此專案，導致部署失敗。

 **將使用者指派給專案**：

專案角色授予 EDITOR 和 VIEWER 使用者對專案資源 （應用程式、ApplicationSets、儲存庫和叢集登入資料） 和 功能 （日誌、Exec) 的存取權。如果沒有專案角色，這些使用者就無法存取這些資源，即使他們具有全域角色存取權。

ADMIN 使用者可以存取所有應用程式，而不需要專案角色。

 **範例：將應用程式存取權授予團隊成員** 

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  # ... project configuration ...

  sourceNamespaces:
  - argocd

  # Project roles grant Application-level access
  roles:
  - name: developer
    description: Team A developers - can manage Applications
    policies:
    - p, proj:team-a:developer, applications, *, team-a/*, allow
    - p, proj:team-a:developer, clusters, get, *, allow  # See cluster names in UI
    groups:
    - 686103e0-f051-7068-b225-e6392b959d9e  # Identity Center group ID

  - name: viewer
    description: Team A viewers - read-only Application access
    policies:
    - p, proj:team-a:viewer, applications, get, team-a/*, allow
    - p, proj:team-a:viewer, clusters, get, *, allow  # See cluster names in UI
    groups:
    - 786203e0-f051-7068-b225-e6392b959d9f  # Identity Center group ID
```

**注意**  
包含在專案角色`clusters, get, *, allow`中，以允許使用者在 UI 中查看叢集名稱。如果沒有此許可，目的地叢集會顯示為「未知」。

 **了解專案角色政策**：

政策格式為： `p, proj:<project>:<role>, <resource>, <action>, <object>, <allow/deny>`

 **資源政策**：
+  `applications, , team-a/, allow` - 團隊專案中所有應用程式的完整存取權
+  `applications, get, team-a/*, allow` - 應用程式的唯讀存取
+  `applications, sync, team-a/*, allow` - 可以同步應用程式，但無法建立/刪除
+  `applications, delete, team-a/*, allow` - 可以刪除應用程式 （請謹慎使用）
+  `applicationsets, , team-a/, allow` - 完整存取 ApplicationSets
+  `repositories, *, *, allow` - 存取儲存庫登入資料
+  `clusters, *, *, allow` - 存取叢集登入資料

 **功能政策**：
+  `logs, , team-a/, allow` - 存取應用程式日誌
+  `exec, , team-a/, allow` - 執行對應用程式 Pod 的存取

**注意**  
EDITOR 使用者可以建立專案角色，以授予自己和他們可以更新之專案中的其他許可。這可讓團隊主管控制團隊對專案範圍資源的存取，而不需要 ADMIN 介入。

**注意**  
在 `groups` 欄位中使用 Identity Center IDs （而非群組名稱）。您也可以使用 Identity Center 使用者 IDs進行個別使用者存取。在 AWS Identity Center 主控台或使用 CLI AWS 尋找這些 IDs。

## 常見許可模式
<a name="_common_permission_patterns"></a>

 **模式 1：具有完整存取權的管理團隊** 

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["PlatformTeam", "SRETeam"]
  }
}
```

ADMIN 使用者可以查看和管理所有專案範圍的資源，而無需額外的組態。

 **模式 2：團隊領導管理專案、開發人員透過專案角色存取** 

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["PlatformTeam"],
    "EDITOR": ["TeamLeads"],
    "VIEWER": ["AllDevelopers"]
  }
}
```

1. ADMIN 會為每個團隊建立專案

1. 團隊負責人 (EDITOR) 設定專案角色，授予開發人員對專案資源 （應用程式、ApplicationSets、登入資料） 和功能 （日誌、執行） 的存取權

1. 開發人員 (VIEWER) 只能存取其專案角色允許的資源和功能

 **模式 3：具有專案角色的團隊型存取** 

1. ADMIN 建立專案並將團隊負責人映射至全球 EDITOR 角色

1. 團隊負責人 (EDITOR) 將團隊成員指派給其專案中的專案角色

1. 團隊成員只需要 VIEWER 全球角色 - 專案角色提供專案資源和功能的存取權

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["PlatformTeam"],
    "EDITOR": ["TeamLeads"],
    "VIEWER": ["AllDevelopers"]
  }
}
```

## 最佳實務
<a name="_best_practices"></a>

 **使用群組而非個別使用者**：將 AWS Identity Center 群組映射至 Argo CD 角色，而非個別使用者，以便於管理。

 **從最低權限**開始：從 VIEWER 存取開始，並視需要授予 EDITOR 或 ADMIN。

 **使用專案進行團隊隔離**：為不同的團隊或環境建立單獨的 AppProjects以強制執行界限。

 **利用 Identity Center 聯合**：設定 AWS Identity Center 與您的公司身分提供者聯合，以進行集中式使用者管理。

 **定期存取檢閱**：定期檢閱角色映射和專案指派，以確保適當的存取層級。

 **限制叢集存取**：請記住，Argo CD RBAC 會控制對 Argo CD 資源和操作的存取，但不對應至 Kubernetes RBAC。具有 Argo CD 存取權的使用者可以將應用程式部署到 Argo CD 可存取的叢集。限制 Argo CD 可存取的叢集，並使用專案目的地限制來控制應用程式可部署的位置。

## AWS 服務許可
<a name="shared_aws_service_permissions"></a>

若要直接在應用程式資源中使用 AWS 服務 （無需建立儲存庫資源），請將所需的 IAM 許可連接到功能角色。

 **Helm Chart 的 ECR**：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:BatchCheckLayerAvailability",
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage"
      ],
      "Resource": "*"
    }
  ]
}
```

 **CodeCommit 儲存庫**：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "codecommit:GitPull"
      ],
      "Resource": "arn:aws:codecommit:region:account-id:repository-name"
    }
  ]
}
```

 **CodeConnections (GitHub、GitLab、Bitbucket)**：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "codeconnections:UseConnection"
      ],
      "Resource": "arn:aws:codeconnections:region:account-id:connection/connection-id"
    }
  ]
}
```

如需使用這些整合的詳細資訊[設定儲存庫存取](argocd-configure-repositories.md)，請參閱 。

## 後續步驟
<a name="_next_steps"></a>
+  [使用 Argo CD](working-with-argocd.md) - 了解如何建立應用程式和管理部署
+  [Argo CD 概念](argocd-concepts.md) - 了解 Argo CD 概念，包括專案
+  [EKS 功能的安全考量](capabilities-security.md) - 檢閱 功能的安全最佳實務

# 使用 Argo CD
<a name="working-with-argocd"></a>

使用 Argo CD，您可以在 Git 儲存庫中定義應用程式，Argo CD 會自動將其同步到 Kubernetes 叢集。這可透過自動偏離偵測來啟用宣告式、版本控制的應用程式部署。

## 先決條件
<a name="_prerequisites"></a>

在使用 Argo CD 之前，您需要：
+ 建立 Argo CD 功能的 EKS 叢集 （請參閱 [建立 Argo CD 功能](create-argocd-capability.md))
+ 包含 Kubernetes 資訊清單的 Git 儲存庫
+  `kubectl` 設定為與您的叢集通訊

## 一般任務
<a name="_common_tasks"></a>

下列主題會引導您完成常見的 Argo CD 任務：

 ** [設定儲存庫存取](argocd-configure-repositories.md) ** - 設定 Argo CD 以使用 AWS Secrets Manager、 AWS CodeConnections 或 Kubernetes Secrets 存取您的 Git 儲存庫。

 ** [註冊目標叢集](argocd-register-clusters.md) ** - 註冊 Argo CD 將部署應用程式的目標叢集。

 ** [使用 Argo CD 專案](argocd-projects.md) ** - 使用適用於多租戶環境的專案來組織應用程式並強制執行安全界限。

 ** [建立應用程式](argocd-create-application.md) ** - 使用自動或手動同步政策，建立從 Git 儲存庫部署的應用程式。

 ** [使用 ApplicationSets](argocd-applicationsets.md) ** - 使用 ApplicationSets，使用 範本和產生器在多個環境或叢集中部署應用程式。

## 存取 Argo CD UI
<a name="_access_the_argo_cd_ui"></a>

透過 EKS 主控台存取 Argo CD UI：

1. 開啟 Amazon EKS 主控台

1. 選取您的叢集

1. 選擇**功能**索引標籤

1. 選擇 **Argo CD** 

1. 選擇**開啟 Argo CD UI** 

UI 提供視覺化應用程式拓撲、同步狀態和歷史記錄、資源運作狀態和事件、手動同步控制和應用程式管理。

## 上游文件
<a name="_upstream_documentation"></a>

如需 Argo CD 功能的詳細資訊：
+  [Argo CD 文件](https://argo-cd.readthedocs.io/) - 完整使用者指南
+  [Application Spec](https://argo-cd.readthedocs.io/en/stable/user-guide/application-specification/) - 完整應用程式 API 參考
+  [ApplicationSet 指南](https://argo-cd.readthedocs.io/en/stable/user-guide/application-set/) - ApplicationSet 模式和範例
+  [Argo CD GitHub](https://github.com/argoproj/argo-cd) - 原始程式碼和範例

# 設定儲存庫存取
<a name="argocd-configure-repositories"></a>

部署應用程式之前，請設定 Argo CD 以存取您的 Git 儲存庫和 Helm Chart 登錄檔。Argo CD 支援 GitHub、GitLab、Bitbucket、 AWS CodeCommit 和 AWS ECR 的多種身分驗證方法。

**注意**  
對於直接 AWS 服務整合 (ECR Helm Chart、CodeCommit 儲存庫和 CodeConnections)，您可以直接在應用程式資源中參考它們，而無需建立儲存庫組態。功能角色必須具有必要的 IAM 許可。如需詳細資訊，請參閱 [設定 Argo CD 許可](argocd-permissions.md)。

## 先決條件
<a name="_prerequisites"></a>
+ 建立 Argo CD 功能的 EKS 叢集
+ 包含 Kubernetes 資訊清單的 Git 儲存庫
+  `kubectl` 設定為與您的叢集通訊

**注意**  
 AWS CodeConnections 可以連線至位於 AWS 雲端或內部部署的 Git 伺服器。如需詳細資訊，請參閱 [AWS CodeConnections](https://docs.aws.amazon.com/codeconnections/latest/userguide/welcome.html)。

## 身分驗證方法
<a name="_authentication_methods"></a>


| Method | 使用案例 | 所需的 IAM 許可 | 
| --- | --- | --- | 
|   **直接整合 AWS 服務**   | 
|  CodeCommit：  |  直接與 AWS CodeCommit Git 儲存庫整合。不需要儲存庫組態。  |   `codecommit:GitPull`   | 
|  CodeConnections  |  使用受管身分驗證連線至 GitHub、GitLab 或 Bitbucket。需要連線設定。  |   `codeconnections:UseConnection`   | 
|  ECR OCI 成品  |  直接整合 OCI Helm Chart 和資訊清單映像的 AWS ECR。不需要儲存庫組態。  |   `arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly`   | 
|   **具有登入資料的儲存庫組態**   | 
|   AWS Secrets Manager （使用者名稱/權杖）  |  存放個人存取字符或密碼。在不使用 Kubernetes 存取的情況下啟用登入資料輪換。  |   `arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess`   | 
|   AWS Secrets Manager (SSH 金鑰）  |  使用 SSH 金鑰身分驗證。在不使用 Kubernetes 存取的情況下啟用登入資料輪換。  |   `arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess`   | 
|   AWS Secrets Manager (GitHub 應用程式）  |  使用私有金鑰進行 GitHub 應用程式身分驗證。在不使用 Kubernetes 存取的情況下啟用登入資料輪換。  |   `arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess`   | 
|  Kubernetes 秘密  |  使用叢集內秘密的標準 Argo CD 方法  |  無 (EKS Access Entry 使用 Kubernetes RBAC 處理的許可）  | 

## 直接存取 AWS 服務
<a name="direct_access_to_shared_aws_services"></a>

對於 AWS 服務，您可以直接在應用程式資源中參考它們，而無需建立儲存庫組態。功能角色必須具有必要的 IAM 許可。

### CodeCommit 儲存庫
<a name="_codecommit_repositories"></a>

直接在應用程式中參考 CodeCommit 儲存庫：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  source:
    repoURL: https://git-codecommit.region.amazonaws.com/v1/repos/repository-name
    targetRevision: main
    path: kubernetes/manifests
```

必要的功能角色許可：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "codecommit:GitPull",
      "Resource": "arn:aws:codecommit:region:account-id:repository-name"
    }
  ]
}
```

### CodeConnections
<a name="_codeconnections"></a>

透過 CodeConnections 參考 GitHub、GitLab 或 Bitbucket 儲存庫。儲存庫 URL 格式衍生自 CodeConnections 連線 ARN。

儲存庫 URL 格式為：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  source:
    repoURL: https://codeconnections.region.amazonaws.com/git-http/account-id/region/connection-id/owner/repository.git
    targetRevision: main
    path: kubernetes/manifests
```

必要的功能角色許可：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "codeconnections:UseConnection",
      "Resource": "arn:aws:codeconnections:region:account-id:connection/connection-id"
    }
  ]
}
```

### ECR Helm Chart
<a name="_ecr_helm_charts"></a>

ECR 會將 Helm Chart 儲存為 OCI 成品。Argo CD 支援兩種參考方式：

 **Helm 格式** （建議用於 Helm Chart)：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-helm
  namespace: argocd
spec:
  source:
    repoURL: account-id.dkr.ecr.region.amazonaws.com/repository-name
    targetRevision: chart-version
    chart: chart-name
    helm:
      valueFiles:
        - values.yaml
```

注意：使用 Helm 格式時，請勿包含 `oci://` 字首。使用 `chart` 欄位來指定圖表名稱。

 **OCI 格式** （適用於具有 Kubernetes 資訊清單的 OCI 成品）：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-oci
  namespace: argocd
spec:
  source:
    repoURL: oci://account-id.dkr.ecr.region.amazonaws.com/repository-name
    targetRevision: artifact-version
    path: path-to-manifests
```

注意：使用 OCI 格式時包含字`oci://`首。使用 `path` 欄位而非 `chart`。

必要的功能角色許可 - 連接 受管政策：

```
arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly
```

此政策包含必要的 ECR 許可：`ecr:GetAuthorizationToken`、 `ecr:BatchGetImage`和 `ecr:GetDownloadUrlForLayer`。

## 使用 AWS Secrets Manager
<a name="using_shared_aws_secrets_manager"></a>

將儲存庫登入資料儲存在 Secrets Manager 中，並在 Argo CD 儲存庫組態中參考它們。使用 Secrets Manager 可啟用自動憑證輪換，而不需要 Kubernetes RBAC 存取 - 憑證可以使用 Secrets Manager 的 IAM 許可輪換，Argo CD 會自動讀取更新的值。

**注意**  
對於跨多個儲存庫重複使用登入資料 （例如，GitHub 組織下的所有儲存庫），請使用儲存庫登入資料範本搭配 `argocd.argoproj.io/secret-type: repo-creds`。這可提供比建立個別儲存庫秘密更好的 UX。如需詳細資訊，請參閱 Argo CD 文件中的[儲存庫登入](https://argo-cd.readthedocs.io/en/stable/operator-manual/argocd-repo-creds-yaml/)資料。

### 使用者名稱和字符身分驗證
<a name="_username_and_token_authentication"></a>

對於具有個人存取字符或密碼的 HTTPS 儲存庫：

 **在 Secrets Manager 中建立秘密**：

```
aws secretsmanager create-secret \
  --name argocd/my-repo \
  --description "GitHub credentials for Argo CD" \
  --secret-string '{"username":"your-username","token":"your-personal-access-token"}'
```

 **選用的 TLS 用戶端憑證欄位** （適用於私有 Git 伺服器）：

```
aws secretsmanager create-secret \
  --name argocd/my-private-repo \
  --secret-string '{
    "username":"your-username",
    "token":"your-token",
    "tlsClientCertData":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi4uLgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t",
    "tlsClientCertKey":"LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi4uLgotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t"
  }'
```

**注意**  
`tlsClientCertData` 和 `tlsClientCertKey`值必須為 base64 編碼。

 **建立參考 Secrets Manager 的儲存庫秘密**：

```
apiVersion: v1
kind: Secret
metadata:
  name: my-repo
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: https://github.com/your-org/your-repo
  secretArn: arn:aws:secretsmanager:us-west-2:111122223333:secret:argocd/my-repo-AbCdEf
  project: default
```

### SSH 金鑰身分驗證
<a name="_ssh_key_authentication"></a>

對於以 SSH 為基礎的 Git 存取，請將私有金鑰儲存為純文字 （而非 JSON)：

 **使用 SSH 私有金鑰建立秘密**：

```
aws secretsmanager create-secret \
  --name argocd/my-repo-ssh \
  --description "SSH key for Argo CD" \
  --secret-string "-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
...
-----END OPENSSH PRIVATE KEY-----"
```

 **建立 SSH 的儲存庫秘密**：

```
apiVersion: v1
kind: Secret
metadata:
  name: my-repo-ssh
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: git@github.com:your-org/your-repo.git
  secretArn: arn:aws:secretsmanager:us-west-2:111122223333:secret:argocd/my-repo-ssh-AbCdEf
  project: default
```

### GitHub 應用程式身分驗證
<a name="_github_app_authentication"></a>

對於使用私有金鑰的 GitHub 應用程式身分驗證：

 **使用 GitHub 應用程式登入資料建立秘密**：

```
aws secretsmanager create-secret \
  --name argocd/github-app \
  --description "GitHub App credentials for Argo CD" \
  --secret-string '{
    "githubAppPrivateKeySecret":"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQouLi4KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0=",
    "githubAppID":"123456",
    "githubAppInstallationID":"12345678"
  }'
```

**注意**  
`githubAppPrivateKeySecret` 值必須為 base64 編碼。

 **GitHub Enterprise 的選用欄位**：

```
aws secretsmanager create-secret \
  --name argocd/github-enterprise-app \
  --secret-string '{
    "githubAppPrivateKeySecret":"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQouLi4KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0=",
    "githubAppID":"123456",
    "githubAppInstallationID":"12345678",
    "githubAppEnterpriseBaseUrl":"https://github.example.com/api/v3"
  }'
```

 **為 GitHub 應用程式建立儲存庫秘密**：

```
apiVersion: v1
kind: Secret
metadata:
  name: my-repo-github-app
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: https://github.com/your-org/your-repo
  secretArn: arn:aws:secretsmanager:us-west-2:111122223333:secret:argocd/github-app-AbCdEf
  project: default
```

### 儲存庫登入資料範本
<a name="_repository_credential_templates"></a>

對於跨多個儲存庫重複使用登入資料 （例如，GitHub 組織或使用者下的所有儲存庫），請使用儲存庫登入資料範本搭配 `argocd.argoproj.io/secret-type: repo-creds`。這可提供比為每個儲存庫建立個別儲存庫秘密更好的 UX。

 **建立儲存庫登入資料範本**：

```
apiVersion: v1
kind: Secret
metadata:
  name: github-org-creds
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repo-creds
stringData:
  type: git
  url: https://github.com/your-org
  secretArn: arn:aws:secretsmanager:us-west-2:111122223333:secret:argocd/github-org-AbCdEf
```

此登入資料範本適用於符合 URL 字首 的所有儲存庫`https://github.com/your-org`。然後，您可以在應用程式中參考此組織下的任何儲存庫，而無需建立其他秘密。

如需詳細資訊，請參閱 Argo CD 文件中的[儲存庫登入](https://argo-cd.readthedocs.io/en/stable/operator-manual/argocd-repo-creds-yaml/)資料。

**重要**  
確保您的 IAM 功能角色已`arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess`連接 受管政策或同等許可，包括 `secretsmanager:GetSecretValue`和 KMS 解密許可。如需 IAM 政策組態[Argo CD 考量事項](argocd-considerations.md)，請參閱 。

## 使用 AWS CodeConnections
<a name="using_shared_aws_codeconnections"></a>

如需 CodeConnections 整合，請參閱 [使用 AWS CodeConnections 連線至 Git 儲存庫](integration-codeconnections.md)。

CodeConnections 為 GitHub、GitLab 和 Bitbucket 提供受管身分驗證，而不儲存登入資料。

## 使用 Kubernetes 秘密
<a name="_using_kubernetes_secrets"></a>

使用標準 Argo CD 方法將登入資料直接儲存在 Kubernetes 中。

 **對於具有個人存取字符的 HTTPS**：

```
apiVersion: v1
kind: Secret
metadata:
  name: my-repo
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: https://github.com/your-org/your-repo
  username: your-username
  password: your-personal-access-token
```

 **對於 SSH**：

```
apiVersion: v1
kind: Secret
metadata:
  name: my-repo-ssh
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: git@github.com:your-org/your-repo.git
  sshPrivateKey: |
    -----BEGIN OPENSSH PRIVATE KEY-----
    ... your private key ...
    -----END OPENSSH PRIVATE KEY-----
```

## CodeCommit 儲存庫
<a name="_codecommit_repositories_2"></a>

For AWS CodeCommit，授予您的 IAM 功能角色 CodeCommit 許可 (`codecommit:GitPull`)。

設定儲存庫：

```
apiVersion: v1
kind: Secret
metadata:
  name: codecommit-repo
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: https://git-codecommit.us-west-2.amazonaws.com/v1/repos/my-repo
  project: default
```

如需詳細的 IAM 政策組態，請參閱 [Argo CD 考量事項](argocd-considerations.md)。

## 驗證儲存庫連線
<a name="_verify_repository_connection"></a>

透過設定 → 儲存庫下的 Argo CD UI 檢查連線狀態。UI 會顯示連線狀態和任何身分驗證錯誤。

儲存庫秘密不包含狀態資訊。

## 其他資源
<a name="_additional_resources"></a>
+  [註冊目標叢集](argocd-register-clusters.md) - 註冊部署的目標叢集
+  [建立應用程式](argocd-create-application.md) - 建立您的第一個應用程式
+  [Argo CD 考量事項](argocd-considerations.md) - IAM 許可和安全性組態
+  [私有儲存庫](https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/) - 上游儲存庫組態參考

# 註冊目標叢集
<a name="argocd-register-clusters"></a>

註冊叢集，讓 Argo CD 能夠將應用程式部署到叢集。您可以註冊 Argo CD 正在執行的相同叢集 （本機叢集） 或不同帳戶或區域中的遠端叢集。註冊叢集後，它會保持在未知連線狀態，直到您在該叢集內建立應用程式為止。若要在叢集註冊後建立 Argo CD 應用程式，請參閱 [建立應用程式](argocd-create-application.md)。

## 先決條件
<a name="_prerequisites"></a>
+ 建立 Argo CD 功能的 EKS 叢集
+  `kubectl` 設定為與您的叢集通訊
+ 對於遠端叢集：適當的 IAM 許可和存取項目

## 註冊本機叢集
<a name="_register_the_local_cluster"></a>

若要將應用程式部署到執行 Argo CD 的相同叢集，請將其註冊為部署目標。

**重要**  
Argo CD 功能不會自動註冊本機叢集。您必須明確註冊，才能將應用程式部署到相同的叢集。您可以使用叢集名稱`in-cluster`，與大多數線上 Argo CD 範例相容。

**注意**  
EKS 存取項目會自動為具有 Argo CD 功能角色的本機叢集建立，但預設不會授予 Kubernetes RBAC 許可。這遵循最低權限原則 - 您必須根據您的使用案例明確設定 Argo CD 所需的許可。例如，如果您只使用此叢集做為 Argo CD 中樞來管理遠端叢集，則不需要任何本機部署許可。如需組態選項，請參閱下方的存取項目 RBAC 要求一節。

 **使用 Argo CD CLI**：

```
argocd cluster add <cluster-context-name> \
  --aws-cluster-name arn:aws:eks:us-west-2:111122223333:cluster/my-cluster \
  --name local-cluster
```

 **使用 Kubernetes 秘密**：

```
apiVersion: v1
kind: Secret
metadata:
  name: local-cluster
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: cluster
stringData:
  name: local-cluster
  server: arn:aws:eks:us-west-2:111122223333:cluster/my-cluster
  project: default
```

套用組態：

```
kubectl apply -f local-cluster.yaml
```

**注意**  
在 `server` 欄位中使用 EKS 叢集 ARN，而不是 Kubernetes API 伺服器 URL。受管功能需要 ARNs才能識別叢集。`kubernetes.default.svc` 不支援預設值。

## 註冊遠端叢集
<a name="_register_remote_clusters"></a>

若要部署至遠端叢集：

 **步驟 1：在遠端叢集上建立存取項目** 

將 *region-code* 取代為遠端叢集所在的 AWS 區域，將 *remote-cluster* 取代為遠端叢集的名稱，並將 ARN 取代為 Argo CD 功能角色 ARN。

```
aws eks create-access-entry \
  --region region-code \
  --cluster-name remote-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole \
  --type STANDARD
```

 **步驟 2：將存取政策與 Kubernetes RBAC 許可建立關聯** 

Access Entry 需要 Kubernetes RBAC 許可，Argo CD 才能部署應用程式。若要快速入門，您可以使用 `AmazonEKSClusterAdminPolicy`：

```
aws eks associate-access-policy \
  --region region-code \
  --cluster-name remote-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \
  --access-scope type=cluster
```

**重要**  
`AmazonEKSClusterAdminPolicy` 提供完整的叢集管理員存取權 （相當於 `system:masters`)。這對於開始使用很方便，但不應用於生產環境。對於生產環境，請建立存取項目與自訂 Kubernetes 群組的關聯，並建立適當的角色或 ClusterRole 繫結，以使用更嚴格的許可。如需最低權限組態，請參閱下方的生產設定一節。

 **步驟 3：在 Argo CD 中註冊叢集** 

 **使用 Argo CD CLI**：

```
argocd cluster add <cluster-context-name> \
  --aws-cluster-name arn:aws:eks:us-west-2:111122223333:cluster/remote-cluster \
  --name remote-cluster
```

 **使用 Kubernetes 秘密**：

```
apiVersion: v1
kind: Secret
metadata:
  name: remote-cluster
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: cluster
stringData:
  name: remote-cluster
  server: arn:aws:eks:us-west-2:111122223333:cluster/remote-cluster
  project: default
```

套用組態：

```
kubectl apply -f remote-cluster.yaml
```

## 跨帳戶叢集
<a name="_cross_account_clusters"></a>

若要部署到不同 AWS 帳戶中的叢集：

1. 在目標帳戶中，使用來源帳戶中的 Argo CD IAM 功能角色 ARN 做為委託人，在目標 EKS 叢集上建立存取項目

1. 將存取政策與適當的 Kubernetes RBAC 許可建立關聯

1. 使用其 EKS 叢集 ARN 在 Argo CD 中註冊叢集

不需要額外的 IAM 角色建立或信任政策組態—EKS 存取項目會處理跨帳戶存取。

叢集 ARN 格式包含 區域，因此跨區域部署使用與相同區域部署相同的程序。

## 驗證叢集註冊
<a name="_verify_cluster_registration"></a>

檢視已註冊的叢集：

```
kubectl get secrets -n argocd -l argocd.argoproj.io/secret-type=cluster
```

或在設定 → 叢集下的 Argo CD UI 中檢查叢集狀態。

## 私有叢集
<a name="_private_clusters"></a>

Argo CD 功能提供全私有 EKS 叢集的透明存取，而不需要 VPC 對等互連或專用聯網組態。

 AWS 會自動管理 Argo CD 功能與私有遠端叢集之間的連線。

只需使用私有叢集的 ARN 註冊 - 不需要額外的聯網設定。

## 存取項目 RBAC 要求
<a name="_access_entry_rbac_requirements"></a>

當您建立 Argo CD 功能時，會自動為功能角色建立 EKS 存取項目，但預設不會授予 Kubernetes RBAC 許可。此刻意設計遵循最低權限原則 - 不同的使用案例需要不同的許可。

例如：\$1 如果您僅使用叢集做為 Argo CD 中樞來管理遠端叢集，則不需要本機部署許可 \$1 如果您在本機部署應用程式，則需要整個叢集的讀取存取和特定命名空間的寫入存取 \$1 如果您需要建立 CRDs，則需要額外的叢集管理許可

您必須根據您的需求明確設定 Argo CD 所需的許可。

### Argo CD 的最低許可
<a name="_minimum_permissions_for_argo_cd"></a>

Argo CD 需要兩種類型的許可才能在沒有錯誤的情況下運作：

 **讀取許可 （全叢集）**：Argo CD 必須能夠跨叢集讀取下列所有資源類型和自訂資源定義 (CRDs)：
+ 資源探索和運作狀態檢查
+ 偵測所需和實際狀態之間的偏離
+ 在部署之前驗證資源

 **寫入許可 （命名空間特定）**：Argo CD 需要建立、更新和刪除應用程式中所定義資源的許可：
+ 部署應用程式工作負載 （部署、服務、ConfigMaps 等）
+ 套用自訂資源 (CRDs)
+ 管理應用程式生命週期

### 快速設定
<a name="_quick_setup"></a>

若要快速入門、測試或開發環境，請使用 `AmazonEKSClusterAdminPolicy`：

```
aws eks associate-access-policy \
  --region region-code \
  --cluster-name my-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \
  --access-scope type=cluster
```

**重要**  
`AmazonEKSClusterAdminPolicy` 提供完整的叢集管理員存取權 （相當於 `system:masters`)，包括能夠建立 CRDs、修改整個叢集的資源，以及部署到任何命名空間。這對於開發和 POCs 來說很方便，但不應用於生產環境。對於生產，請使用下列最低權限設定。

### 最低權限的生產設定
<a name="_production_setup_with_least_privilege"></a>

對於生產環境，建立自訂 Kubernetes RBAC，以授予：
+ 整個叢集對所有 資源的讀取存取權 （適用於探索和運作狀態檢查）
+ 命名空間特定的寫入存取 （適用於部署）

 **步驟 1：將存取項目與自訂 Kubernetes 群組建立關聯** 

```
aws eks associate-access-policy \
  --region region-code \
  --cluster-name my-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSEditPolicy \
  --access-scope type=namespace,namespaces=app-namespace
```

 **步驟 2：建立 ClusterRole 以進行讀取存取** 

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: argocd-read-all
rules:
# Read access to all resources for discovery and health checks
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["get", "list", "watch"]
```

 **步驟 3：建立角色以寫入存取應用程式命名空間** 

```
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: argocd-deploy
  namespace: app-namespace
rules:
# Full access to deploy application resources
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
```

 **步驟 4：將角色繫結至 Kubernetes 群組** 

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: argocd-read-all
subjects:
- kind: Group
  name: eks-access-entry:arn:aws:iam::111122223333:role/ArgoCDCapabilityRole
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: argocd-read-all
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: argocd-deploy
  namespace: app-namespace
subjects:
- kind: Group
  name: eks-access-entry:arn:aws:iam::111122223333:role/ArgoCDCapabilityRole
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: argocd-deploy
  apiGroup: rbac.authorization.k8s.io
```

**注意**  
存取項目的群組名稱格式`eks-access-entry:`後面接著主體 ARN。針對 Argo CD 應部署應用程式的每個命名空間重複 RoleBinding。

**重要**  
Argo CD 必須能夠讀取叢集中的所有資源類型，以進行運作狀態檢查和探索，即使只部署到特定的命名空間。如果沒有整個叢集的讀取存取權，Argo CD 會在檢查應用程式運作狀態時顯示錯誤。

## 使用專案限制叢集存取
<a name="_restrict_cluster_access_with_projects"></a>

透過在 中設定允許的目標叢集和命名空間，使用專案來控制應用程式可以部署到哪些叢集和命名空間`spec.destinations`：

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: production
  namespace: argocd
spec:
  destinations:
  - server: arn:aws:eks:us-west-2:111122223333:cluster/prod-cluster
    namespace: '*'
  - server: arn:aws:eks:eu-west-1:111122223333:cluster/prod-eu-cluster
    namespace: '*'
  sourceRepos:
  - 'https://github.com/example/production-apps'
```

如需詳細資訊，請參閱[使用 Argo CD 專案](argocd-projects.md)。

## 其他資源
<a name="_additional_resources"></a>
+  [使用 Argo CD 專案](argocd-projects.md) - 組織應用程式並強制執行安全界限
+  [建立應用程式](argocd-create-application.md) - 部署您的第一個應用程式
+  [使用 ApplicationSets](argocd-applicationsets.md) - 使用 ApplicationSets 部署到多個叢集
+  [Argo CD 考量事項](argocd-considerations.md) - 多叢集模式和跨帳戶設定
+  [宣告式叢集設定](https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#clusters) - 上游叢集組態參考

# 使用 Argo CD 專案
<a name="argocd-projects"></a>

Argo CD Projects (AppProject) 提供應用程式的邏輯分組和存取控制。專案定義應用程式可以使用的 Git 儲存庫、目標叢集和命名空間，在共用 Argo CD 執行個體中啟用多租戶和安全界限。

## 何時使用專案
<a name="_when_to_use_projects"></a>

使用專案來：
+ 依團隊、環境或業務單位分隔應用程式
+ 限制團隊可以從中部署的儲存庫
+ 限制團隊可以部署到哪些叢集和命名空間
+ 強制執行資源配額和允許的資源類型
+ 使用護欄提供自助式應用程式部署

## 預設專案
<a name="_default_project"></a>

每個 Argo CD 功能都包含一個`default`專案，允許存取所有儲存庫、叢集和命名空間。雖然適用於初始測試，但請建立具有明確生產使用限制的專用專案。

如需預設專案組態及其限制方式的詳細資訊，請參閱 Argo CD 文件中的[預設專案](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#the-default-project)。

## 建立專案
<a name="_create_a_project"></a>

透過將 `AppProject` 資源套用至叢集來建立專案。

 **範例：團隊特定專案** 

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  description: Applications for Team A

  # Source repositories this project can deploy from
  sourceRepos:
    - 'https://github.com/my-org/team-a-*'
    - 'https://github.com/my-org/shared-libs'

  # Destination clusters and namespaces
  destinations:
    - name: dev-cluster
      namespace: team-a-dev
    - name: prod-cluster
      namespace: team-a-prod

  # Allowed resource types
  clusterResourceWhitelist:
    - group: ''
      kind: Namespace

  namespaceResourceWhitelist:
    - group: 'apps'
      kind: Deployment
    - group: ''
      kind: Service
    - group: ''
      kind: ConfigMap
```

套用專案：

```
kubectl apply -f team-a-project.yaml
```

## 專案組態
<a name="_project_configuration"></a>

### 來源儲存庫
<a name="_source_repositories"></a>

控制此專案中的應用程式可以使用哪些 Git 儲存庫：

```
spec:
  sourceRepos:
    - 'https://github.com/my-org/app-*'  # Wildcard pattern
    - 'https://github.com/my-org/infra'  # Specific repo
```

您可以使用萬用字元和否定模式 (`!` 字首） 來允許或拒絕特定儲存庫。如需詳細資訊，請參閱 Argo CD 文件中的[管理專案](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#managing-projects)。

### 目的地限制
<a name="_destination_restrictions"></a>

限制應用程式可以部署的位置：

```
spec:
  destinations:
    - name: prod-cluster  # Specific cluster by name
      namespace: production
    - name: '*'  # Any cluster
      namespace: team-a-*  # Namespace pattern
```

**重要**  
使用特定叢集名稱和命名空間模式，而不是生產專案的萬用字元。這可防止意外部署到未經授權的叢集或命名空間。

您可以使用萬用字元和否定模式來控制目的地。如需詳細資訊，請參閱 Argo CD 文件中的[管理專案](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#managing-projects)。

### 資源限制
<a name="_resource_restrictions"></a>

控制可以部署哪些 Kubernetes 資源類型：

 **叢集範圍的資源**：

```
spec:
  clusterResourceWhitelist:
    - group: ''
      kind: Namespace
    - group: 'rbac.authorization.k8s.io'
      kind: Role
```

 **命名空間範圍的資源**：

```
spec:
  namespaceResourceWhitelist:
    - group: 'apps'
      kind: Deployment
    - group: ''
      kind: Service
    - group: ''
      kind: ConfigMap
    - group: 's3.services.k8s.aws'
      kind: Bucket
```

使用封鎖清單拒絕特定資源：

```
spec:
  namespaceResourceBlacklist:
    - group: ''
      kind: Secret  # Prevent direct Secret creation
```

## 將應用程式指派給專案
<a name="_assign_applications_to_projects"></a>

建立應用程式時，請在 `spec.project` 欄位中指定專案：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: team-a  # Assign to team-a project
  source:
    repoURL: https://github.com/my-org/my-app
    path: manifests
  destination:
    name: prod-cluster
    namespace: team-a-prod
```

沒有指定專案的應用程式會使用`default`專案。

## 專案角色和 RBAC
<a name="_project_roles_and_rbac"></a>

專案可以為精細存取控制定義自訂角色。將專案角色映射至您功能組態中的 AWS Identity Center 使用者和群組，以控制誰可以同步、更新或刪除應用程式。

 **範例：具有開發人員和管理角色的專案** 

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  sourceRepos:
    - '*'
  destinations:
    - name: '*'
      namespace: 'team-a-*'

  roles:
    - name: developer
      description: Developers can sync applications
      policies:
        - p, proj:team-a:developer, applications, sync, team-a/*, allow
        - p, proj:team-a:developer, applications, get, team-a/*, allow
      groups:
        - team-a-developers

    - name: admin
      description: Admins have full access
      policies:
        - p, proj:team-a:admin, applications, *, team-a/*, allow
      groups:
        - team-a-admins
```

如需專案角色、CI/CD 管道的 JWT 權杖和 RBAC 組態的詳細資訊，請參閱 Argo CD 文件中的[專案角色](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#project-roles)。

## 常見模式
<a name="_common_patterns"></a>

### 以環境為基礎的專案
<a name="_environment_based_projects"></a>

為每個環境建立個別專案：

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: production
  namespace: argocd
spec:
  sourceRepos:
    - 'https://github.com/my-org/*'
  destinations:
    - name: prod-cluster
      namespace: '*'
  # Strict resource controls for production
  clusterResourceWhitelist: []
  namespaceResourceWhitelist:
    - group: 'apps'
      kind: Deployment
    - group: ''
      kind: Service
```

### 以團隊為基礎的專案
<a name="_team_based_projects"></a>

使用專用專案隔離團隊：

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: platform-team
  namespace: argocd
spec:
  sourceRepos:
    - 'https://github.com/my-org/platform-*'
  destinations:
    - name: '*'
      namespace: 'platform-*'
  # Platform team can manage cluster resources
  clusterResourceWhitelist:
    - group: '*'
      kind: '*'
```

### 多叢集專案
<a name="_multi_cluster_projects"></a>

使用一致的政策部署到多個叢集：

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: global-app
  namespace: argocd
spec:
  sourceRepos:
    - 'https://github.com/my-org/global-app'
  destinations:
    - name: us-west-cluster
      namespace: app
    - name: eu-west-cluster
      namespace: app
    - name: ap-south-cluster
      namespace: app
```

## 最佳實務
<a name="_best_practices"></a>

 **從限制性專案**開始：從縮小的許可開始，並視需要擴展，而不是從廣泛的存取開始。

 **使用命名空間模式**：在命名空間限制 （例如 `team-a-*`) 中利用萬用字元來允許彈性，同時維持邊界。

 **獨立生產專案**：使用專用專案進行生產，搭配更嚴格的控制和手動同步政策。

 **文件專案目的**：使用 `description` 欄位來說明每個專案的用途，以及應該使用它的對象。

 **定期檢閱專案許可**：定期稽核專案，以確保限制仍符合團隊需求和安全性要求。

## 其他資源
<a name="_additional_resources"></a>
+  [設定 Argo CD 許可](argocd-permissions.md) - 設定 RBAC 和 Identity Center 整合
+  [建立應用程式](argocd-create-application.md) - 在專案中建立應用程式
+  [使用 ApplicationSets](argocd-applicationsets.md) - 將 ApplicationSets 與多叢集部署的專案搭配使用
+  [Argo CD 專案文件](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/) - 完整上游參考

# 建立應用程式
<a name="argocd-create-application"></a>

應用程式代表目標叢集中的部署。每個應用程式都會定義來源 (Git 儲存庫） 和目的地 （叢集和命名空間）。套用時，Argo CD 會將 Git 儲存庫中資訊清單指定的資源建立到叢集中的命名空間。應用程式通常會指定工作負載部署，但可以管理目的地叢集中可用的任何 Kubernetes 資源。

## 先決條件
<a name="_prerequisites"></a>
+ 建立 Argo CD 功能的 EKS 叢集
+ 已設定儲存庫存取 （請參閱 [設定儲存庫存取](argocd-configure-repositories.md))
+ 目標叢集已註冊 （請參閱 [註冊目標叢集](argocd-register-clusters.md))
+  `kubectl` 設定為與您的叢集通訊

## 建立基本應用程式
<a name="_create_a_basic_application"></a>

定義從 Git 儲存庫部署的應用程式：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps
    targetRevision: HEAD
    path: guestbook
  destination:
    name: in-cluster
    namespace: default
```

**注意**  
`destination.name` 使用 與您在註冊叢集時使用的叢集名稱 （例如`in-cluster`本機叢集的 )。`destination.server` 欄位也適用於 EKS 叢集 ARNs，但建議使用叢集名稱以提高可讀性。

套用應用程式：

```
kubectl apply -f application.yaml
```

檢視應用程式狀態：

```
kubectl get application guestbook -n argocd
```

## 來源組態
<a name="_source_configuration"></a>

 **Git 儲存庫**：

```
spec:
  source:
    repoURL: https://github.com/example/my-app
    targetRevision: main
    path: kubernetes/manifests
```

 **特定 Git 標籤或遞交**：

```
spec:
  source:
    targetRevision: v1.2.0  # or commit SHA
```

 **Helm Chart**：

```
spec:
  source:
    repoURL: https://github.com/example/helm-charts
    targetRevision: main
    path: charts/my-app
    helm:
      valueFiles:
      - values.yaml
      parameters:
      - name: image.tag
        value: v1.2.0
```

 **Helm Chart 具有來自外部 Git 儲存庫的值** （多來源模式）：

```
spec:
  sources:
  - repoURL: https://github.com/example/helm-charts
    targetRevision: main
    path: charts/my-app
    helm:
      valueFiles:
      - $values/environments/production/values.yaml
  - repoURL: https://github.com/example/config-repo
    targetRevision: main
    ref: values
```

如需詳細資訊，請參閱 Argo CD 文件中的[來自外部 Git 儲存庫的 Helm 值檔案](https://argo-cd.readthedocs.io/en/stable/user-guide/multiple_sources/#helm-value-files-from-external-git-repository)。

 **ECR 的 Helm Chart**：

```
spec:
  source:
    repoURL: oci://account-id.dkr.ecr.region.amazonaws.com/repository-name
    targetRevision: chart-version
    chart: chart-name
```

如果功能角色具有必要的 ECR 許可，則直接使用儲存庫，不需要儲存庫組態。如需詳細資訊，請參閱 [設定儲存庫存取](argocd-configure-repositories.md)。

 **CodeCommit 的 Git 儲存庫**：

```
spec:
  source:
    repoURL: https://git-codecommit.region.amazonaws.com/v1/repos/repository-name
    targetRevision: main
    path: kubernetes/manifests
```

如果功能角色具有必要的 CodeCommit 許可，則直接使用儲存庫，不需要儲存庫組態。如需詳細資訊，請參閱 [設定儲存庫存取](argocd-configure-repositories.md)。

 **CodeConnections 中的 Git 儲存庫**：

```
spec:
  source:
    repoURL: https://codeconnections.region.amazonaws.com/git-http/account-id/region/connection-id/owner/repository.git
    targetRevision: main
    path: kubernetes/manifests
```

儲存庫 URL 格式衍生自 CodeConnections 連線 ARN。如果功能角色具有必要的 CodeConnections 許可，且已設定連線，則會直接使用儲存庫，而且不需要儲存庫組態。如需詳細資訊，請參閱 [設定儲存庫存取](argocd-configure-repositories.md)。

 **Kustomize**：

```
spec:
  source:
    repoURL: https://github.com/example/kustomize-app
    targetRevision: main
    path: overlays/production
    kustomize:
      namePrefix: prod-
```

## 同步政策
<a name="_sync_policies"></a>

控制 Argo CD 同步應用程式的方式。

 **手動同步 （預設）**：

應用程式需要手動核准才能同步：

```
spec:
  syncPolicy: {}  # No automated sync
```

手動觸發同步：

```
kubectl patch application guestbook -n argocd \
  --type merge \
  --patch '{"operation": {"initiatedBy": {"username": "admin"}, "sync": {}}}'
```

 **自動同步**：

偵測到 Git 變更時，應用程式會自動同步：

```
spec:
  syncPolicy:
    automated: {}
```

 **自我修復**：

自動將手動變更還原至叢集：

```
spec:
  syncPolicy:
    automated:
      selfHeal: true
```

啟用後，Argo CD 會還原直接對叢集所做的任何手動變更，確保 Git 仍然是事實來源。

 **剔除**：

自動刪除從 Git 移除的資源：

```
spec:
  syncPolicy:
    automated:
      prune: true
```

**警告**  
刪除 會從叢集刪除資源。在生產環境中謹慎使用 。

 **合併自動同步**：

```
spec:
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
```

 **重試組態**：

設定失敗同步的重試行為：

```
spec:
  syncPolicy:
    retry:
      limit: 5  # Number of failed sync attempts; unlimited if less than 0
      backoff:
        duration: 5s  # Amount to back off (default unit: seconds, also supports "2m", "1h")
        factor: 2  # Factor to multiply the base duration after each failed retry
        maxDuration: 3m  # Maximum amount of time allowed for the backoff strategy
```

這對於依賴於 CRDs的資源特別有用，而 CRD 可能無法立即使用。

## 同步選項
<a name="_sync_options"></a>

其他同步組態：

 **如果命名空間不存在，請建立命名空間**：

```
spec:
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
```

 **針對遺失的資源略過試轉**：

套用依賴尚不存在CRDs 的資源時很有用 （例如 kro 執行個體）：

```
spec:
  syncPolicy:
    syncOptions:
    - SkipDryRunOnMissingResource=true
```

這也可以使用資源本身上的標籤套用至特定資源。

 **在套用之前驗證資源**：

```
spec:
  syncPolicy:
    syncOptions:
    - Validate=true
```

 **僅套用不同步**：

```
spec:
  syncPolicy:
    syncOptions:
    - ApplyOutOfSyncOnly=true
```

## 進階同步功能
<a name="_advanced_sync_features"></a>

Argo CD 支援複雜部署的進階同步功能：
+  **同步波** – 使用`argocd.argoproj.io/sync-wave`註釋控制資源建立順序
+  **同步掛鉤** - 使用`argocd.argoproj.io/hook`註釋同步之前或之後執行任務 (PreSync、PostSync、SyncFail)
+  **資源運作狀態評估** - 自訂應用程式特定資源的運作狀態檢查

如需詳細資訊，請參閱 Argo CD 文件中的[同步波](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/)和資源[勾點](https://argo-cd.readthedocs.io/en/stable/user-guide/resource_hooks/)。

## 忽略差異
<a name="_ignore_differences"></a>

防止 Argo CD 同步由其他控制器管理的特定欄位 （例如 HPA 管理複本）：

```
spec:
  ignoreDifferences:
  - group: apps
    kind: Deployment
    jsonPointers:
    - /spec/replicas
```

如需忽略模式和欄位排除的詳細資訊，請參閱 Argo CD 文件中的[差異自訂](https://argo-cd.readthedocs.io/en/stable/user-guide/diffing/)。

## 多環境部署
<a name="_multi_environment_deployment"></a>

將相同的應用程式部署到多個環境：

 **開發**：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-dev
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/my-app
    targetRevision: develop
    path: overlays/development
  destination:
    name: dev-cluster
    namespace: my-app
```

 **生產**：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-prod
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/my-app
    targetRevision: main
    path: overlays/production
  destination:
    name: prod-cluster
    namespace: my-app
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
```

## 監控和管理應用程式
<a name="_monitor_and_manage_applications"></a>

 **檢視應用程式狀態**：

```
kubectl get application my-app -n argocd
```

 **存取 Argo CD UI**：

透過 EKS 主控台開啟 Argo CD UI，以檢視應用程式拓撲、同步狀態、資源運作狀態和部署歷史記錄。如需 UI 存取指示[使用 Argo CD](working-with-argocd.md)，請參閱 。

 **轉返應用程式**：

使用 Argo CD UI、Argo CD CLI 或將應用程式規格`targetRevision`中的 更新為先前的 Git 遞交或標籤，轉返至先前的修訂。

使用 Argo CD CLI：

```
argocd app rollback argocd/my-app <revision-id>
```

**注意**  
搭配 受管功能使用 Argo CD CLI 時，請指定命名空間字首為 的應用程式`namespace/appname`。

如需詳細資訊，請參閱 Argo CD 文件中的 [argocd 應用程式轉返](https://argo-cd.readthedocs.io/en/stable/user-guide/commands/argocd_app_rollback/)。

## 其他資源
<a name="_additional_resources"></a>
+  [使用 Argo CD 專案](argocd-projects.md) - 使用適用於多租戶環境的專案組織應用程式
+  [使用 ApplicationSets](argocd-applicationsets.md) - 使用 範本部署到多個叢集
+  [應用程式規格](https://argo-cd.readthedocs.io/en/stable/user-guide/application-specification/) - 完整應用程式 API 參考
+  [同步選項](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-options/) - 進階同步組態

# 使用 ApplicationSets
<a name="argocd-applicationsets"></a>

ApplicationSets 會從 範本產生多個應用程式，讓您能夠使用單一資源定義，在多個叢集、環境或命名空間之間部署相同的應用程式。

## 先決條件
<a name="_prerequisites"></a>
+ 建立 Argo CD 功能的 EKS 叢集
+ 已設定儲存庫存取 （請參閱 [設定儲存庫存取](argocd-configure-repositories.md))
+  `kubectl` 設定為與您的叢集通訊

**注意**  
ApplicationSets 不需要多個目標叢集。您可以使用叢集產生器以外的產生器 （例如清單、git 或矩陣產生器），在沒有遠端叢集的情況下部署應用程式。

## ApplicationSets 的運作方式
<a name="_how_applicationsets_work"></a>

ApplicationSets 使用產生器產生參數，然後將這些參數套用至應用程式範本。每組產生的參數都會建立一個應用程式。

EKS 部署的常見產生器：
+  **列出產生器** - 明確定義每個環境的叢集和參數
+  **叢集產生器** - 自動部署到所有已註冊的叢集
+  **Git 產生器** - 從儲存庫結構產生應用程式
+  **矩陣產生器** - 合併多維部署的產生器
+  **合併產生器** - 從多個產生器合併參數

如需完整的產生器參考，請參閱 [ApplicationSet 文件](https://argo-cd.readthedocs.io/en/stable/user-guide/application-set/)。

## 列出產生器
<a name="_list_generator"></a>

使用明確組態部署到多個叢集：

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook-all-clusters
  namespace: argocd
spec:
  generators:
  - list:
      elements:
      - environment: dev
        replicas: "2"
      - environment: staging
        replicas: "3"
      - environment: prod
        replicas: "5"
  template:
    metadata:
      name: 'guestbook-{{environment}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/guestbook
        targetRevision: HEAD
        path: 'overlays/{{environment}}'
      destination:
        name: '{{environment}}-cluster'
        namespace: guestbook
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
```

**注意**  
搭配使用 `destination.name`與叢集名稱，以提高可讀性。如有需要， `destination.server` 欄位也可使用 EKS 叢集 ARNs。

這會建立三個應用程式：`guestbook-dev`、 `guestbook-staging`和 `guestbook-prod`。

## 叢集產生器
<a name="_cluster_generator"></a>

自動部署到所有已註冊的叢集：

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: cluster-addons
  namespace: argocd
spec:
  generators:
  - clusters: {}
  template:
    metadata:
      name: '{{name}}-addons'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/cluster-addons
        targetRevision: HEAD
        path: addons
      destination:
        server: '{{server}}'
        namespace: kube-system
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
```

這會自動為每個註冊的叢集建立 應用程式。

 **篩選叢集**：

使用 `matchLabels` 來包含特定叢集，或使用 `matchExpressions` 來排除叢集：

```
spec:
  generators:
  - clusters:
      selector:
        matchLabels:
          environment: production
        matchExpressions:
        - key: skip-appset
          operator: DoesNotExist
```

## Git 產生器
<a name="_git_generators"></a>

Git 產生器會根據儲存庫結構建立應用程式：
+  **目錄產生器** - 將每個目錄部署為單獨的應用程式 （適用於微服務）
+  **檔案產生器** - 從參數檔案產生應用程式 （適用於多租用戶部署）

 **範例：微服務部署** 

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: microservices
  namespace: argocd
spec:
  generators:
  - git:
      repoURL: https://github.com/example/microservices
      revision: HEAD
      directories:
      - path: services/*
  template:
    metadata:
      name: '{{path.basename}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/microservices
        targetRevision: HEAD
        path: '{{path}}'
      destination:
        name: my-cluster
        namespace: '{{path.basename}}'
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
        syncOptions:
        - CreateNamespace=true
```

如需 Git 產生器和檔案型組態的詳細資訊，請參閱 Argo CD 文件中的 [Git 產生器](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators-Git/)。

## 矩陣產生器
<a name="_matrix_generator"></a>

結合多個產生器以跨多個維度部署 （環境 × 叢集）：

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: multi-env-multi-cluster
  namespace: argocd
spec:
  generators:
  - matrix:
      generators:
      - list:
          elements:
          - environment: dev
          - environment: staging
          - environment: prod
      - clusters:
          selector:
            matchLabels:
              region: us-west-2
  template:
    metadata:
      name: 'app-{{environment}}-{{name}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/app
        targetRevision: HEAD
        path: 'overlays/{{environment}}'
      destination:
        name: '{{name}}'
        namespace: 'app-{{environment}}'
```

如需合併產生器的詳細資訊，請參閱 Argo CD 文件中的[矩陣產生器](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators-Matrix/)。

## 多區域部署
<a name="_multi_region_deployment"></a>

部署到跨多個區域的叢集：

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: global-app
  namespace: argocd
spec:
  generators:
  - list:
      elements:
      - clusterName: prod-us-west
        region: us-west-2
      - clusterName: prod-us-east
        region: us-east-1
      - clusterName: prod-eu-west
        region: eu-west-1
  template:
    metadata:
      name: 'app-{{region}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/app
        targetRevision: HEAD
        path: kubernetes
        helm:
          parameters:
          - name: region
            value: '{{region}}'
      destination:
        name: '{{clusterName}}'
        namespace: app
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
```

## 管理 ApplicationSets
<a name="_manage_applicationsets"></a>

 **檢視 ApplicationSets 和產生的應用程式**：

```
kubectl get applicationsets -n argocd
kubectl get applications -n argocd -l argocd.argoproj.io/application-set-name=<applicationset-name>
```

 **更新 ApplicationSet**：

修改 ApplicationSet 規格並重新套用。Argo CD 會自動更新所有產生的應用程式：

```
kubectl apply -f applicationset.yaml
```

 **刪除 ApplicationSet**：

```
kubectl delete applicationset <name> -n argocd
```

**警告**  
刪除 ApplicationSet 會刪除所有產生的應用程式。如果這些應用程式有 `prune: true`，其資源也會從目標叢集中刪除。  
若要在刪除 ApplicationSet 時保留已部署的資源，請在 ApplicationSet 規格`true`中將 `.syncPolicy.preserveResourcesOnDeletion`設定為 。如需詳細資訊，請參閱 Argo CD 文件中的[應用程式刪除和資源刪除](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Application-Deletion/)。

**重要**  
Argo CD 的 ApplicationSets 功能具有您在使用 ApplicationSets 之前應注意的安全考量。如需詳細資訊，請參閱 Argo CD 文件中的 [ApplicationSet Security](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Security/)。

## 其他資源
<a name="_additional_resources"></a>
+  [使用 Argo CD 專案](argocd-projects.md) - 使用專案組織 ApplicationSets 
+  [建立應用程式](argocd-create-application.md) - 了解應用程式組態
+  [ApplicationSet 文件](https://argo-cd.readthedocs.io/en/stable/user-guide/application-set/) - 完整的產生器參考和模式
+  [產生器參考](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators/) - 詳細的產生器規格

# Argo CD 考量事項
<a name="argocd-considerations"></a>

本主題涵蓋使用 Argo CD 的 EKS 功能的重要考量，包括規劃、許可、身分驗證和多叢集部署模式。

## 規劃
<a name="_planning"></a>

部署 Argo CD 之前，請考慮下列事項：

 **儲存庫策略**：判斷應用程式資訊清單的儲存位置 (CodeCommit、GitHub、GitLab、Bitbucket)。規劃不同環境的儲存庫結構和分支策略。

 **RBAC 策略**：規劃哪些團隊或使用者應具有管理員、編輯器或檢視器存取權。將這些映射到 AWS Identity Center 群組或 Argo CD 角色。

 **多叢集架構**：判斷您是否會從單一 Argo CD 執行個體管理多個叢集。考慮為 Argo CD 使用專用管理叢集。

 **應用程式組織**：規劃如何建構應用程式和 ApplicationSets。考慮使用專案來依團隊或環境組織應用程式。

 **同步政策**：決定應用程式是否應自動同步或需要手動核准。自動化同步常見於開發，手動用於生產。

## 許可
<a name="_permissions"></a>

如需 IAM 功能角色、信任政策和安全最佳實務的詳細資訊，請參閱 [Amazon EKS 功能 IAM 角色](capability-role.md)和 [EKS 功能的安全考量](capabilities-security.md)。

### IAM 功能角色概觀
<a name="_iam_capability_role_overview"></a>

當您建立 Argo CD 功能資源時，您會提供 IAM 功能角色。與 ACK 不同，Argo CD 主要管理 Kubernetes 資源，而不是直接管理 AWS 資源。不過，下列項目需要 IAM 功能角色：
+ 在 CodeCommit 中存取私有 Git 儲存庫
+ 與 AWS Identity Center 整合以進行身分驗證
+ 在 AWS Secrets Manager 中存取秘密 （如果已設定）
+ 跨叢集部署至其他 EKS 叢集

### CodeCommit 整合
<a name="_codecommit_integration"></a>

如果您使用的是 CodeCommit 儲存庫，請連接具有讀取許可的政策：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "codecommit:GitPull"
      ],
      "Resource": "*"
    }
  ]
}
```

**重要**  
對於生產用途，請將 `Resource` 欄位限制為特定儲存庫 ARNs，而不是使用 `"*"`。  
範例：  

```
"Resource": "arn:aws:codecommit:us-west-2:111122223333:my-app-repo"
```
這會將 Argo CD 功能的存取權限制為僅需要管理的儲存庫。

### Secrets Manager 整合
<a name="_secrets_manager_integration"></a>

如果您要將儲存庫登入資料儲存在 Secrets Manager 中，請連接 受管政策以進行讀取存取：

```
arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess
```

此政策包含必要的許可：`secretsmanager:GetSecretValue`、 `secretsmanager:DescribeSecret`和 KMS 解密許可。

### 基本設定
<a name="_basic_setup"></a>

對於具有公有 Git 儲存庫的基本 Argo CD 功能，除了信任政策之外，不需要額外的 IAM 政策。

## 身分驗證
<a name="_authentication"></a>

### AWS Identity Center 整合
<a name="shared_aws_identity_center_integration"></a>

Argo CD 受管功能直接與 AWS Identity Center （先前稱為 AWS SSO) 整合，可讓您使用現有的身分提供者進行身分驗證。

當您設定 AWS Identity Center 整合時：

1. 使用者透過 EKS 主控台存取 Argo CD UI

1. 他們使用 AWS Identity Center 進行身分驗證 （可聯合到您的公司身分提供者）

1.  AWS Identity Center 提供使用者和群組資訊給 Argo CD

1. Argo CD 會根據您的組態，將使用者和群組映射至 RBAC 角色

1. 使用者只會看到他們有權存取的應用程式和資源

### 使用 Identity Center 許可集簡化存取
<a name="_simplifying_access_with_identity_center_permission_sets"></a>

 AWS Identity Center 在使用 Argo CD 時提供兩種不同的身分驗證路徑：

 **Argo CD API 身分驗證**： Identity Center 為 Argo CD UI 和 API 提供 SSO 身分驗證。這是透過 Argo CD 功能的 RBAC 角色映射來設定。

 **EKS 叢集存取**：Argo CD 功能使用客戶提供的 IAM 角色，透過存取項目向 EKS 叢集進行驗證。您可以手動設定這些存取項目來新增或移除許可。

您可以使用 [Identity Center 許可集](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtocreatepermissionset.html)來簡化身分管理，方法是允許單一身分同時存取 Argo CD 和 EKS 叢集。這可降低額外負荷，只需跨兩個系統管理一個身分，而不是維護 Argo CD 存取和叢集存取的個別登入資料。

### RBAC 角色映射
<a name="_rbac_role_mappings"></a>

Argo CD 具有內建角色，您可以映射到 AWS Identity Center 使用者和群組：

 **ADMIN**：完整存取所有應用程式和設定。可以建立、更新和刪除應用程式。可以管理 Argo CD 組態。

 **EDITOR**：可以建立和修改應用程式。無法變更 Argo CD 設定或刪除應用程式。

 **VIEWER**：唯讀存取應用程式。可以檢視應用程式狀態和歷史記錄。無法進行變更。

**注意**  
角色名稱區分大小寫，且必須為大寫 (ADMIN、EDITOR、VIEWER)。

**重要**  
EKS 功能與 AWS Identity Center 整合支援每個 Argo CD 功能最多 1，000 個身分。身分可以是使用者或群組。

## 多叢集部署
<a name="_multi_cluster_deployments"></a>

Argo CD 受管功能支援多叢集部署，可讓您從單一 Argo CD 執行個體管理跨開發、預備和生產叢集的應用程式。

### 多叢集的運作方式
<a name="_how_multi_cluster_works"></a>

當您向 Argo CD 註冊其他叢集時：

1. 您可以建立依 ARN 參考目標 EKS 叢集的叢集秘密

1. 您可以建立以不同叢集為目標的應用程式或 ApplicationSets 

1. Argo CD 會連線至每個叢集以部署和監看資源

1. 您可以從單一 Argo CD UI 檢視和管理所有叢集

### 多叢集的先決條件
<a name="_prerequisites_for_multi_cluster"></a>

註冊其他叢集之前：
+ 在目標叢集上為 Argo CD 功能角色建立存取項目
+ 確保 Argo CD 功能與目標叢集之間的網路連線
+ 驗證存取目標叢集的 IAM 許可

### 註冊叢集
<a name="_register_a_cluster"></a>

在 `argocd` 命名空間中使用 Kubernetes Secrets 註冊叢集。

取得目標叢集 ARN。將 *region-code* 取代為目標叢集所在的 AWS 區域，並將 *target-cluster* 取代為目標叢集的名稱。

```
aws eks describe-cluster \
  --region region-code \
  --name target-cluster \
  --query 'cluster.arn' \
  --output text
```

使用叢集 ARN 建立叢集秘密：

```
apiVersion: v1
kind: Secret
metadata:
  name: target-cluster
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
  name: target-cluster
  server: arn:aws:eks:us-west-2:111122223333:cluster/target-cluster
  project: default
```

**重要**  
在 `server` 欄位中使用 EKS 叢集 ARN，而不是 Kubernetes API 伺服器 URL。受管功能需要 ARNs才能識別目標叢集。

套用秘密：

```
kubectl apply -f cluster-secret.yaml
```

### 在目標叢集上設定存取項目
<a name="_configure_access_entry_on_target_cluster"></a>

目標叢集必須具有存取項目，以授予 Argo CD 功能角色部署應用程式的許可。將 *region-code* 取代為目標叢集所在的 AWS 區域，將 *target-cluster* 取代為目標叢集的名稱，並將 ARN 取代為 Argo CD 功能角色 ARN。

```
aws eks create-access-entry \
  --region region-code \
  --cluster-name target-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole \
  --type STANDARD \
  --kubernetes-groups system:masters
```

**注意**  
對於生產用途，請考慮使用更嚴格的 Kubernetes 群組，而非 `system:masters`。

### 私有叢集存取
<a name="_private_cluster_access"></a>

Argo CD 受管功能可以部署到全私有 EKS 叢集，而不需要 VPC 對等互連或專用聯網組態。 會自動 AWS 管理 Argo CD 功能與私有遠端叢集之間的連線。確定您的儲存庫存取控制和 Argo CD RBAC 政策已正確設定。

### 跨帳戶部署
<a name="_cross_account_deployments"></a>

對於跨帳戶部署，從來源帳戶將 Argo CD IAM 功能角色新增至目標叢集的 EKS 存取項目：

1. 在目標帳戶中，在目標 EKS 叢集上建立存取項目

1. 使用來源帳戶中的 Argo CD IAM 功能角色 ARN 做為委託人

1. 為存取項目設定適當的 Kubernetes RBAC 許可

1. 使用其 EKS 叢集 ARN 在 Argo CD 中註冊目標叢集

不需要額外的 IAM 角色建立或信任政策組態—EKS 存取項目會處理跨帳戶存取。

## 最佳實務
<a name="_best_practices"></a>

 **使用宣告性來源作為事實來源**：將所有應用程式資訊清單存放在宣告性來源 (Git 儲存庫、Helm 登錄檔或 OCI 映像），啟用版本控制、稽核追蹤和協同合作。

 **實作適當的 RBAC**：使用 AWS Identity Center 整合來控制誰可以存取和管理 Argo CD 中的應用程式。Argo CD 支援對應用程式 （部署、Pod、ConfigMaps、秘密） 內資源的精細存取控制。

 **使用 ApplicationSets 進行多環境部署**：使用 ApplicationSets 在具有不同組態的多個叢集或命名空間中部署應用程式。

## 生命週期管理
<a name="_lifecycle_management"></a>

### 應用程式同步政策
<a name="_application_sync_policies"></a>

控制 Argo CD 同步應用程式的方式：

 **手動同步**：應用程式需要手動核准才能同步變更。建議用於**生產**環境。

 **自動同步**：偵測到 Git 變更時，應用程式會自動同步。常見於開發和預備環境。

 **自我修復**：自動還原對叢集所做的手動變更。確保叢集狀態符合 Git。

 **刪除**：自動刪除從 Git 移除的資源。請謹慎使用 ，因為這可能會刪除資源。

### 應用程式運作狀態
<a name="_application_health"></a>

Argo CD 會持續監控應用程式運作狀態：
+  **運作狀態良好**：所有資源都如預期般執行
+  **進行中**：正在建立或更新資源
+  **降級**：某些資源運作狀態不佳
+  **已暫停**：應用程式已暫停
+  **遺失**：叢集中缺少資源

### 同步視窗
<a name="_sync_windows"></a>

設定同步時段以控制應用程式可以同步的時間：
+ 僅允許在維護時段進行同步
+ 上班時間的區塊同步
+ 排程特定時間的自動同步
+ 在您需要進行變更和停止任何同步的情況下 （突破性案例），使用同步時段

## Webhook 組態可更快速同步
<a name="_webhook_configuration_for_faster_sync"></a>

根據預設，Argo CD 每 6 分鐘輪詢一次 Git 儲存庫，以偵測變更。如需更靈敏的部署，請將 Git Webhook 設定為在推送變更時觸發立即同步。

Webhooks 提供數種優點：
+ 推送程式碼時的立即同步回應 （秒與分鐘）
+ 減少輪詢負荷並改善系統效能
+ 更有效率地使用 API 速率限制
+ 透過更快的意見回饋獲得更好的使用者體驗

### Webhook 端點
<a name="_webhook_endpoint"></a>

Webhook URL 遵循模式 `${serverUrl}/api/webhook`，其中 `serverUrl`是您的 Argo CD 伺服器 URL。

例如，如果您的 Argo CD 伺服器 URL 為 `https://abc123.eks-capabilities.us-west-2.amazonaws.com`，則 Webhook URL 為：

```
https://abc123.eks-capabilities.us-west-2.amazonaws.com/api/webhook
```

### 依 Git 提供者設定 Webhook
<a name="_configure_webhooks_by_git_provider"></a>

 **GitHub**：在您的儲存庫設定中，使用 Argo CD Webhook URL 新增 Webhook。將內容類型設定為 `application/json`，然後選取「僅推送事件」。

 **GitLab**：在您的專案設定中，使用 Argo CD Webhook URL 新增 Webhook。啟用「推送事件」和選用的「標籤推送事件」。

 **Bitbucket**：在您的儲存庫設定中，使用 Argo CD Webhook URL 新增 Webhook。選取「儲存庫推送」作為觸發。

 **CodeCommit**：建立在 CodeCommit 儲存庫狀態變更時觸發的 Amazon EventBridge 規則，並將通知傳送至 Argo CD Webhook 端點。

如需詳細 Webhook 組態指示，請參閱 [Argo CD Webhook 組態](https://argo-cd.readthedocs.io/en/stable/operator-manual/webhook/)。

**注意**  
Webhook 補充輪詢 - 它們不會取代它。Argo CD 會繼續輪詢儲存庫做為備用機制，以防 Webhook 通知遺失。

## 後續步驟
<a name="_next_steps"></a>
+  [使用 Argo CD](working-with-argocd.md) - 了解如何建立和管理 Argo CD 應用程式
+  [對 Argo CD 功能的問題進行故障診斷](argocd-troubleshooting.md) - 對 Argo CD 問題進行故障診斷
+  [使用 功能資源](working-with-capabilities.md) - 管理您的 Argo CD 功能資源

# 對 Argo CD 功能的問題進行故障診斷
<a name="argocd-troubleshooting"></a>

本主題提供 Argo CD 的 EKS 功能疑難排解指引，包括功能運作狀態檢查、應用程式同步問題、儲存庫身分驗證和多叢集部署。

**注意**  
EKS 功能是完全受管的，並在叢集外部執行。您無法存取 Argo CD 伺服器日誌或`argocd`命名空間。故障診斷著重於功能運作狀態、應用程式狀態和組態。

## 功能為 ACTIVE，但應用程式未同步
<a name="_capability_is_active_but_applications_arent_syncing"></a>

如果您的 Argo CD 功能顯示`ACTIVE`狀態，但應用程式未同步，請檢查功能運作狀態和應用程式狀態。

 **檢查功能運作狀態**：

您可以在 EKS 主控台或使用 AWS CLI 檢視功能運作狀態和狀態問題。

 **主控台**：

1. 在以下網址開啟 Amazon EKS 主控台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 選取您的叢集名稱。

1. 選擇**可觀測性**索引標籤。

1. 選擇**監控叢集**。

1. 選擇**功能**索引標籤以檢視所有功能的運作狀態和狀態。

 ** AWS CLI**：

```
# View capability status and health
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-argocd

# Look for issues in the health section
```

 **常見原因**：
+  **未設定儲存庫**：Git 儲存庫未新增至 Argo CD
+  **驗證失敗**：SSH 金鑰、字符或 CodeCommit 登入資料無效
+  **未建立應用程式**：叢集中不存在應用程式資源
+  **同步政策**：需要手動同步 （未啟用自動同步）
+  **IAM 許可**：缺少 CodeCommit 或 Secrets Manager 的許可

 **檢查應用程式狀態**：

```
# List applications
kubectl get application -n argocd

# View sync status
kubectl get application my-app -n argocd -o jsonpath='{.status.sync.status}'

# View application health
kubectl get application my-app -n argocd -o jsonpath='{.status.health}'
```

 **檢查應用程式條件**：

```
# Describe application to see detailed status
kubectl describe application my-app -n argocd

# View application health
kubectl get application my-app -n argocd -o jsonpath='{.status.health}'
```

## 應用程式停滯在「進行中」狀態
<a name="_applications_stuck_in_progressing_state"></a>

如果應用程式顯示 `Progressing`但從未達到 `Healthy`，請檢查應用程式的資源狀態和事件。

 **檢查資源運作狀態**：

```
# View application resources
kubectl get application my-app -n argocd -o jsonpath='{.status.resources}'

# Check for unhealthy resources
kubectl describe application my-app -n argocd | grep -A 10 "Health Status"
```

 **常見原因**：
+  **部署未就緒**：Pod 無法啟動或整備探查失敗
+  **資源相依性**：等待其他資源準備就緒的資源
+  **映像提取錯誤**：無法存取容器映像
+  **資源不足**：叢集缺乏 Pod 的 CPU 或記憶體

 **驗證目標叢集組態** （適用於多叢集設定）：

```
# List registered clusters
kubectl get secret -n argocd -l argocd.argoproj.io/secret-type=cluster

# View cluster secret details
kubectl get secret cluster-secret-name -n argocd -o yaml
```

## 儲存庫身分驗證失敗
<a name="_repository_authentication_failures"></a>

如果 Argo CD 無法存取您的 Git 儲存庫，請驗證身分驗證組態。

 **對於 CodeCommit 儲存庫**：

驗證 IAM 功能角色具有 CodeCommit 許可：

```
# View IAM policies
aws iam list-attached-role-policies --role-name my-argocd-capability-role
aws iam list-role-policies --role-name my-argocd-capability-role

# Get specific policy details
aws iam get-role-policy --role-name my-argocd-capability-role --policy-name policy-name
```

角色需要儲存庫的`codecommit:GitPull`許可。

 **對於私有 Git 儲存庫**：

確認儲存庫登入資料已正確設定：

```
# Check repository secret exists
kubectl get secret -n argocd repo-secret-name -o yaml
```

確保秘密包含正確的身分驗證憑證 (SSH 金鑰、字符或使用者名稱/密碼）。

 **對於使用 Secrets Manager 的儲存庫**：

```
# Verify IAM Capability Role has Secrets Manager permissions
aws iam list-attached-role-policies --role-name my-argocd-capability-role

# Test secret retrieval
aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:region-code:111122223333:secret:my-secret
```

## 多叢集部署問題
<a name="_multi_cluster_deployment_issues"></a>

如果應用程式未部署到遠端叢集，請驗證叢集註冊和存取組態。

 **檢查叢集註冊**：

```
# List registered clusters
kubectl get secret -n argocd -l argocd.argoproj.io/secret-type=cluster

# Verify cluster secret format
kubectl get secret CLUSTER_SECRET_NAME -n argocd -o yaml
```

確保 `server` 欄位包含 EKS 叢集 ARN，而不是 Kubernetes API URL。

 **驗證目標叢集存取項目**：

在目標叢集上，檢查 Argo CD 功能角色是否具有存取項目：

```
# List access entries (run on target cluster or use AWS CLI)
aws eks list-access-entries --cluster-name target-cluster

# Describe specific access entry
aws eks describe-access-entry \
  --cluster-name target-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/my-argocd-capability-role
```

 **檢查跨帳戶的 IAM 許可**：

對於跨帳戶部署，請確認 Argo CD 功能角色在目標叢集上有存取項目。受管功能使用 EKS 存取項目進行跨帳戶存取，而非 IAM 角色假設。

如需多叢集組態的詳細資訊，請參閱[註冊目標叢集](argocd-register-clusters.md)。

## 後續步驟
<a name="_next_steps"></a>
+  [Argo CD 考量事項](argocd-considerations.md) - Argo CD 考量事項和最佳實務
+  [使用 Argo CD](working-with-argocd.md) - 建立和管理 Argo CD 應用程式
+  [註冊目標叢集](argocd-register-clusters.md) - 設定多叢集部署
+  [對 EKS 功能進行故障診斷](capabilities-troubleshooting.md) - 一般功能故障診斷指引

# 比較 Argo CD 與自我管理 Argo CD 的 EKS 功能
<a name="argocd-comparison"></a>

EKS 的 Argo CD 功能提供以 EKS 執行的全受管 Argo CD 體驗。如需 EKS 功能與自我管理解決方案的一般比較，請參閱[EKS 功能考量事項](capabilities-considerations.md)。本主題著重於 Argo CD 的特定差異，包括身分驗證、多叢集管理和上游功能支援。

## 與上游 Argo CD 的差異
<a name="_differences_from_upstream_argo_cd"></a>

Argo CD 的 EKS 功能是以上游 Argo CD 為基礎，但其存取、設定和整合 AWS 服務的方式有所不同。

 **RBAC 和身分驗證**： 功能隨附三個 RBAC 角色 （管理員、編輯器、檢視器），並使用 AWS Identity Center 進行身分驗證，而非 Argo CD 的內建身分驗證。透過 功能的 `rbacRoleMapping` 參數設定角色映射，將 Identity Center 群組映射至 Argo CD 角色，而不是透過 Argo CD 的 `argocd-rbac-cm` ConfigMap。Argo CD UI 使用自己的直接 URL 託管 （在叢集的功能索引標籤下的 EKS 主控台中找到），而 API 存取使用透過 IAM 的 AWS 身分驗證和授權。

 **叢集組態**： 功能不會自動設定本機叢集或hub-and-spoke拓撲。您可以設定部署目標叢集和 EKS 存取項目。此功能僅支援使用 EKS 叢集 ARNs （不支援 Kubernetes API 伺服器 URLs) 做為部署目標的 Amazon EKS 叢集。此功能不會自動新增本機叢集 (`kubernetes.default.svc`) 做為部署目標，若要部署至建立此功能的相同叢集，請使用其 ARN 明確註冊該叢集。

 **簡化的遠端叢集存取**： 功能使用 EKS 存取項目將 Argo CD 存取授予遠端叢集，以簡化多叢集部署，無需設定服務帳戶的 IAM 角色 (IRSA) 或設定跨帳戶 IAM 角色假設。此功能也提供全私有 EKS 叢集的透明存取，而不需要 VPC 對等互連或特殊聯網組態，可自動AWS 管理 Argo CD 功能與私有遠端叢集之間的連線。

 **直接 AWS 服務整合**： 功能透過功能角色的 IAM 許可，提供與 AWS 服務的直接整合。您可以直接在應用程式資源中參考 CodeCommit 儲存庫、ECR Helm Chart 和 CodeConnections，而無需建立儲存庫組態。這可簡化身分驗證，並消除管理 AWS 服務個別登入資料的需求。如需詳細資訊，請參閱 [設定儲存庫存取](argocd-configure-repositories.md)。

 **命名空間支援**： 功能需要您指定單一命名空間，其中必須建立 Argo CD Application、ApplicationSet 和 AppProject 自訂資源。

**注意**  
此命名空間限制僅適用於 Argo CD 自己的自訂資源 (Application、ApplicationSet、AppProject)。您的應用程式工作負載可以部署到任何目標叢集中的任何命名空間。例如，如果您使用命名空間 建立 功能`argocd`，則必須在`argocd`命名空間中建立所有應用程式 CRs，但這些應用程式可以將工作負載部署到 `default`、`staging`、 `production`或任何其他命名空間。

**注意**  
受管功能對 CLI 用量和 AppProject 組態有特定要求：  
使用 Argo CD CLI 時，請使用命名空間字首指定應用程式： `argocd app sync namespace/appname`
AppProject 資源必須指定 `.spec.sourceNamespaces`來定義專案可監看的應用程式命名空間 （通常設定為您在建立功能時指定的命名空間）
資源追蹤註釋使用 格式： `namespace_appname:group/kind:namespace/name`

 **不支援的功能**：下列功能不適用於 受管功能：
+ 用於產生自訂資訊清單的 Config Management 外掛程式 (CMPs)
+ 資源運作狀態評估的自訂 Lua 指令碼 （支援標準資源的內建運作狀態檢查）
+ 通知控制器
+ 自訂 SSO 供應商 （僅支援 AWS Identity Center，包括透過 AWS Identity Center 的第三方聯合身分）
+ UI 擴充功能和自訂橫幅
+ 直接存取 `argocd-cm`、 `argocd-params`和其他組態 ConfigMaps
+ 修改同步逾時 （修正為 120 秒）

 **相容性**：Application 和 ApplicationSets 的運作方式與上游 Argo CD 相同，而不會變更資訊清單。該功能使用相同的 Kubernetes APIs 和 CRDs，因此 等工具`kubectl`的運作方式相同。功能完全支援應用程式和 ApplicationSets、GitOps 工作流程與自動同步、多叢集部署、同步政策 （自動化、剪下、自我修復）、同步波和勾點、標準 Kubernetes 資源的運作狀態評估、轉返功能、Git 儲存庫來源 (HTTPS 和 SSH)、Helm、Kutomize 和純 YAML 資訊清單、GitHub 應用程式憑證、多租用專案，以及資源排除和包含項目。

## 搭配 受管功能使用 Argo CD CLI
<a name="argocd-cli-configuration"></a>

Argo CD CLI 的運作方式與大多數操作的上游 Argo CD 相同，但身分驗證和叢集註冊不同。

### 先決條件
<a name="_prerequisites"></a>

按照[上游安裝說明安裝](https://argo-cd.readthedocs.io/en/stable/cli_installation/) Argo CD CLI。

### Configuration
<a name="_configuration"></a>

使用環境變數設定 CLI：

1. 從 EKS 主控台 （叢集**的功能**索引標籤下） 或使用 AWS CLI 取得 Argo CD 伺服器 URL。必須移除字`https://`首：

   ```
   export ARGOCD_SERVER=$(aws eks describe-capability \
     --cluster-name my-cluster \
     --capability-name my-argocd \
     --query 'capability.configuration.argoCd.serverUrl' \
     --output text \
     --region region-code | sed 's|^https://||')
   ```

1. 從 Argo CD UI 產生帳戶字符 (**設定** → **帳戶** → **管理員** → **產生新字符**)，然後將其設定為環境變數：

   ```
   export ARGOCD_AUTH_TOKEN="your-token-here"
   ```

**重要**  
此組態使用管理員帳戶字符進行初始設定和開發工作流程。對於生產使用案例，請使用專案範圍的角色和字符來遵循最低權限原則。如需設定專案角色和 RBAC 的詳細資訊，請參閱 [設定 Argo CD 許可](argocd-permissions.md)。

1. 設定必要的 gRPC 選項：

   ```
   export ARGOCD_OPTS="--grpc-web"
   ```

設定這些環境變數後，您可以在不使用 `argocd login`命令的情況下使用 Argo CD CLI。

### 主要差異
<a name="_key_differences"></a>

受管功能具有下列 CLI 限制：
+  `argocd admin` 不支援 命令 （需要直接 Pod 存取）
+  `argocd login` 不支援 （請改用 帳戶或專案字符）
+  `argocd cluster add` 需要具有 EKS 叢集 ARN 的 `--aws-cluster-name`旗標

### 範例：註冊叢集
<a name="_example_register_a_cluster"></a>

註冊 EKS 叢集以進行應用程式部署：

```
# Get the cluster ARN
CLUSTER_ARN=$(aws eks describe-cluster \
  --name my-cluster \
  --query 'cluster.arn' \
  --output text)

# Register the cluster
argocd cluster add $CLUSTER_ARN \
  --aws-cluster-name $CLUSTER_ARN \
  --name in-cluster \
  --project default
```

如需完整的 Argo CD CLI 文件，請參閱 [Argo CD CLI 參考](https://argo-cd.readthedocs.io/en/stable/user-guide/commands/argocd/)。

## 遷移路徑
<a name="_migration_path"></a>

您可以從自我管理的 Argo CD 遷移到 受管功能：

1. 檢閱目前 Argo CD 組態是否有不支援的功能 （通知控制器、CMPs、自訂運作狀態檢查、UI 延伸）

1. 將您的自我管理 Argo CD 控制器擴展至零個複本，以防止衝突

1. 在叢集上建立 Argo CD 功能資源

1. 匯出現有的應用程式、ApplicationSets 和 AppProjects

1. 遷移儲存庫登入資料、叢集秘密和儲存庫登入資料範本 （已複製）

1. 如果使用 GPG 金鑰、TLS 憑證或 SSH 已知主機，請一併遷移這些組態

1. 更新`destination.server`欄位以使用叢集名稱或 EKS 叢集 ARNs

1. 將它們套用至受管 Argo CD 執行個體

1. 驗證應用程式是否正確同步

1. 停用自我管理的 Argo CD 安裝

受管功能使用相同的 Argo CD APIs 和資源定義，因此您現有的資訊清單會以最少的修改運作。

## 後續步驟
<a name="_next_steps"></a>
+  [建立 Argo CD 功能](create-argocd-capability.md) - 建立 Argo CD 功能資源
+  [使用 Argo CD](working-with-argocd.md) - 部署您的第一個應用程式
+  [Argo CD 考量事項](argocd-considerations.md) - 設定 AWS Identity Center 整合

# 資源合成與 kro (Kube Resource Orchestrator)
<a name="kro"></a>

 **kro (Kube Resource Orchestrator)** 是一種開放原始碼的 Kubernetes 原生專案，可讓您使用簡單且直接的組態來定義自訂 Kubernetes APIs。使用 kro，您可以輕鬆設定新的自訂 APIs，以建立一組 Kubernetes 物件及其之間的邏輯操作。

透過 EKS 功能，kro 完全由 管理 AWS，無需在叢集上安裝、維護和擴展 kro 控制器。

## kro 的運作方式
<a name="_how_kro_works"></a>

kro 推出稱為 (RGD) 的自訂資源定義 `ResourceGraphDefinition`(CRD)，可簡單且簡化地建立自訂 Kubernetes APIs。當您建立 時`ResourceGraphDefinition`，kro 會使用原生 Kubernetes 延伸模組來建立和管理叢集中的新 APIs。從這個單一資源規格中，kro 會根據您的規格為您建立新的 CRD 並註冊，並調整以管理新定義的自訂資源。

RGDs可以包含多個資源，而 kro 會判斷相互依存性和資源排序，因此您不需要。您可以使用簡單的語法，將組態從一個資源注入到另一個資源，大幅簡化合成並消除叢集中對「黏附」運算子的需求。透過 kro，您的自訂資源可以包含原生 Kubernetes 資源，以及叢集中安裝的任何自訂資源定義 (CRDs)。

kro 支援單一主要資源類型：
+  **ResourceGraphDefinition (RGD)**：定義 Kubernetes 自訂資源，封裝一或多個基礎原生或自訂 Kubernetes 資源

除了此資源之外，kro 還將建立和管理使用它建立的自訂資源的生命週期，以及其所有元件資源。

kro 與 AWS Controllers for Kubernetes (ACK) 無縫整合，可讓您使用 AWS 資源編寫工作負載資源，以建立更高階的抽象概念。這可讓您建立自己的雲端建置區塊，簡化資源管理，並根據組織標準，使用預設和不可變的組態設定啟用可重複使用的模式。

## kro 的優點
<a name="_benefits_of_kro"></a>

kro 可讓平台團隊建立自訂 Kubernetes APIs，將多個資源組成更高階的抽象概念。這可讓開發人員使用簡單、標準化和版本控制的自訂資源來部署複雜的應用程式，進而簡化資源管理。您可以定義常用資源組合的可重複使用模式，讓整個組織建立一致的資源。

kro 在 [Kubernetes 中使用通用表達式語言 (CEL)](https://kubernetes.io/docs/reference/using-api/cel/)，在資源之間傳遞值並整合條件式邏輯，提供資源合成的彈性。您可以將 ACK 管理的 Kubernetes AWS 資源和資源組成為統一APIs，以啟用完整的應用程式和基礎設施定義。

kro 透過 Kubernetes 資訊清單支援宣告式組態，讓 GitOps 工作流程和基礎設施成為與現有開發程序無縫整合的程式碼實務。作為 EKS 受管功能的一部分，kro 由 完全管理 AWS，無需在叢集上安裝、設定和維護 kro 控制器。

 **範例：建立 ResourceGraphDefinition** 

下列範例顯示使用 部署和服務建立 Web 應用程式的簡單 `ResourceGraphDefinition` ：

```
apiVersion: kro.run/v1alpha1
kind: ResourceGraphDefinition
metadata:
  name: web-application
spec:
  schema:
    apiVersion: v1alpha1
    kind: WebApplication
    spec:
      name: string
      replicas: integer | default=3
  resources:
    - id: deployment
      template:
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: ${schema.spec.name}
        spec:
          replicas: ${schema.spec.replicas}
    - id: service
      template:
        apiVersion: v1
        kind: Service
        metadata:
          name: ${schema.spec.name}
```

當使用者建立`WebApplication`自訂資源的執行個體時，kro 會自動建立對應的部署和服務資源，並管理其生命週期與自訂資源。

## 與其他 EKS 受管功能的整合
<a name="_integration_with_other_eks_managed_capabilities"></a>

kro 與其他 EKS 受管功能整合。
+  ** AWS Kubernetes (ACK) 的控制器**：使用 kro 將 ACK 資源編寫為更高層級的抽象，簡化 AWS 資源管理。
+  **Argo CD**：使用 Argo CD 管理跨多個叢集的 kro 自訂資源部署，為您的平台建置區塊和應用程式堆疊啟用 GitOps 工作流程。

## kro 入門
<a name="_getting_started_with_kro"></a>

若要開始使用 kro 的 EKS 功能：

1.  透過 AWS 主控台、 AWS CLI 或您偏好的基礎設施做為程式碼工具，在您的 EKS 叢集上[建立 kro 功能資源](create-kro-capability.md)。

1. 建立 ResourceGraphDefinitions (RGDs)，以定義您的自訂 APIs和資源組成。

1. 套用自訂資源的執行個體，以佈建和管理基礎 Kubernetes AWS 和資源。

# 建立 kro 功能
<a name="create-kro-capability"></a>

本主題說明如何在 Amazon EKS 叢集上建立 kro 功能。

## 先決條件
<a name="_prerequisites"></a>

在建立 kro 功能之前，請確定您有：
+ 執行支援 Kubernetes 版本的現有 Amazon EKS 叢集 （支援標準和延伸支援中的所有版本）
+ 足夠的 IAM 許可，可在 EKS 叢集上建立功能資源
+ （適用於 CLI/eksctl) 安裝和設定適當的 CLI 工具

**注意**  
與 ACK 和 Argo CD 不同， kro 不需要超出信任政策的額外 IAM 許可。 kro 完全在您的叢集內運作，而且不會進行 AWS API 呼叫。不過，您仍然需要為 IAM 功能角色提供適當的信任政策。如需為 kro 設定 Kubernetes RBAC 許可的資訊，請參閱 [設定 kro 許可](kro-permissions.md)。

## 選擇您的工具
<a name="_choose_your_tool"></a>

您可以使用、 AWS 管理主控台 AWS CLI 或 eksctl 建立 kro 功能：
+  [使用主控台建立 kro 功能](kro-create-console.md) - 使用 主控台進行引導式體驗
+  [使用 CLI 建立 kro AWS 功能](kro-create-cli.md) - 使用 AWS CLI 進行指令碼編寫和自動化
+  [使用 eksctl 建立 kro 功能](kro-create-eksctl.md) - 使用 eksctl 獲得 Kubernetes 原生體驗

## 當您建立 kro 功能時會發生什麼情況
<a name="_what_happens_when_you_create_a_kro_capability"></a>

當您建立 kro 功能時：

1. EKS 會建立 kro 功能服務，並將其設定為監控和管理叢集中的資源

1. 您的叢集中已安裝自訂資源定義 (CRDs)

1. 會自動為您的 IAM 功能角色建立存取項目`AmazonEKSKROPolicy`，其中 授予管理 ResourceGraphDefinitions 及其執行個體的許可 （請參閱 [EKS 功能的安全考量](capabilities-security.md))

1. 該功能假設您提供的 IAM 功能角色 （僅用於信任關係）

1. kro 開始觀察`ResourceGraphDefinition`資源及其執行個體

1. 功能狀態從 變更為 `CREATING` `ACTIVE` 

啟用後，您可以建立 ResourceGraphDefinitions 來定義自訂 APIs並建立這些 APIs的執行個體。

**注意**  
自動建立的存取項目包含 `AmazonEKSKROPolicy`，授予 kro 許可來管理 ResourceGraphDefinitions 及其執行個體。若要允許 kro 建立 ResourceGraphDefinitions 中定義的基礎 Kubernetes 資源 （例如部署、服務或 ACK 資源），您必須設定其他存取項目政策。若要進一步了解存取項目以及如何設定其他許可，請參閱 [設定 kro 許可](kro-permissions.md)和 [EKS 功能的安全考量](capabilities-security.md)。

## 後續步驟
<a name="_next_steps"></a>

建立 kro 功能之後：
+  [kro 概念](kro-concepts.md) - 了解 kro 概念和資源合成
+  [kro 概念](kro-concepts.md) - 了解 SimpleSchema、CEL 表達式和資源合成模式

# 使用主控台建立 kro 功能
<a name="kro-create-console"></a>

本主題說明如何使用 建立 kro (Kube Resource Orchestrator) 功能 AWS 管理主控台。

## 建立 kro 功能
<a name="_create_the_kro_capability"></a>

1. 在以下網址開啟 Amazon EKS 主控台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 選取您的叢集名稱以開啟叢集詳細資訊頁面。

1. 選擇**功能**索引標籤。

1. 在左側導覽中，選擇 **kro (Kube Resource Orchestrator)**。

1. 選擇**建立 kro 功能**。

1. 對於 **IAM 功能角色**：
   + 如果您已經有 IAM 功能角色，請從下拉式清單中選取它
   + 如果您需要建立角色，請選擇**建立 kro 角色** 

     這會在預先填入信任政策的新標籤中開啟 IAM 主控台。此角色不需要額外的 IAM 許可，因為 kro 完全在您的叢集中運作。

     建立角色後，返回 EKS 主控台並自動選取角色。
**注意**  
與 ACK 和 Argo CD 不同， kro 不需要信任政策以外的其他 IAM 許可。 kro 完全在您的叢集內運作，而且不會進行 AWS API 呼叫。

1. 選擇**建立**。

功能建立程序開始。

## 確認功能處於作用中狀態
<a name="_verify_the_capability_is_active"></a>

1. 在**功能**索引標籤上，檢視 kro 功能狀態。

1. 等待狀態從 變更為 `CREATING` `ACTIVE`。

1. 啟用後，此功能即可使用。

如需功能狀態和故障診斷的資訊，請參閱 [使用 功能資源](working-with-capabilities.md)。

## 授予管理 Kubernetes 資源的許可
<a name="_grant_permissions_to_manage_kubernetes_resources"></a>

當您建立 kro 功能時，系統會自動使用 建立 EKS 存取項目`AmazonEKSKROPolicy`，允許 kro 管理 ResourceGraphDefinitions 及其執行個體。不過，預設不會授予許可來建立 ResourceGraphDefinitions 中定義的基礎 Kubernetes 資源 ConfigMaps 等）。 ResourceGraphDefinitions

此刻意設計遵循最低權限原則 - 不同的 ResourceGraphDefinitions 需要不同的許可。您必須根據 ResourceGraphDefinitions 將管理的資源，明確設定 kro 所需的許可。

若要快速入門、測試或開發環境，請使用 `AmazonEKSClusterAdminPolicy`：

1. 在 EKS 主控台中，導覽至叢集的**存取**索引標籤。

1. 在**存取項目**下，尋找 kro 功能角色的項目 （它將具有您先前建立的角色 ARN)。

1. 選擇存取項目以開啟其詳細資訊。

1. 在**存取政策**區段中，選擇**關聯存取政策**。

1. `AmazonEKSClusterAdminPolicy` 從政策清單中選取 。

1. 針對**存取範圍**，選取**叢集**。

1. 選擇**關聯**。

**重要**  
`AmazonEKSClusterAdminPolicy` 授予建立和管理所有 Kubernetes 資源的廣泛許可，包括跨所有命名空間建立任何資源類型的能力。這對於開發和 POCs 來說很方便，但不應用於生產環境。對於生產，請建立自訂 RBAC 政策，僅授予 ResourceGraphDefinitions 將管理之特定資源所需的許可。如需設定最低權限許可的指引，請參閱 [設定 kro 許可](kro-permissions.md)和 [EKS 功能的安全考量](capabilities-security.md)。

## 確認可用的自訂資源
<a name="_verify_custom_resources_are_available"></a>

功能處於作用中狀態後，請確認叢集中是否有可用的 kro 自訂資源。

 **使用主控台** 

1. 在 Amazon EKS 主控台中導覽至您的叢集

1. 選擇**資源**索引標籤

1. 選擇**延伸模組** 

1. 選擇 **CustomResourceDefinitions** 

您應該會看到列出的`ResourceGraphDefinition`資源類型。

 **使用 kubectl** 

```
kubectl api-resources | grep kro.run
```

您應該會看到列出的`ResourceGraphDefinition`資源類型。

## 後續步驟
<a name="_next_steps"></a>
+  [kro 概念](kro-concepts.md) - 了解 kro 概念和資源合成
+  [kro 概念](kro-concepts.md) - 了解 SimpleSchema、CEL 表達式和合成模式
+  [使用 功能資源](working-with-capabilities.md) - 管理您的 kro 功能資源

# 使用 CLI 建立 kro AWS 功能
<a name="kro-create-cli"></a>

本主題說明如何使用 CLI 建立 kro (Kube Resource Orchestrator) AWS 功能。

## 先決條件
<a name="_prerequisites"></a>
+  ** AWS CLI** – 版本 `2.12.3` 或更新版本。若要檢查您的版本，請執行 `aws --version`。如需詳細資訊，請參閱《 AWS 命令列界面使用者指南》中的[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。
+  ** `kubectl` **：命令列工具，適用於使用 Kubernetes 叢集。如需詳細資訊，請參閱[設定 `kubectl` 和 `eksctl`](install-kubectl.md)。

## 步驟 1：建立 IAM 功能角色
<a name="_step_1_create_an_iam_capability_role"></a>

建立信任政策檔案：

```
cat > kro-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

建立 IAM 角色：

```
aws iam create-role \
  --role-name KROCapabilityRole \
  --assume-role-policy-document file://kro-trust-policy.json
```

**注意**  
與 ACK 和 Argo CD 不同，kro 不需要額外的 IAM 許可。 kro 完全在您的叢集內運作，而且不會進行 AWS API 呼叫。只有建立與 EKS 功能服務的信任關係時，才需要此角色。

## 步驟 2：建立 kro 功能
<a name="_step_2_create_the_kro_capability"></a>

在叢集上建立 kro 功能資源。將 *region-code* 取代為您的叢集所在的 AWS 區域 （例如 `us-west-2`)，並將 *my-cluster* 取代為您的叢集名稱。

```
aws eks create-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-kro \
  --type KRO \
  --role-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/KROCapabilityRole \
  --delete-propagation-policy RETAIN
```

命令會立即傳回，但當 EKS 建立所需的功能基礎設施和元件時，功能需要一些時間才會變成作用中。EKS 會在建立叢集時，在叢集中安裝與此功能相關的 Kubernetes 自訂資源定義。

**注意**  
如果您收到叢集不存在或您沒有許可的錯誤，請驗證：  
叢集名稱正確
您的 AWS CLI 已設定為正確的區域
您擁有必要的 IAM 許可

## 步驟 3：確認功能處於作用中狀態
<a name="_step_3_verify_the_capability_is_active"></a>

等待功能變成作用中。將 *region-code* 取代為您的叢集所在的 AWS 區域，並將 *my-cluster* 取代為您的叢集名稱。

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-kro \
  --query 'capability.status' \
  --output text
```

當狀態顯示 時，此功能已就緒`ACTIVE`。

您也可以檢視完整的功能詳細資訊：

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-kro
```

## 步驟 4：授予管理 Kubernetes 資源的許可
<a name="_step_4_grant_permissions_to_manage_kubernetes_resources"></a>

當您建立 kro 功能時，系統會自動使用 建立 EKS 存取項目`AmazonEKSKROPolicy`，允許 kro 管理 ResourceGraphDefinitions 及其執行個體。不過，預設不會授予許可來建立 ResourceGraphDefinitions 中定義的基礎 Kubernetes 資源 ConfigMaps 等）。 ResourceGraphDefinitions

此刻意設計遵循最低權限原則：不同的 ResourceGraphDefinitions 需要不同的許可。例如：\$1 僅建立 ConfigMaps 和 Secrets 的 ResourceGraphDefinition 需要與建立部署和服務者不同的許可 \$1 建立 ACK 資源的 ResourceGraphDefinition 需要這些特定自訂資源的許可 \$1 有些 ResourceGraphDefinitions 可能只讀取現有資源，而不建立新的資源

您必須根據 ResourceGraphDefinitions 將管理的資源，明確設定 kro 所需的許可。

### 快速設定
<a name="_quick_setup"></a>

若要快速入門、測試或開發環境，請使用 `AmazonEKSClusterAdminPolicy`：

取得功能角色 ARN：

```
CAPABILITY_ROLE_ARN=$(aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-kro \
  --query 'capability.roleArn' \
  --output text)
```

關聯叢集管理員政策：

```
aws eks associate-access-policy \
  --region region-code \
  --cluster-name my-cluster \
  --principal-arn $CAPABILITY_ROLE_ARN \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \
  --access-scope type=cluster
```

**重要**  
`AmazonEKSClusterAdminPolicy` 授予建立和管理所有 Kubernetes 資源的廣泛許可，包括跨所有命名空間建立任何資源類型的能力。這對於開發和 POCs 來說很方便，但不應用於生產環境。對於生產，請建立自訂 RBAC 政策，僅授予 ResourceGraphDefinitions 將管理之特定資源所需的許可。如需設定最低權限許可的指引，請參閱 [設定 kro 許可](kro-permissions.md)和 [EKS 功能的安全考量](capabilities-security.md)。

## 步驟 5：確認自訂資源可用
<a name="_step_5_verify_custom_resources_are_available"></a>

功能處於作用中狀態後，請確認叢集中是否有可用的 kro 自訂資源：

```
kubectl api-resources | grep kro.run
```

您應該會看到列出的`ResourceGraphDefinition`資源類型。

## 後續步驟
<a name="_next_steps"></a>
+  [kro 概念](kro-concepts.md) - 了解 kro 概念和資源合成
+  [kro 概念](kro-concepts.md) - 了解 SimpleSchema、CEL 表達式和合成模式
+  [使用 功能資源](working-with-capabilities.md) - 管理您的 kro 功能資源

# 使用 eksctl 建立 kro 功能
<a name="kro-create-eksctl"></a>

本主題說明如何使用 eksctl 建立 kro (Kube Resource Orchestrator) 功能。

**注意**  
下列步驟需要 eksctl 版本 `0.220.0` 或更新版本。若要檢查您的版本，請執行 `eksctl version`。

## 步驟 1：建立 IAM 功能角色
<a name="_step_1_create_an_iam_capability_role"></a>

建立信任政策檔案：

```
cat > kro-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

建立 IAM 角色：

```
aws iam create-role \
  --role-name KROCapabilityRole \
  --assume-role-policy-document file://kro-trust-policy.json
```

**注意**  
與 ACK 和 Argo CD 不同， kro 不需要信任政策以外的其他 IAM 許可。 kro 完全在您的叢集內運作，而且不會進行 AWS API 呼叫。

## 步驟 2：建立 kro 功能
<a name="_step_2_create_the_kro_capability"></a>

使用 eksctl 建立 kro 功能。將 *region-code* 取代為您的叢集所在的 AWS 區域，並將 *my-cluster* 取代為您的叢集名稱。

```
eksctl create capability \
  --region region-code \
  --cluster my-cluster \
  --name my-kro \
  --type KRO \
  --role-arn arn:aws:iam::[.replaceable]111122223333:role/KROCapabilityRole
```

命令會立即傳回，但 功能需要一些時間才會變成作用中。

## 步驟 3：確認功能處於作用中狀態
<a name="_step_3_verify_the_capability_is_active"></a>

檢查功能狀態。將 *region-code* 取代為您的叢集所在的 AWS 區域，並將 *my-cluster* 取代為您的叢集名稱。

```
eksctl get capability \
  --region region-code \
  --cluster my-cluster \
  --name my-kro
```

當狀態顯示 時，此功能已就緒`ACTIVE`。

## 步驟 4：授予管理 Kubernetes 資源的許可
<a name="_step_4_grant_permissions_to_manage_kubernetes_resources"></a>

根據預設，kro 只能建立和管理 ResourceGraphDefinitions 及其執行個體。若要允許 kro 建立和管理 ResourceGraphDefinitions 中定義的基礎 Kubernetes 資源，請將`AmazonEKSClusterAdminPolicy`存取政策與功能的存取項目建立關聯。

取得功能角色 ARN：

```
CAPABILITY_ROLE_ARN=$(aws eks describe-capability \
  --region region-code \
  --cluster my-cluster \
  --name my-kro \
  --query 'capability.roleArn' \
  --output text)
```

關聯叢集管理員政策：

```
aws eks associate-access-policy \
  --region region-code \
  --cluster my-cluster \
  --principal-arn $CAPABILITY_ROLE_ARN \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \
  --access-scope type=cluster
```

**重要**  
`AmazonEKSClusterAdminPolicy` 授予建立和管理所有 Kubernetes 資源的廣泛許可，旨在簡化入門。對於生產用途，請建立更嚴格的 RBAC 政策，僅授予 ResourceGraphDefinitions 將管理之特定資源所需的許可。如需設定最低權限許可的指引，請參閱 [設定 kro 許可](kro-permissions.md)和 [EKS 功能的安全考量](capabilities-security.md)。

## 步驟 5：確認可用的自訂資源
<a name="_step_5_verify_custom_resources_are_available"></a>

功能處於作用中狀態後，請確認叢集中是否有可用的 kro 自訂資源：

```
kubectl api-resources | grep kro.run
```

您應該會看到列出的`ResourceGraphDefinition`資源類型。

## 後續步驟
<a name="_next_steps"></a>
+  [kro 概念](kro-concepts.md) - 了解 kro 概念和資源組成
+  [kro 概念](kro-concepts.md) - 了解 SimpleSchema、CEL 表達式和合成模式
+  [使用 功能資源](working-with-capabilities.md) - 管理您的 kro 功能資源

# kro 概念
<a name="kro-concepts"></a>

kro 可讓平台團隊建立自訂 Kubernetes APIs，將多個資源組成更高階的抽象概念。本主題會逐步解說實際範例，然後說明使用 kro 的 EKS 功能時需要了解的核心概念。

## kro 入門
<a name="_getting_started_with_kro"></a>

建立 kro 功能後 （請參閱 [建立 kro 功能](create-kro-capability.md))，您可以在叢集中使用 ResourceGraphDefinitions 開始建立自訂 APIs。

以下是建立簡單 Web 應用程式抽象化的完整範例：

```
apiVersion: kro.run/v1alpha1
kind: ResourceGraphDefinition
metadata:
  name: webapplication
spec:
  schema:
    apiVersion: v1alpha1
    kind: WebApplication
    group: kro.run
    spec:
      name: string | required=true
      image: string | default="nginx:latest"
      replicas: integer | default=3
  resources:
  - id: deployment
    template:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: ${schema.spec.name}
      spec:
        replicas: ${schema.spec.replicas}
        selector:
          matchLabels:
            app: ${schema.spec.name}
        template:
          metadata:
            labels:
              app: ${schema.spec.name}
          spec:
            containers:
            - name: app
              image: ${schema.spec.image}
              ports:
              - containerPort: 80
  - id: service
    template:
      apiVersion: v1
      kind: Service
      metadata:
        name: ${schema.spec.name}
      spec:
        selector:
          app: ${schema.spec.name}
        ports:
        - protocol: TCP
          port: 80
          targetPort: 80
```

套用此 ResourceGraphDefinition 後，應用程式團隊可以使用簡化的 API 建立 Web 應用程式：

```
apiVersion: kro.run/v1alpha1
kind: WebApplication
metadata:
  name: my-app
spec:
  name: my-app
  replicas: 5
```

kro 會自動使用適當的組態建立部署和服務。由於 `image` 未指定，因此會使用結構描述`nginx:latest`中的預設值。

## 核心概念
<a name="_core_concepts"></a>

**重要**  
kro 會在建立時間驗證 ResourceGraphDefinitions，而不是在執行時間。當您建立 RGD 時，kro 會驗證 CEL 語法、根據實際 Kubernetes 結構描述類型檢查表達式、驗證欄位是否存在，以及偵測循環相依性。這表示在部署任何執行個體之前，建立 RGD 時會立即發現錯誤。

### ResourceGraphDefinition
<a name="_resourcegraphdefinition"></a>

ResourceGraphDefinition (RGD) 透過指定下列項目來定義自訂 Kubernetes API：
+  **結構描述** - 使用 SimpleSchema 格式的 API 結構 （欄位名稱、類型、預設值、驗證）
+  **資源** - 要建立的基礎 Kubernetes 或 AWS 資源的範本
+  **相依性** - 資源彼此的關係 （從欄位參考自動偵測）

當您套用 RGD 時，kro 會在叢集中註冊新的自訂資源定義 (CRD)。然後，應用程式團隊可以建立自訂 API 的執行個體，然後 kro 會處理建立和管理所有基礎資源。

如需詳細資訊，請參閱 kro 文件中的 [ResourceGraphDefinition 概觀](https://kro.run/docs/concepts/rgd/overview/)。

### SimpleSchema 格式
<a name="_simpleschema_format"></a>

SimpleSchema 提供簡單的方式來定義 API 結構描述，而不需要 OpenAPI 知識：

```
schema:
  apiVersion: v1alpha1
  kind: Database
  spec:
    name: string | required=true description="Database name"
    size: string | default="small" enum=small,medium,large
    replicas: integer | default=1 minimum=1 maximum=5
```

SimpleSchema `integer`支援 `string`、`boolean`、 和 `number`類型，具有 `required`、、`default``minimum`/`maximum`、 `enum`和 等限制`pattern`條件。

如需詳細資訊，請參閱 kro 文件中的 [SimpleSchema](https://kro.run/docs/concepts/rgd/schema/)。

### CEL 表達式
<a name="_cel_expressions"></a>

kro 使用通用表達式語言 (CEL) 動態參考值，並新增條件式邏輯。CEL 表達式包裝在 `${`和 中，`}`可用兩種方式使用：

 **獨立表達式** - 整個欄位值是單一表達式：

```
spec:
  replicas: ${schema.spec.replicaCount}  # Expression returns integer
  labels: ${schema.spec.labelMap}        # Expression returns object
```

表達式結果會取代整個欄位值，且必須符合欄位的預期類型。

 **字串範本** - 內嵌在字串中的一或多個表達式：

```
metadata:
  name: "${schema.spec.prefix}-${schema.spec.name}"  # Multiple expressions
  annotation: "Created by ${schema.spec.owner}"      # Single expression in string
```

字串範本中的所有表達式都必須傳回字串。使用 `string()`轉換其他類型：`"replicas-${string(schema.spec.count)}"`。

 **欄位參考** - 使用 存取執行個體規格值`schema.spec`：

```
template:
  metadata:
    name: ${schema.spec.name}-deployment
    namespace: ${schema.metadata.namespace}  # Can also reference metadata
  spec:
    replicas: ${schema.spec.replicas}
```

 **選用欄位存取** - `?`用於可能不存在的欄位：

```
# For ConfigMaps or Secrets with unknown structure
value: ${configmap.data.?DATABASE_URL}

# For optional status fields
ready: ${deployment.status.?readyReplicas > 0}
```

如果 欄位不存在，則表達式會傳回 `null`而非失敗。

 **條件式資源** - 只有在符合條件時才包含資源：

```
resources:
- id: ingress
  includeWhen:
    - ${schema.spec.enableIngress == true}
  template:
    # ... ingress configuration
```

`includeWhen` 欄位接受布林表達式的清單。所有條件都必須為 true，才能建立資源。目前， `includeWhen` 只能參考 `schema.spec` 欄位。

 **轉換** - 使用三元運算子和函數轉換值：

```
template:
  spec:
    resources:
      requests:
        memory: ${schema.spec.size == "small" ? "512Mi" : "2Gi"}

    # String concatenation
    image: ${schema.spec.registry + "/" + schema.spec.imageName}

    # Type conversion
    port: ${string(schema.spec.portNumber)}
```

 **跨資源參考** - 來自其他資源的參考值：

```
resources:
- id: bucket
  template:
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    spec:
      name: ${schema.spec.name}-data

- id: configmap
  template:
    apiVersion: v1
    kind: ConfigMap
    data:
      BUCKET_NAME: ${bucket.spec.name}
      BUCKET_ARN: ${bucket.status.ackResourceMetadata.arn}
```

當您在 CEL 表達式中參考另一個資源時，它會自動建立相依性。 kro 會確保先建立參考的資源。

如需詳細資訊，請參閱 kro 文件中的 [CEL 表達式](https://kro.run/docs/concepts/rgd/cel-expressions/)。

### 資源相依性
<a name="_resource_dependencies"></a>

kro 會自動從 CEL 表達式推斷相依性 - 您不會指定順序，而是描述關係。當一個資源使用 CEL 表達式參考另一個資源時，kro 會建立相依性並決定正確的建立順序。

```
resources:
- id: bucket
  template:
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    spec:
      name: ${schema.spec.name}-data

- id: notification
  template:
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: BucketNotification
    spec:
      bucket: ${bucket.spec.name}  # Creates dependency: notification depends on bucket
```

表達式`${bucket.spec.name}`會建立相依性。 kro 會建立所有資源及其相依性的定向無環圖 (DAG)，然後運算拓撲順序以進行建立。

 **建立順序**：依拓撲順序建立資源 （依存性優先）。

 **平行建立**：同時建立沒有相依性的資源。

 **刪除順序**：以反向拓撲順序刪除資源 （先依存）。

 **循環相依性**：不允許 - Kro 在驗證期間拒絕具有循環相依性的 ResourceGraphDefinitions。

您可以檢視計算的建立順序：

```
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.topologicalOrder}'
```

如需詳細資訊，請參閱 kro 文件中的[圖形推論](https://kro.run/docs/concepts/rgd/dependencies-ordering/)。

## 使用 ACK 編寫
<a name="_composing_with_ack"></a>

kro 與 ACK 的 EKS 功能無縫搭配運作，以使用 Kubernetes AWS 資源編寫資源：

```
resources:
# Create {aws} S3 bucket with ACK
- id: bucket
  template:
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    spec:
      name: ${schema.spec.name}-files

# Inject bucket details into Kubernetes ConfigMap
- id: config
  template:
    apiVersion: v1
    kind: ConfigMap
    data:
      BUCKET_NAME: ${bucket.spec.name}
      BUCKET_ARN: ${bucket.status.ackResourceMetadata.arn}

# Use ConfigMap in application deployment
- id: deployment
  template:
    apiVersion: apps/v1
    kind: Deployment
    spec:
      template:
        spec:
          containers:
          - name: app
            envFrom:
            - configMapRef:
                name: ${config.metadata.name}
```

此模式可讓您建立 AWS 資源、擷取其詳細資訊 (ARNs、URLs、端點），並將它們插入您的應用程式組態，全都以單一單位管理。

如需更多合成模式和進階範例，請參閱 [EKS 的 kro 考量](kro-considerations.md)。

## 後續步驟
<a name="_next_steps"></a>
+  [EKS 的 kro 考量](kro-considerations.md) - 了解 EKS 特定的模式、RBAC 以及與 ACK 和 Argo CD 的整合
+  [kro 文件](https://kro.run/docs/overview) - 完整的 kro 文件，包括進階 CEL 表達式、驗證模式和故障診斷

# 設定 kro 許可
<a name="kro-permissions"></a>

與 ACK 和 Argo CD 不同，kro 不需要 IAM 許可。 kro 完全在您的 Kubernetes 叢集內運作，而且不會進行 AWS API 呼叫。使用標準 Kubernetes RBAC 控制對 kro 資源的存取。

## 許可如何使用 kro
<a name="_how_permissions_work_with_kro"></a>

kro 使用兩種具有不同範圍的 Kubernetes 資源類型：

 **ResourceGraphDefinitions**：定義自訂 APIs叢集範圍資源。通常由設計和維護組織標準的平台團隊管理。

 **執行個體**：從 ResourceGraphDefinitions 建立的命名空間範圍自訂資源。可由具有適當 RBAC 許可的應用程式團隊建立。

根據預設，kro 功能具有透過`AmazonEKSKROPolicy`存取項目政策管理 ResourceGraphDefinitions 及其執行個體的許可。不過，kro 需要額外的許可，才能建立和管理 ResourceGraphDefinitions 中定義的基礎 Kubernetes 資源 （例如部署、服務或 ACK 資源）。您必須透過存取項目政策或 Kubernetes RBAC 授予這些許可。如需授予這些許可的詳細資訊，請參閱 [kro 任意資源許可](capabilities-security.md#kro-resource-permissions)。

## 平台團隊許可
<a name="_platform_team_permissions"></a>

平台團隊需要許可才能建立和管理 ResourceGraphDefinitions。

 **平台團隊的範例 ClusterRole**：

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kro-platform-admin
rules:
- apiGroups: ["kro.run"]
  resources: ["resourcegraphdefinitions"]
  verbs: ["*"]
```

 **綁定平台團隊成員**：

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: platform-team-kro-admin
subjects:
- kind: Group
  name: platform-team
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: kro-platform-admin
  apiGroup: rbac.authorization.k8s.io
```

## 應用程式團隊許可
<a name="_application_team_permissions"></a>

應用程式團隊需要許可，才能在其命名空間中建立自訂資源的執行個體。

 **應用程式團隊的角色範例**：

```
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: kro-app-developer
  namespace: my-app
rules:
- apiGroups: ["kro.run"]
  resources: ["webapps", "databases"]
  verbs: ["create", "get", "list", "update", "delete", "patch"]
```

 **繫結至應用程式團隊成員**：

```
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: app-team-kro-developer
  namespace: my-app
subjects:
- kind: Group
  name: app-team
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: kro-app-developer
  apiGroup: rbac.authorization.k8s.io
```

**注意**  
角色中的 API 群組 (`kro.run`在此範例中） 必須符合 ResourceGraphDefinition 結構描述中`apiVersion`定義的 。

## 唯讀存取
<a name="_read_only_access"></a>

授予唯讀存取權以檢視 ResourceGraphDefinitions 和執行個體，無需修改許可。

 **唯讀 ClusterRole**：

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kro-viewer
rules:
- apiGroups: ["kro.run"]
  resources: ["resourcegraphdefinitions"]
  verbs: ["get", "list", "watch"]
```

 **執行個體的唯讀角色**：

```
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: kro-instance-viewer
  namespace: my-app
rules:
- apiGroups: ["kro.run"]
  resources: ["webapps", "databases"]
  verbs: ["get", "list", "watch"]
```

## 多命名空間存取
<a name="_multi_namespace_access"></a>

授予應用程式團隊使用 ClusterRoles 搭配 RoleBindings 存取多個命名空間的權限。

 **用於多命名空間存取的 ClusterRole**：

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kro-multi-namespace-developer
rules:
- apiGroups: ["kro.run"]
  resources: ["webapps"]
  verbs: ["create", "get", "list", "update", "delete"]
```

 **繫結至特定命名空間**：

```
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: app-team-dev-access
  namespace: development
subjects:
- kind: Group
  name: app-team
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: kro-multi-namespace-developer
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: app-team-staging-access
  namespace: staging
subjects:
- kind: Group
  name: app-team
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: kro-multi-namespace-developer
  apiGroup: rbac.authorization.k8s.io
```

## 最佳實務
<a name="_best_practices"></a>

 **最低權限原則**：僅授予每個團隊責任所需的最低許可。

 **使用群組而非個別使用者**：將角色繫結至群組，而非個別使用者，以便於管理。

 **個別的平台和應用程式考量**：平台團隊管理 ResourceGraphDefinitions、應用程式團隊管理執行個體。

 **命名空間隔離**：使用命名空間隔離不同的團隊或環境，讓 RBAC 控制對每個命名空間的存取。

 **稽核的唯讀存取權**：為安全與合規團隊提供稽核目的的唯讀存取權。

## 後續步驟
<a name="_next_steps"></a>
+  [kro 概念](kro-concepts.md) - 了解 kro 概念和資源合成
+  [kro 概念](kro-concepts.md) - 了解 SimpleSchema、CEL 表達式和合成模式
+  [EKS 功能的安全考量](capabilities-security.md) - 檢閱 功能的安全最佳實務

# EKS 的 kro 考量
<a name="kro-considerations"></a>

本主題涵蓋使用 kro 的 EKS 功能的重要考量，包括何時使用資源合成、RBAC 模式，以及與其他 EKS 功能的整合。

## 何時使用 kro
<a name="_when_to_use_kro"></a>

kro 旨在建立可重複使用的基礎設施模式和自訂 APIs，以簡化複雜的資源管理。

 **當您需要下列項目時，請使用 kro**：
+ 使用簡化APIs 為應用程式團隊建立自助式平台
+ 標準化跨團隊的基礎設施模式 （資料庫 \$1 備份 \$1 監控）
+ 管理資源相依性，並在資源之間傳遞值
+ 建置可隱藏實作複雜性的自訂抽象概念
+ 將多個 ACK 資源組成更高階的建置區塊
+ 為複雜的基礎設施堆疊啟用 GitOps 工作流程

 **以下情況請勿使用 kro**：
+ 管理簡單、獨立的資源 （直接使用 ACK 或 Kubernetes 資源）
+ 您需要動態執行時間邏輯 (kro 是宣告式而非必要）
+ 資源沒有相依性或共用組態

kro 擅長建立「鋪設路徑」 - 有意見且可重複使用的模式，可讓團隊輕鬆正確部署複雜的基礎設施。

## RBAC 模式
<a name="_rbac_patterns"></a>

kro 可讓建立 ResourceGraphDefinitions 的平台團隊和建立執行個體的應用程式團隊之間分離疑慮。

### 平台團隊責任
<a name="_platform_team_responsibilities"></a>

平台團隊會建立和維護定義自訂 APIs ResourceGraphDefinitions (RGDs)。

 **所需的許可**：
+ 建立、更新、刪除 ResourceGraphDefinitions
+ 管理基礎資源類型 （部署、服務、ACK 資源）
+ 存取將使用 RGDs的所有命名空間

 **平台團隊的範例 ClusterRole**：

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: platform-kro-admin
rules:
- apiGroups: ["kro.run"]
  resources: ["resourcegraphdefinitions"]
  verbs: ["*"]
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["get", "list", "watch"]
```

如需詳細 RBAC 組態，請參閱 [設定 kro 許可](kro-permissions.md)。

### 應用程式團隊的責任
<a name="_application_team_responsibilities"></a>

應用程式團隊會建立 RGDs定義的自訂資源執行個體，而不需要了解基礎複雜性。

 **所需的許可**：
+ 建立、更新、刪除自訂資源的執行個體
+ 對其命名空間的讀取存取權
+ 無法存取基礎資源或 RGDs

 **優點**：
+ 團隊使用簡單、高階 APIs
+ 平台團隊控制實作詳細資訊
+ 降低組態錯誤的風險
+ 加快新團隊成員的加入速度

## 與其他 EKS 功能整合
<a name="_integration_with_other_eks_capabilities"></a>

### 編寫 ACK 資源
<a name="_composing_ack_resources"></a>

與 ACK 結合以建立基礎設施模式時，kro 特別強大。

 **常見模式**：
+  **具有儲存體的應用程式**：S3 儲存貯體 \$1 SQS 佇列 \$1 通知組態
+  **資料庫堆疊**：RDS 執行個體 \$1 參數群組 \$1 安全群組 \$1 Secrets Manager 秘密
+  **網路**：VPC \$1 子網路 \$1 路由表 \$1 安全群組 \$1 NAT 閘道
+  **使用儲存體運算**：EC2 執行個體 \$1 EBS 磁碟區 \$1 IAM 執行個體描述檔

kro 會處理相依性排序、在資源之間傳遞值 （例如 ARNs 和連線字串），並以單一單位管理完整生命週期。

如需編寫 ACK 資源的範例，請參閱 [ACK 概念](ack-concepts.md)。

### 使用 Argo CD 的 GitOps
<a name="_gitops_with_argo_cd"></a>

使用適用於 Argo CD 的 EKS 功能，從 Git 儲存庫部署 RGDs 和執行個體。

 **儲存庫組織**：
+  **平台儲存庫**：包含由平台團隊管理的 ResourceGraphDefinitions 
+  **應用程式儲存庫**：包含應用程式團隊管理的自訂資源執行個體
+  **共用儲存庫**：包含小型組織的 RGDs 和執行個體

 **考量：**
+ 在執行個體之前部署 RGDs(Argo CD 同步波可協助您）
+ 為平台和應用程式團隊使用單獨的 Argo CD 專案
+ 平台團隊控制 RGD 儲存庫存取
+ 應用程式團隊具有 RGD 定義的唯讀存取權

如需 Argo CD 的詳細資訊，請參閱[使用 Argo CD](working-with-argocd.md)。

## 組織 ResourceGraphDefinitions
<a name="_organizing_resourcegraphdefinitions"></a>

依用途、複雜性和擁有權來組織 RGDs。

 **依用途**：
+  **基礎設施**：資料庫堆疊、聯網、儲存
+  **應用程式**：Web 應用程式、APIs、批次任務
+  **平台**：共用服務、監控、記錄

 **根據複雜性**：
+  **簡單**：2-3 個具有最少相依性的 資源
+  **中等**：具有某些相依性的 5-10 個資源
+  **複雜**：超過 10 個具有複雜相依性的資源

 **命名慣例**：
+ 使用描述性名稱：`webapp-with-database`、 `s3-notification-queue`
+ 在名稱中包含版本以進行重大變更： `webapp-v2`
+ 對相關 RGDs 使用一致的字首：`platform- `、 `app-`

 **命名空間策略**：
+ RGDs是叢集範圍 （非命名空間）
+ 執行個體為命名空間
+ 在 RGDs 中使用命名空間選擇器來控制可以建立執行個體的位置

## 版本控制和更新
<a name="_versioning_and_updates"></a>

規劃 RGD 演變和執行個體遷移。

 **RGD 更新**：
+  **非重大變更**：就地更新 RGD （新增選用欄位、使用 includeWhen 的新資源）
+  **重大變更**：使用不同名稱建立新的 RGD (webapp-v2)
+  **棄用**：使用註釋標記舊 RGDs、傳達遷移時間表

 **執行個體遷移**：
+ 使用更新的 RGD 建立新的執行個體
+ 驗證新執行個體是否正常運作
+ 刪除舊執行個體
+ kro 會自動處理基礎資源更新

 **最佳實務**：
+ 先測試非生產環境中的 RGD 變更
+ 在 RGD 名稱中使用語意版本控制進行主要變更
+ 文件重大變更和遷移路徑
+ 為應用程式團隊提供遷移範例

## 驗證和測試
<a name="_validation_and_testing"></a>

在部署到生產環境之前驗證 RGDs。

 **驗證策略**：
+  **結構描述驗證**：kro 會自動驗證 RGD 結構
+  **乾執行執行個體**：在開發命名空間中建立測試執行個體
+  **整合測試**：確認編寫的資源可一起運作
+  **政策強制執行**：使用許可控制器強制執行組織標準

 **要測試的常見問題**：
+ 資源相依性和排序
+ 在資源之間傳遞的值 (CEL 表達式）
+ 條件式資源包含 (includeWhen)
+ 基礎資源的狀態傳播
+ 執行個體建立的 RBAC 許可

## 上游文件
<a name="_upstream_documentation"></a>

如需使用 kro 的詳細資訊：
+  [kro 入門](https://kro.run/docs/guides/getting-started) - 建立 ResourceGraphDefinitions
+  [CEL 表達式](https://kro.run/docs/concepts/cel) - 撰寫 CEL 表達式
+  [kro Guides](https://kro.run/docs/guides/) - 進階合成模式
+  [故障診斷](https://kro.run/docs/troubleshooting) - 故障診斷和偵錯

## 後續步驟
<a name="_next_steps"></a>
+  [設定 kro 許可](kro-permissions.md) - 為平台和應用程式團隊設定 RBAC
+  [kro 概念](kro-concepts.md) - 了解 kro 概念和資源生命週期
+  [對 kro 功能的問題進行故障診斷](kro-troubleshooting.md) - 對 kro 問題進行故障診斷
+  [ACK 概念](ack-concepts.md) - 了解用於合成的 ACK 資源
+  [使用 Argo CD](working-with-argocd.md) - 使用 GitOps 部署 RGDs 和執行個體

# 對 kro 功能的問題進行故障診斷
<a name="kro-troubleshooting"></a>

本主題提供 kro 的 EKS 功能疑難排解指引，包括功能運作狀態檢查、RBAC 許可、CEL 表達式錯誤和資源合成問題。

**注意**  
EKS 功能是完全受管的，並在叢集外部執行。您無法存取控制器日誌或`kro-system`命名空間。故障診斷著重於功能運作狀態、RBAC 組態和資源狀態。

## 功能為 ACTIVE，但 ResourceGraphDefinitions 無法運作
<a name="_capability_is_active_but_resourcegraphdefinitions_arent_working"></a>

如果您的 kro 功能顯示`ACTIVE`狀態，但 ResourceGraphDefinitions 未建立基礎資源，請檢查功能運作狀態、RBAC 許可和資源狀態。

 **檢查功能運作狀態**：

您可以在 EKS 主控台或使用 AWS CLI 檢視功能運作狀態和狀態問題。

 **主控台**：

1. 在以下網址開啟 Amazon EKS 主控台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 選取您的叢集名稱。

1. 選擇**可觀測性**索引標籤。

1. 選擇**監控叢集**。

1. 選擇**功能**索引標籤以檢視所有功能的運作狀態和狀態。

 ** AWS CLI**：

```
# View capability status and health
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-kro

# Look for issues in the health section
```

 **常見原因**：
+  **缺少 RBAC 許可**：kro 缺少建立基礎 Kubernetes 資源的許可
+  **無效的 CEL 表達式**：ResourceGraphDefinition 中的語法錯誤
+  **資源相依性**：相依資源未就緒
+  **結構描述驗證**：執行個體不符合 RGD 結構描述要求

 **驗證 RBAC 許可**：

```
# Check if capability has cluster admin policy
kubectl get accessentry -A | grep kro
```

如果功能沒有所需的許可，請將 `AmazonEKSClusterAdminPolicy`與 kro 功能的存取項目建立關聯，或建立更嚴格的 RBAC 政策以供生產使用。如需詳細資訊，請參閱 [設定 kro 許可](kro-permissions.md)。

 **檢查 ResourceGraphDefinition 狀態**：

```
# List all RGDs
kubectl get resourcegraphdefinition

# Describe specific RGD
kubectl describe resourcegraphdefinition my-rgd

# Check for validation errors
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.conditions}'
```

ResourceGraphDefinitions 有三個金鑰狀態條件：
+  `ResourceGraphAccepted` - RGD 是否通過驗證 (CEL 語法、類型檢查、欄位存在）
+  `KindReady` - 是否產生並註冊自訂 API 的 CRD
+  `ControllerReady` - kro 是否正在主動監看自訂 API 的執行個體

如果 `ResourceGraphAccepted`是 `False`，請檢查條件訊息是否有驗證錯誤，例如未知欄位、類型不相符或循環相依性。

## 已建立執行個體，但基礎資源未顯示
<a name="_instances_created_but_underlying_resources_not_appearing"></a>

如果自訂資源執行個體存在，但未建立基礎 Kubernetes 資源 （部署、服務、ConfigMaps)，請確認 kro 具有許可並檢查合成錯誤。

 **檢查執行個體狀態**：

```
# Describe the instance (replace with your custom resource kind and name)
kubectl describe custom-kind
         my-instance

# View instance events
kubectl get events --field-selector involvedObject.name=my-instance

# Check instance status conditions
kubectl get custom-kind
         my-instance -o jsonpath='{.status.conditions}'

# Check instance state
kubectl get custom-kind
         my-instance -o jsonpath='{.status.state}'
```

執行個體具有顯示高階狀態`state`的欄位：
+  `ACTIVE` - 執行個體已成功執行
+  `IN_PROGRESS` - 正在處理或調校執行個體
+  `FAILED` - 執行個體無法協調
+  `DELETING` - 正在刪除執行個體
+  `ERROR` - 處理期間發生錯誤

執行個體也有四個狀態條件：
+  `InstanceManaged` - 已正確設定定案者和標籤
+  `GraphResolved` - 建立執行期圖表並解析資源
+  `ResourcesReady` - 所有已建立並就緒的資源
+  `Ready` - 整體執行個體運作狀態 （只有在所有子條件皆為 `True`時才會變成 `True`)

專注於 `Ready`條件，以判斷執行個體的運作狀態。如果 `Ready`是 `False`，請檢查子條件以識別哪個階段失敗。

 **驗證 RBAC 許可**：

kro 功能需要許可才能建立 ResourceGraphDefinitions 中定義的基礎 Kubernetes 資源。

```
# Check if the capability has the AmazonEKSClusterAdminPolicy
kubectl get accessentry -A | grep kro
```

如果缺少許可，請將 `AmazonEKSClusterAdminPolicy`與 kro 功能的存取項目建立關聯，或建立更嚴格的 RBAC 政策以供生產使用。如需詳細資訊，請參閱 [設定 kro 許可](kro-permissions.md)。

## CEL 表達式錯誤
<a name="_cel_expression_errors"></a>

CEL 表達式錯誤會在 ResourceGraphDefinition 建立時間發現，而不是在建立執行個體時。 kro 會驗證所有 CEL 語法、針對 Kubernetes 結構描述類型檢查表達式，並在建立 RGD 時驗證欄位是否存在。

 **常見的 CEL 驗證錯誤**：
+  **未定義的欄位參考**：參考結構描述或資源中不存在的欄位
+  **類型不符**：運算式傳回錯誤類型 （例如，預期整數的字串）
+  **無效的語法**：CEL 表達式中缺少括號、引號或運算子
+  **未知資源類型**：參考叢集中不存在的 CRD

 **檢查 RGD 驗證狀態**：

```
# Check if RGD was accepted
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.conditions[?(@.type=="ResourceGraphAccepted")]}'

# View detailed validation errors
kubectl describe resourcegraphdefinition my-rgd
```

如果 `ResourceGraphAccepted`是 `False`，則條件訊息會包含驗證錯誤。

 **有效的 CEL 表達式範例**：

```
# Reference schema field
${schema.spec.appName}

# Conditional expression
${schema.spec.replicas > 1}

# String template (expressions must return strings)
name: "${schema.spec.appName}-service"

# Standalone expression (can be any type)
replicas: ${schema.spec.replicaCount}

# Resource reference
${deployment.status.availableReplicas}

# Optional field access (returns null if field doesn't exist)
${configmap.data.?DATABASE_URL}
```

## 資源相依性無法解析
<a name="_resource_dependencies_not_resolving"></a>

kro 會自動從 CEL 表達式推斷相依性，並以正確的順序建立資源。如果未如預期般建立資源，請檢查相依性順序和資源整備。

 **檢視計算的建立順序**：

```
# See the order kro will create resources
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.topologicalOrder}'
```

這會顯示資源之間根據 CEL 表達式參考計算的順序。

 **檢查資源準備程度**：

```
# View instance status to see which resources are ready
kubectl get custom-kind
         my-instance -o jsonpath='{.status}'

# Check specific resource status
kubectl get deployment my-deployment -o jsonpath='{.status.conditions}'
```

 **確認readyWhen條件 （如果使用）**：

此 `readyWhen` 欄位為選用。如果未指定，資源會在建立後立即視為就緒。如果您已定義`readyWhen`條件，請確認它們是否正確檢查資源準備程度：

```
resources:
  - id: deployment
    readyWhen:
      - ${deployment.status.availableReplicas == deployment.spec.replicas}
```

 **檢查資源事件**：

```
# View events for the underlying resources
kubectl get events -n namespace --sort-by='.lastTimestamp'
```

## 結構描述驗證失敗
<a name="_schema_validation_failures"></a>

如果執行個體因為結構描述驗證錯誤而無法建立，請確認執行個體符合 RGD 結構描述要求。

 **檢查驗證錯誤**：

```
# Attempt to create instance and view error
kubectl apply -f instance.yaml

# View existing instance validation status
kubectl describe custom-kind
         my-instance | grep -A 5 "Validation"
```

 **常見的驗證問題**：
+  **缺少必要欄位**：執行個體不提供所有必要的結構描述欄位
+  **類型不符**：提供預期整數的字串
+  **列舉值無效**：使用不在允許清單中的值
+  **模式不相符**：字串不符合 regex 模式

 **檢閱 RGD 結構描述**：

```
# View the schema definition
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.spec.schema}'
```

確保您的執行個體為所有必要欄位提供正確的類型。

## 後續步驟
<a name="_next_steps"></a>
+  [EKS 的 kro 考量](kro-considerations.md) - kro 考量事項和最佳實務
+  [設定 kro 許可](kro-permissions.md) - 為平台和應用程式團隊設定 RBAC
+  [kro 概念](kro-concepts.md) - 了解 kro 概念和資源生命週期
+  [對 EKS 功能進行故障診斷](capabilities-troubleshooting.md) - 一般功能故障診斷指引

# 比較 kro 與自我管理 kro 的 EKS 功能
<a name="kro-comparison"></a>

適用於 kro 的 EKS 功能提供與自我管理 kro 相同的功能，但具有顯著的操作優勢。如需 EKS 功能與自我管理解決方案的一般比較，請參閱 [EKS 功能考量事項](capabilities-considerations.md)。

kro 的 EKS 功能使用相同的上游 kro 控制器，並與上游 kro 完全相容。ResourceGraphDefinitions、CEL 表達式和資源合成的運作方式相同。如需完整的 kro 文件和範例，請參閱 [kro 文件](https://kro.run/docs/overview)。

## 遷移路徑
<a name="_migration_path"></a>

您可以從自我管理的 kro 遷移到受管功能，無需停機。

**重要**  
在遷移之前，請確保您的自我管理 kro 控制器執行的版本與 kro 的 EKS 功能相同。在 EKS 主控台或使用 檢查功能版本`aws eks describe-capability`，然後升級自我管理的安裝以符合。這可防止遷移期間的相容性問題。

1. 更新您的自我管理 kro 控制器以`kube-system`用於領導者選擇租用：

   ```
   helm upgrade --install kro \
     oci://ghcr.io/awslabs/kro/kro-chart \
     --namespace kro \
     --set leaderElection.namespace=kube-system
   ```

   這會將控制器的租用移至 `kube-system`，允許受管功能與其協調。

1. 在叢集上建立 kro 功能 （請參閱 [建立 kro 功能](create-kro-capability.md))

1. 受管功能可識別現有的 ResourceGraphDefinitions 和執行個體，接管對帳

1. 逐漸縮減或移除自我管理的 kro 部署：

   ```
   helm uninstall kro --namespace kro
   ```

此方法可讓兩個控制器在遷移期間安全地共存。受管功能會自動採用 ResourceGraphDefinitions 和先前由自我管理的 kro 管理的執行個體，以確保持續對帳而不會發生衝突。

## 後續步驟
<a name="_next_steps"></a>
+  [建立 kro 功能](create-kro-capability.md) - 建立 kro 功能資源
+  [kro 概念](kro-concepts.md) - 了解 kro 概念和資源合成

# 對 EKS 功能進行故障診斷
<a name="capabilities-troubleshooting"></a>

本主題提供 EKS 功能的一般故障診斷指引，包括功能運作狀態檢查、常見問題，以及功能特定故障診斷的連結。

**注意**  
EKS 功能是完全受管的，並在叢集外部執行。您無法存取控制器日誌或控制器命名空間。故障診斷著重於功能運作狀態、資源狀態和組態。

## 一般疑難排解方法
<a name="_general_troubleshooting_approach"></a>

疑難排解 EKS 功能時，請遵循下列一般方法：

1.  **檢查功能運作**狀態：使用 `aws eks describe-capability` 來檢視功能狀態和運作狀態問題

1.  **驗證資源狀態**：檢查您建立的狀態條件和事件的 Kubernetes 資源 (CRDs)

1.  **檢閱 IAM 許可**：確保功能角色具有必要的許可

1.  **檢查組態**：驗證功能特定的組態是否正確

## 檢查功能運作狀態
<a name="_check_capability_health"></a>

所有 EKS 功能都透過 EKS 主控台和 `describe-capability` API 提供運作狀態資訊。

 **主控台**：

1. 在以下網址開啟 Amazon EKS 主控台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 選取您的叢集名稱。

1. 選擇**可觀測性**索引標籤。

1. 選擇**監控叢集**。

1. 選擇**功能**索引標籤以檢視所有功能的運作狀態和狀態。

功能索引標籤會顯示：
+ 功能名稱和類型
+ 目前狀態
+ 運作狀態問題，含描述

 ** AWS CLI**：

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-capability-name
```

回應包括：
+  **狀態**：目前功能狀態 (`CREATING`、`ACTIVE`、`UPDATING`、`DELETING`、`CREATE_FAILED`) `UPDATE_FAILED`
+  **運作**狀態：運作狀態資訊，包括 功能偵測到的任何問題

## 常見功能狀態
<a name="_common_capability_statuses"></a>

 **CREATING**：正在設定功能。

 **ACTIVE**：功能正在執行並準備好使用。如果資源未如預期般運作，請檢查資源狀態和 IAM 許可。

 **正在更新**：正在套用組態變更。等待狀態傳回 `ACTIVE`。

 **CREATE\$1FAILED** 或 **UPDATE\$1FAILED**：設定或更新發生錯誤。如需詳細資訊，請參閱運作狀態區段。常見原因：
+ IAM 角色信任政策不正確或遺失
+ IAM 角色不存在或無法存取
+ 叢集存取問題
+ 無效的組態參數

## 驗證 Kubernetes 資源狀態
<a name="_verify_kubernetes_resource_status"></a>

EKS 功能會在叢集中建立和管理 Kubernetes 自訂資源定義 (CRDs)。疑難排解時，請檢查您建立的資源狀態：

```
# List resources of a specific type
kubectl get resource-kind -A

# Describe a specific resource to see conditions and events
kubectl describe resource-kind
         resource-name -n namespace

# View resource status conditions
kubectl get resource-kind
         resource-name -n namespace -o jsonpath='{.status.conditions}'

# View events related to the resource
kubectl get events --field-selector involvedObject.name=resource-name -n namespace
```

資源狀態條件提供下列相關資訊：
+ 資源是否已就緒
+ 遇到的任何錯誤
+ 目前對帳狀態

## 檢閱 IAM 許可和叢集存取
<a name="_review_iam_permissions_and_cluster_access"></a>

許多功能問題來自 IAM 許可問題或缺少叢集存取組態。驗證功能角色許可和叢集存取項目。

### 檢查 IAM 角色許可
<a name="_check_iam_role_permissions"></a>

驗證能力角色具有必要的許可：

```
# List attached managed policies
aws iam list-attached-role-policies --role-name my-capability-role

# List inline policies
aws iam list-role-policies --role-name my-capability-role

# Get specific policy details
aws iam get-role-policy --role-name my-capability-role --policy-name policy-name

# View the role's trust policy
aws iam get-role --role-name my-capability-role --query 'Role.AssumeRolePolicyDocument'
```

信任政策必須允許`capabilities.eks.amazonaws.com`服務主體：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

### 檢查 EKS 存取項目和存取政策
<a name="_check_eks_access_entries_and_access_policies"></a>

所有功能都需要其操作所在叢集上適當的 EKS 存取項目和存取政策。

 **驗證存取項目是否存在**：

```
aws eks list-access-entries \
  --cluster-name my-cluster \
  --region region-code
```

在清單中尋找功能角色 ARN。如果遺失，則 功能無法存取叢集。

 **檢查連接到項目的存取政策**：

```
aws eks list-associated-access-policies \
  --cluster-name my-cluster \
  --principal-arn arn:aws:iam::111122223333:role/my-capability-role \
  --region region-code
```

所有功能都需要適當的存取政策：
+  **ACK**：需要許可才能建立和管理 Kubernetes 資源
+  **kro**：需要許可才能建立和管理 Kubernetes 資源
+  **Argo CD**：需要建立和管理應用程式的許可，並且需要遠端目標叢集上的存取項目以進行多叢集部署

 **針對 Argo CD 多叢集部署**：

如果部署到遠端叢集，請確認功能角色在每個目標叢集上有存取項目：

```
# Check Access Entry on target cluster
aws eks describe-access-entry \
  --cluster-name target-cluster \
  --principal-arn arn:aws:iam::111122223333:role/argocd-capability-role \
  --region region-code
```

如果目標叢集上缺少存取項目，Argo CD 就無法將應用程式部署到其中。如需組態詳細資訊[註冊目標叢集](argocd-register-clusters.md)，請參閱 。

## 功能特定的疑難排解
<a name="_capability_specific_troubleshooting"></a>

如需每個功能類型特有的詳細故障診斷指引：
+  [對 ACK 功能的問題進行故障診斷](ack-troubleshooting.md) - 疑難排解 ACK 資源建立、IAM 許可和跨帳戶存取
+  [對 Argo CD 功能的問題進行故障診斷](argocd-troubleshooting.md) - 疑難排解應用程式同步、儲存庫身分驗證和多叢集部署
+  [對 kro 功能的問題進行故障診斷](kro-troubleshooting.md) - 疑難排解 ResourceGraphDefinitions、CEL 表達式和 RBAC 許可

## 所有功能的常見問題
<a name="_common_issues_across_all_capabilities"></a>

### 功能卡在 CREATING 狀態
<a name="_capability_stuck_in_creating_state"></a>

如果功能保持 `CREATING` 狀態的時間超過預期：

1. 在主控台 (**可觀測性 > ****監控叢集** > **功能**索引標籤） 或使用 CLI AWS 檢查功能運作狀態是否有特定問題：

   ```
   aws eks describe-capability \
     --region region-code \
     --cluster-name my-cluster \
     --capability-name my-capability-name \
     --query 'capability.health'
   ```

1. 驗證 IAM 角色是否存在，並具有正確的信任政策

1. 確保您的叢集可存取且運作狀態良好

1. 檢查是否有任何叢集層級的問題可能阻礙功能設定

### 未建立或更新的資源
<a name="_resources_not_being_created_or_updated"></a>

如果功能是 ，`ACTIVE`但資源未建立或更新：

1. 檢查資源狀態是否有錯誤情況

1. 驗證特定 AWS 服務 (ACK) 或儲存庫 (Argo CD) 的 IAM 許可

1. 檢查建立基礎資源的 RBAC 許可 (kro)

1. 檢閱驗證錯誤的資源規格

### 功能運作狀態顯示問題
<a name="_capability_health_shows_issues"></a>

如果 `describe-capability` 顯示運作狀態問題：

1. 仔細閱讀問題描述 - 它們通常指出特定問題

1. 解決根本原因 (IAM 許可、組態錯誤等）

1. 問題解決後，此功能會自動復原

## 後續步驟
<a name="_next_steps"></a>
+  [使用 功能資源](working-with-capabilities.md) - 管理功能資源
+  [對 ACK 功能的問題進行故障診斷](ack-troubleshooting.md) - ACK 特定的疑難排解
+  [對 Argo CD 功能的問題進行故障診斷](argocd-troubleshooting.md) - Argo CD 特定疑難排解
+  [對 kro 功能的問題進行故障診斷](kro-troubleshooting.md) - kro 特定疑難排解
+  [EKS 功能的安全考量](capabilities-security.md) - 功能的安全最佳實務