

 **協助改進此頁面** 

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

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

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

# 使用 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 整合