

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 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 中运行，而不是在您的集群中运行，因此无需在 Worker 节点上安装、维护和扩展关键平台组件。

首先，您可以在新的或现有的 EKS 集群上创建一个或多个 EKS 功能。为此，您可以使用 AWS CLI、AWS 管理控制台、EKS API、eksctl 或您偏好的基础设施即代码工具。虽然 EKS 功能旨在协同工作，但它们是独立的云资源，您可以根据自己的使用案例和要求进行选择。

EKS 支持的所有 Kubernetes 版本都支持 EKS 功能。

**注意**  
所有提供 Amazon EKS 的 AWS 商业区域均提供 EKS 功能。有关支持的区域列表，请参阅《AWS 一般参考》中的 [Amazon EKS 端点和配额](https://docs.aws.amazon.com/general/latest/gr/eks.html)。

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

### AWS Controllers for Kubernetes（ACK）
<a name="shared_aws_controllers_for_kubernetes_ack"></a>

ACK 支持使用 Kubernetes API 管理 AWS 资源，允许您使用 Kubernetes 自定义资源创建和管理 S3 存储桶、RDS 数据库、IAM 角色和其他 AWS 资源。ACK 会持续调整您的所需状态与 AWS 中的实际状态，纠正随时间推移而出现的任何漂移，以保持系统运行状况良好并按照指定配置资源。您能够使用统一的工具与工作流程，将 AWS 资源和 Kubernetes 工作负载纳入同一管理体系，该工具支持包括 S3、RDS、DynamoDB 及 Lambda 在内的 50 余项 AWS 服务。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 用户界面，用于可视化应用程序运行状况和部署状态。

 [了解有关 Argo CD 的更多信息 →](argocd.md) 

### kro（Kube Resource Orchestrator）
<a name="_kro_kube_resource_orchestrator"></a>

kro 支持您创建自定义 Kubernetes API，可将多种资源组合为更上层的抽象资源，方便平台团队针对常见的资源组合云基础设施组件，定义可复用的模式。使用 kro，您可以将 Kubernetes 和 AWS 资源组合成统一的抽象资源，使用简单的语法实现动态配置和条件逻辑。kro 使平台团队能够提供带有适当护栏的自助服务功能，允许开发人员在维护组织标准和最佳实践的同时，使用简单、专门构建的 API 预置复杂的基础设施。kro 资源只是 Kubernetes 资源，在可以存储在 Git 中的 Kubernetes 清单中指定，或者推送到 Amazon ECR 等兼容 OCI 的注册表，用于在组织范围广泛分布。

 [了解有关 kro 的更多信息 →](kro.md) 

## EKS 功能的优势
<a name="_benefits_of_eks_capabilities"></a>

EKS 功能完全由 AWS 管理，无需安装、维护和扩展基础集群服务。AWS 可处理安全修补、更新和运营管理，让您的团队腾出时间专注于使用 AWS 进行构建，而无需顾虑集群操作。与消耗集群资源的传统 Kubernetes 附加组件不同，这些功能在 EKS 中运行，而不是在 Worker 节点上运行。这可以为工作负载释放集群容量和资源，同时最大限度地减少管理集群内控制器和其他平台组件的运营负担。

借助 EKS 功能，您可以使用原生 Kubernetes API 和诸如 `kubectl` 等工具管理部署、AWS 资源、自定义 Kubernetes 资源和组合。所有功能都在集群环境中运行，可自动检测和纠正应用程序和云基础设施资源中的配置漂移。您可以从一个控制点跨多个集群、AWS 账户和区域部署和管理资源，从而简化复杂的分布式环境中的操作。

EKS 功能专为 GitOps 工作流程而设计，提供声明式、版本控制的基础设施和应用程序管理。这些变更通过 Git 在系统中传递，从而提供审计跟踪记录、回滚功能以及与您现有开发流程相整合的协作工作流程。这种 Kubernetes 原生方法意味着您无需使用多种工具或管理集群外部的基础设施即代码系统，并且只有一个事实来源供参考。在版本控制的 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 API 和工具与集群中的功能进行交互：
+ 使用 `kubectl` 应用 Kubernetes 自定义资源
+ 使用 Git 存储库作为 GitOps 工作流程的事实来源

某些功能还支持其他工具。例如：
+ 使用 Argo CD CLI 在 Argo CD 功能中配置和管理存储库和集群
+ 使用 Argo CD 用户界面，对由 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 部署应用程序和操作组件，使用 ACK 管理集群配置和预置基础设施，两者均从 Git 存储库中获得。整个堆栈（应用程序、数据库、存储和网络）都会被定义为代码并自动部署。

示例：开发团队将更改推送到 Git。Argo CD 会部署更新的应用程序，ACK 会使用正确的配置预置新的 RDS 数据库。所有更改均可审计、可逆且可在不同环境中保持一致。

 **具有自助服务能力的平台工程** 

使用 kro 创建用于构建 ACK 和 Kubernetes 资源的自定义 API。平台团队使用护栏定义经批准的模式。应用程序团队使用简单的高级别 API 预置完整的堆栈。

示例：平台团队创建了“WebApplication”API，用于配置部署、服务、入口和 S3 存储桶。开发人员无需了解底层复杂性或 AWS 权限即可使用此 API。

 **多集群应用程序管理** 

使用 Argo CD，在不同地区或账户的多个 EKS 集群中部署应用程序。使用一致的策略和工作流程，使用单个 Argo CD 实例管理所有部署。

示例：将同一个应用程序部署到多个区域中的开发、暂存和生产集群。Argo CD 可确保每个环境与其相应的 Git 分支保持同步。

 **多集群管理** 

使用 ACK 定义和预置 EKS 集群，使用 kro 根据组织标准自定义集群配置，使用 Argo CD 管理集群生命周期和配置。这能实现从创建到持续运营的端到端集群管理。

示例：使用 ACK 和 kro 定义 EKS 集群，以预置和管理集群基础设施，同时定义网络、安全策略、附加组件和其他配置的组织标准。使用 Argo CD，利用一致标准和自动化生命周期管理，跨实例集创建并持续管理集群、配置和 Kubernetes 版本更新。

 **迁移与现代化** 

借助原生云资源预置和 GitOps 工作流程，简化向 EKS 的迁移。在不重新创建现有 AWS 资源的情况下通过 ACK 采用这些资源，并使用 Argo CD 从 Git 实施工作负载部署。

示例：从 EC2 迁移到 EKS 的团队使用 ACK 采用其现有的 RDS 数据库和 S3 存储桶，然后使用 Argo CD 从 Git 部署容器化应用程序。迁移路径很明确，操作从第一天起就实现标准化。

 **账户和区域引导** 

同时使用 Argo CD 和 ACK，实现跨账户和地区自动化基础设施部署。在 Git 中将基础设施定义为代码，让各类功能处理部署和管理事务。

示例：平台团队维护负责定义标准账户配置（VPC、IAM 角色、RDS 实例和监控堆栈）的 Git 存储库。Argo CD 会自动将这些配置部署到新账户和区域，从而确保一致性，并将手动设置时间从几天缩短到几分钟。

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

本主题介绍管理所有功能类型的功能资源的常见操作。

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

EKS 功能是在 Amazon EKS 集群上启用托管功能的 AWS 资源。各项功能在 EKS 中运行，无需在 Worker 节点上安装和维护控制器和其他操作组件。这些功能是为特定的 EKS 集群创建，并且在整个生命周期内都与该集群保持关联。

每种能力资源都有：
+ 集群中的唯一名称
+ 功能类型（ACK、ARGOCD 或 KRO）
+ Amazon 资源名称（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. 有关详细的运行状况信息，请选择**可观测性**选项卡，然后依次选择**监控集群**、**功能**选项卡。

 ** AWSCLI**：

```
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) 查看相关指南。

 **UPDATING**：正在应用配置更改。等待状态恢复为 `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 API 管理 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 自定义资源定义（CRD）仍安装在您的集群中。
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 自定义资源来与该功能进行交互。每种功能都提供自己的一组自定义资源定义（CRD），这些定义通过功能特定的功能扩展 Kubernetes API。

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

启用 Argo CD 功能后，您可以创建和管理以下 Kubernetes 资源：

 **应用程序**   
定义从 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）**   
定义一个自定义 API，该 API 将多个 Kubernetes 和 AWS 资源组合成更高级别的抽象。平台团队可创建 `ResourceGraphDefinition` 资源，以提供带有护栏的可重用模式。

 **自定义资源实例**   
创建 `ResourceGraphDefinition` 资源后，您可以创建由 `ResourceGraphDefinition` 定义的自定义 API 的实例。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 会自动创建 `ResourceGraphDefinition` 中定义的 `Deployment` 和 `Service` 资源。

有关 kro 资源和概念的更多信息，请参阅 [kro 概念](kro-concepts.md)。

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

启用 ACK 功能后，您可以使用 Kubernetes 自定义资源创建和管理 AWS 资源。ACK 为 50 多项 AWS 服务提供超过 200 个 CRD，允许您在使用 Kubernetes 工作负载的同时定义 AWS 资源，并使用 Kubernetes 管理专用的 AWS 基础设施资源。

ACK 资源示例：

 **S3Bucket**   
 `Bucket` 资源使用版本控制、加密和生命周期策略创建和管理 Amazon S3 存储桶。

 **RDS DBInstance**   
 `DBInstance` 资源通过自动备份和维护时段预置和管理 Amazon RDS 数据库实例。

 **DynamoDB 表**   
 `Table` 资源使用已预置或按需容量创建和管理 DynamoDB 表。

 **IAM 角色**   
 `Role` 资源通过信任策略和权限策略来定义 IAM 角色，以实现 AWS 服务访问。

 **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 中每个 `Application` 资源最多 150 个 Kubernetes 资源
+ 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 角色。功能角色用于授予 EKS 功能代表您执行操作的 AWS 服务权限。例如，要使用适用于 ACK 的 EKS 功能来管理 Amazon S3 存储桶，您需要向该功能授予 S3 存储桶管理权限，使其能够创建和管理存储桶。

配置该功能后，即可使用集群中的 Kubernetes 自定义资源创建和管理 AWS 中的 S3 资源。Kubernetes RBAC 是一种集群内访问控制机制，用于确定哪些用户和组可以创建和管理这些自定义资源。例如，向特定的 Kubernetes RBAC 用户和组授予在您选择的命名空间中创建和管理 `Bucket` 资源的权限。

因此，IAM 和 Kubernetes RBAC 共同构成了管理与 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 部署的中心和分支** 

将集中式和分散式模型与基于范围和所有权的集中式应用程序部署和资源管理相结合。
+ 中心集群：
  + Argo CD 管理本地集群和所有远程工作负载集群的 GitOps 部署
  + ACK 在管理集群上用于管理员范围资源（生产数据库、IAM 角色、VPC）
  + 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 自定义资源定义（CRD）。

使用自主管理型解决方案，您可以使用 Helm 图表、kubectl 或其他运算符来安装和配置集群软件。您可以完全控制自主管理型解决方案的软件生命周期和运行时配置，并在解决方案的任何层面提供自定义设置。

 **操作与维护** 

 AWS 通过自动更新和安全补丁管理 EKS 功能的补丁和其他软件生命周期操作。EKS 功能与 AWS 功能集成，实现配置简化，提供内置的高可用性和容错能力，并且无需对控制器工作负载进行集群内问题排查。

自主管理型的解决方案要求您监控组件运行状况和日志，应用安全补丁和版本更新，配置包含多个副本和容器组（pod）中断预算的高可用性，对控制器工作负载问题进行问题排查和修复，以及管理发行版和版本。您可以完全控制自己的部署，但这通常需要为私有集群访问权限和其他集成提供定制解决方案，这些解决方案必须符合组织标准和安全合规性要求。

 **资源消耗** 

EKS 功能在 EKS 和集群之外运行，从而释放节点资源和集群资源。EKS 功能不使用集群工作负载资源，不消耗 Worker 节点上的 CPU 或内存，可自动扩展，也可尽量减少对集群容量规划的影响。

自主管理型的解决方案在您的 Worker 节点上运行控制器和其他组件，直接消耗 Worker 节点资源、集群 IP 和其他集群资源。管理集群服务需要对其工作负载进行容量规划，并且需要规划和配置资源请求和限制，以管理扩展和高可用性需求。

 **功能支持** 

作为完全托管的服务功能，与自主管理型的解决方案相比，EKS 功能本质上是较为固定的。虽然 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 的 EKS 功能与自主管理型 ACK 功能的比较](ack-comparison.md) 
+  [适用于 Argo CD 的 EKS 功能与自主管理型 Argo CD 的比较](argocd-comparison.md) 
+  [EKS 托管型 kro 与自主管理型 kro 的对比](kro-comparison.md) 

# 通过 AWS Controllers for Kubernetes（ACK）部署来自 Kubernetes 的 AWS 资源
<a name="ack"></a>

 借助 AWS Controllers for Kubernetes（ACK），您可以直接在 Kubernetes 定义和管理 AWS 服务资源。借助 AWS Controllers for Kubernetes（ACK），您还可以利用熟悉的 Kubernetes API 和工具，将 Kubernetes 自定义资源与应用程序工作负载配合使用，来管理工作负载资源和云基础设施。

得益于 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 提供 CRD，包括存储桶、存储桶策略及其他 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
```

将此自定义资源应用于集群时，如果 Amazon S3 存储桶尚不存在，ACK 会在账户中创建一个存储桶。对该资源的后续更改（例如指定非默认存储层或添加策略）将应用于 AWS 中的 S3 资源。从集群中删除此资源时，默认情况下也将删除 AWS 中的 S3 存储桶。

## ACK 的优势
<a name="_benefits_of_ack"></a>

ACK 有助于您在 Kubernetes 本地管理 AWS 资源，从而让您更方便地使用与管理应用程序相同的 Kubernetes API 和工具来管理 AWS 资源。这种统一的方法简化了基础设施管理工作流程，无需在不同工具之间切换或学习单独的基础设施即代码系统。您可以在 Kubernetes 清单中以声明方式定义 AWS 资源，从而实现 GitOps 工作流程和基础设施即代码实践，并与现有的开发流程无缝集成。

ACK 会根据 AWS 资源的预期状态来持续协调实际状态，从而纠正偏差并确保整个基础设施的一致性。这种持续协调意味着，对 AWS 资源进行的命令式带外更改都将自动恢复，以匹配所声明的配置，从而维护基础设施即代码的完整性。您可以配置 ACK 以管理跨多个 AWS 账户和区域的资源，无需其他工具即可部署复杂的多账户架构。

对于从其他基础设施管理工具迁移的组织，ACK 支持资源接管，从而允许您将现有的 AWS 资源纳入 ACK 管理，无需重新创建资源。此外，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 工作流。
  + 当与 ArgoCD 配对时，ACK 能扩大 GitOps 的优势，但 ACK 本身不要求与 git 集成。
+  **kro（Kube Resource Orchestrator）**：使用 kro 从 ACK 资源组合复杂的资源，创建更高级别的抽象以简化资源管理。
  + 您可以使用 kro 创建复合自定义资源，这些资源同时定义了 Kubernetes 资源和 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 集群
+ 具有允许 ACK 管理 AWS 资源的权限的 IAM 功能角色
+ 可在 EKS 集群上创建功能资源的充足 IAM 权限
+ 已安装和配置相应的 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)：使用控制台获得引导式体验
+  [使用 AWS CLI 创建 ACK 功能](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. 自定义资源定义（CRD）将被安装到集群中

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>

本主题将介绍如何使用 AWS 管理控制台创建 AWS Controllers for Kubernetes（ACK）功能。

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

1. 从以下位置打开 Amazon EKS 控制台：https://console.aws.amazon.com/eks/home\$1/clusters。

1. 选择集群名称，打开集群详细信息页面。

1. 选择**功能**选项卡。

1. 在左侧导航栏中，选择 **AWS Controllers for Kubernetes（ACK）**。

1. 选择**创建 AWS Controllers for Kubernetes 功能**。

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 资源的 CRD。

 **使用 kubectl** 

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

您应该会看到列出的多个用于 AWS 资源的 API。

**注意**  
AWS Controllers for Kubernetes 功能将为各种 AWS 资源安装大量 CRD。

## 后续步骤
<a name="_next_steps"></a>
+  [ACK 概念](ack-concepts.md)：了解 ACK 概念并开始使用
+  [配置 ACK 权限](ack-permissions.md)：为其他 AWS 服务配置 IAM 权限
+  [使用功能资源](working-with-capabilities.md)：管理 ACK 功能资源

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

本主题将介绍如何使用 AWS CLI 创建 AWS Controllers for Kubernetes（ACK）功能。

## 先决条件
<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 资源的 API。

**注意**  
AWS Controllers for Kubernetes 功能将为各种 AWS 资源安装大量 CRD。

## 后续步骤
<a name="_next_steps"></a>
+  [ACK 概念](ack-concepts.md)：了解 ACK 概念并开始使用
+  [配置 ACK 权限](ack-permissions.md)：为其他 AWS 服务配置 IAM 权限
+  [使用功能资源](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)。

**重要**  
此策略通过 `"Resource": "*"` 授予 S3 存储桶管理权限，允许对所有 S3 存储桶进行操作。  
用于生产用途：\$1 将 `Resource` 字段限制为特定的存储桶 ARN 或名称模式 \$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 资源的 API。

**注意**  
AWS Controllers for Kubernetes 功能将为各种 AWS 资源安装大量 CRD。

## 后续步骤
<a name="_next_steps"></a>
+  [ACK 概念](ack-concepts.md)：了解 ACK 概念并开始使用
+  [配置 ACK 权限](ack-permissions.md)：为其他 AWS 服务配置 IAM 权限
+  [使用功能资源](working-with-capabilities.md)：管理 ACK 功能资源

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

ACK 通过 Kubernetes API 管理 AWS 资源，方法是根据清单中定义的预期状态，持续协调 AWS 中的实际状态。创建或更新 Kubernetes 自定义资源时，ACK 会进行必要的 AWS API 调用来创建或修改相应的 AWS 资源，随后持续监控其状态是否存在偏差，并更新 Kubernetes 中的资源状态以反映当前实际状态。借助此方法，您可以使用熟悉的 Kubernetes 工具和工作流程来管理基础设施，同时保持集群与 AWS 之间的一致性。

本主题将阐释有关 ACK 如何通过 Kubernetes API 管理 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 资源、更新现有资源的 `spec`，或 ACK 检测到在 ACK 外部进行的手动更改导致 AWS 中的状态存在偏差。此外，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 资源使用状态条件来传达其状态。理解这些条件有助于您排查问题并了解资源运行状况。
+  **Ready**：表示资源已准备就绪，可供使用（标准化的 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
```

删除此资源将同时删除 AWS 中的 S3 存储桶。

 **Retain**：

删除 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 中移除，但会保留 AWS 中的 S3 存储桶。

`retain` 策略适用于以下场景：生产数据库的生命周期超过 Kubernetes 资源，多个应用程序使用共享资源，资源包含不应意外删除的重要数据，或者临时管理 ACK（即先接管一个资源，对其进行配置，然后将其释放回手动管理）。

要了解有关 ACK 删除策略的更多信息，请参阅 [ACK 删除策略](https://aws-controllers-k8s.github.io/community/docs/user-docs/deletion-policy/)。

## 资源接管
<a name="_resource_adoption"></a>

通过接管，您可以将现有的 AWS 资源纳入 ACK 管理，而无需重新创建它们。

何时使用接管：
+ 将现有基础设施迁移到 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 资源一样进行管理，并且删除 Kubernetes 资源时将删除相应的 AWS 资源，除非您使用了 `retain` 删除策略。

接管资源时，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 会自动处理瞬态错误并重试失败的操作。

重试策略：
+ 瞬态错误（速率限制、临时服务问题、权限不足）会触发自动重试
+ 指数回退可防止 API AWS 负载过重
+ 最大重试次数因错误类型而异
+ 永久错误（参数无效、资源名称冲突）不会重试

使用 `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 调用都包含以下会话标签：


| 标签密钥 | 说明 | 
| --- | --- | 
|   `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 资源与应用程序清单存储在一起，实现端到端 GitOps
+ 根据团队结构，按环境、服务或资源类型整理
+ 使用 Argo CD 的自动同步功能实现持续协调
+ 启用修剪来自动移除已删除的资源
+ 考虑采用轴辐模式进行多集群基础设施管理

GitOps 提供审计跟踪记录、回滚功能和声明式基础设施管理。有关 Argo CD 的更多信息，请参阅[使用 Argo CD](working-with-argocd.md)。

### 使用 kro 进行资源组合
<a name="_resource_composition_with_kro"></a>

使用适用于 kro 的 EKS 功能（Kube Resource Orchestrator），将多个 ACK 资源组合成更高级别的抽象和自定义 API。

 **何时将 kro 与 ACK 结合使用**：
+ 为常见的基础设施堆栈创建可重复使用的模式（数据库 \$1 备份 \$1 监控）
+ 为应用团队构建带有简化 API 的自助式平台
+ 管理资源依赖项并在资源之间传递值（例如将 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 命名空间和 AWS 资源标签来整理 ACK 资源，以便更轻松地进行管理、访问控制和成本跟踪。

### 整理命名空间
<a name="_namespace_organization"></a>

使用 Kubernetes 命名空间按环境（生产、暂存、开发）、团队（平台、数据、ml）或应用程序在逻辑上分隔 ACK 资源。

 **优点：**
+ 通过作用域为命名空间的 RBAC 实现访问控制
+ 使用注释为每个命名空间设置默认区域
+ 更轻松地管理和清理资源
+ 逻辑分隔与组织结构一致

### 资源标签
<a name="_resource_tagging"></a>

EKS ACK 功能会自动为它创建的所有 AWS 资源应用默认标签。这些标签与自主管理的 ACK 的标签不同，可提供增强的可追溯性。

 **该功能应用的默认标签**：


| 标签密钥 | 说明 | 
| --- | --- | 
|   `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 的其他功能保持一致。

 **其他推荐标签**：

为成本分配、所有权跟踪和整理目的添加自定义标签：
+ 环境（生产、暂存、开发）
+ 团队或部门所有权
+ 用于账单分配的成本中心
+ 应用程序或服务名称

## 从其他基础设施即代码工具迁移
<a name="_migration_from_other_infrastructure_as_code_tools"></a>

许多组织发现，将 Kubernetes 标准化扩展到工作负载编排之外具有重要价值。将基础设施和 AWS 资源管理迁移到 ACK，可以让您使用 Kubernetes API 来标准化基础设施管理，并与应用程序工作负载一起管理。

 **在 Kubernetes 中标准化基础设施管理的优势**：
+  **单一事实来源**：在 Kubernetes 中同时管理应用程序和基础设施，实现端到端 GitOps 实践
+  **统一工具**：团队使用 Kubernetes 资源和工具，无需学习多种工具和框架
+  **一致协调机制**：ACK 会像 Kubernetes 协调工作负载一样持续协调 AWS 资源，相比命令式工具，ACK 能检测和纠正状态偏差
+  **原生组合**：通过将 kro 与 ACK 结合，直接在应用程序和资源清单中引用 AWS 资源，在资源之间传递连接字符串和 ARN
+  **简化操作**：为整个系统提供统一的控制面板，用于实现部署、回滚和可观测性

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 发现共享基础设施（VPC、IAM 角色、KMS 密钥），而无需承担修改风险。

有关资源接管的更多信息，请参阅 [ACK 概念](ack-concepts.md)。

## 删除策略
<a name="_deletion_policies"></a>

删除策略决定了当您删除 Kubernetes 资源时，相应 AWS 资源的处置方式。根据资源生命周期和运营需求选择合适的策略。

### 删除（默认）
<a name="_delete_default"></a>

当您删除 Kubernetes 资源时，相应的 AWS 也将删除。这样可以保持集群与 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 配置。

## 功能处于活动状态，但无法创建资源
<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 的 EKS 功能与自主管理型 ACK 功能的比较
<a name="ack-comparison"></a>

适用于 ACK 的 EKS 功能提供了与自主管理型 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 有所不同，后者默认不设置这些标签。有关在 IAM 策略中使用会话标签的详细信息，请参阅 [配置 ACK 权限](ack-permissions.md)。

 **资源标签**：该功能为 AWS 资源应用的默认标签与自主管理的 ACK 所应用的标签不同。该功能使用 `eks:` 前缀标签（例如 `eks:kubernetes-namespace`、`eks:eks-capability-arn`），而不是自主管理的 ACK 使用的 `services.k8s.aws/` 标签。有关默认资源标签的完整列表，请参阅 [针对 EKS 的 ACK 注意事项](ack-considerations.md)。

 **资源兼容性**：ACK 自定义资源的工作方式与上游 ACK 完全相同，您无需更改 ACK 资源 YAML 文件。该功能使用同一 Kubernetes API 和 CRD，因此 `kubectl` 等工具的使用方式将保持不变。支持上游 ACK 中所有已正式发布的控制器和资源。

有关完整的 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 控制面板上运行，而不是在 Worker 节点上运行。这意味着您的 Worker 节点不需要直接访问 Git 存储库或 Helm 注册表：此功能可处理来自 AWS 账户的源访问。

Argo CD 提供三种主要资源类型：
+  **Application**：定义从 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 集群 ARN，但为了提高可读性，建议使用集群名称。

## 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 用户界面提供可视化和监控功能，允许您查看应用程序的部署状态、运行状况和历史记录。用户界面与 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 Controllers for 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. 创建和配置 IAM 功能角色，该角色具有必要权限，能让 Argo CD 访问您的源和管理应用程序。

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 Identity Center 已配置**：此为 Argo CD 身份验证所需（不支持本地用户）
+ 具有 Argo CD 操作权限的 IAM 功能角色
+ 可在 EKS 集群上创建功能资源的充足 IAM 权限
+  已配置 `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 访问 Git 存储库，以及访问 Secrets Manager 中的密钥。有关创建具备最低权限的合适角色的操作指引，请参阅 [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)：使用控制台获得引导式体验
+  [使用 AWS CLI 创建 Argo CD 功能](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. 自定义资源定义（CRD）将被安装到集群中

1. 系统会自动为您的 IAM 功能角色创建一个访问条目，该条目带有特定于功能的访问条目策略，这些策略会授予基本的 Kubernetes 权限（请参阅 [EKS 功能的安全注意事项](capabilities-security.md)）

1. Argo CD 开始监视其自定义资源（应用程序、ApplicationSets、AppProjects）

1. 功能状态从 `CREATING` 更改为 `ACTIVE` 

1. 可通过对应的 URL 访问 Argo CD UI

功能进入运行状态后，即可在集群中创建 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>

本主题将介绍如何使用 AWS 管理控制台创建 Argo CD 功能。

## 先决条件
<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 用户界面
<a name="_access_the_argo_cd_ui"></a>

待该功能处于活动状态后，可以访问 Argo CD 用户界面：

1. 在 Argo CD 功能页面上，选择**打开 Argo CD 用户界面**。

1. Argo CD 用户界面将在新的浏览器选项卡中打开。

1. 现在，您可以通过用户界面创建应用程序和管理部署。

## 后续步骤
<a name="_next_steps"></a>
+  [使用 Argo CD](working-with-argocd.md)：配置存储库、注册集群和创建应用程序
+  [Argo CD 注意事项](argocd-considerations.md)：多集群架构和高级配置
+  [使用功能资源](working-with-capabilities.md)：管理 Argo CD 功能资源

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

本主题将介绍如何使用 AWS CLI 创建 Argo CD 功能。

## 先决条件
<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
```

您应该会看到列出的 `Application` 和 `ApplicationSet` 资源类型。

## 后续步骤
<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>

获取 Identity Center 实例 ARN 和用户 ID，用于 RBAC 配置：

```
# 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
```

您应该会看到列出的 `Application` 和 `ApplicationSet` 资源类型。

## 后续步骤
<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、CodeConnection 或 Kubernetes Secret 配置访问权限（有关详细信息，请参阅[配置存储库访问权限](argocd-configure-repositories.md)）。

对于 AWS 服务（用于 Helm 图表的 ECR、CodeConnections 和 CodeCommit），您可以直接在 Application 资源中引用它们，而无需创建存储库。功能角色必须具有必要的 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. 在用户界面中提供运行状况状态和同步历史记录

查看应用程序状态：

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

您也可以使用 Argo CD CLI 或 Argo CD 用户界面（可通过 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 图表或 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 图表的容器映像（如 `oci://registry-1.docker.io/user/my-app`）

得益于这种灵活性，组织能够选择符合其安全性和合规性要求的源。例如，限制集群访问 Git 的组织可以使用 ECR 存放 Helm 图表或 OCI 映像。

有关更多信息，请参阅 Argo CD 文档中的 [Application Sources](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` 等负数）。如果未指定，则默认为波次 `0`。这样您就可以先创建命名空间（波次 `-1`）等依赖项，再创建部署（波次 `0`），再创建服务（波次 `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 资源（Deployment、StatefulSets、Jobs 等）的运行状况检查，并且支持对 CRD 进行自定义运行状况检查。

应用程序运行状况由所有资源决定，如果任何资源为 `Degraded`，则应用程序为 `Degraded`。

有关更多信息，请参阅 Argo CD 文档中的 [Resource Health](https://argo-cd.readthedocs.io/en/stable/operator-manual/health/)。

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

Argo CD 支持两种主要的部署模式：

 **轴辐式**：在专用的管理集群（部署到多个工作负载集群）上运行 Argo CD：\$1 集中控制和可见性 \$1 在所有集群之间保持策略一致 \$1 只需一个 Argo CD 实例即可进行管理 \$1 实行控制面板与工作负载之间的清晰分离

 **单集群**：在每个集群上运行 Argo CD，仅管理该集群的应用程序：\$1 集群分离（一个故障不会影响其他集群）\$1 联网更简单（无需跨集群通信）\$1 初始设置更轻松（无需注册集群）

对于管理许多集群的平台团队，选择轴辐式；对于独立的团队或必须完全隔离的集群，选择单集群。

有关多集群配置的详细信息，请参阅 [Argo CD 注意事项](argocd-considerations.md)。

### Projects
<a name="_projects"></a>

项目为应用程序提供逻辑分组和访问权限控制：
+  **源限制**：限制可以使用哪些 Git 存储库
+  **目标限制**：限制可以指向哪些集群和命名空间
+  **资源限制**：限制可以部署哪些 Kubernetes 资源类型
+  **RBAC 集成**：将项目映射到 AWS Identity Center 的用户和组 ID

应用程序同属一个项目。如果未指定，它们将使用 `default` 项目（默认没有任何限制）。对于生产用途，请编辑 `default` 项目以限制访问权限，并创建具有适当限制的新项目。

有关项目配置和 RBAC 模式，请参阅[配置 Argo CD 权限](argocd-permissions.md)。

### 同步选项
<a name="_sync_options"></a>

使用常用选项微调同步行为：
+  `CreateNamespace=true`：自动创建目标命名空间
+  `ServerSideApply=true`：使用服务器端应用程序以更好地解决冲突
+  `SkipDryRunOnMissingResource=true`：当 CRD 尚不存在时跳过试运行（对 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 进行身份验证，并提供三个内置的 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 配置
+ 无法直接管理集群或存储库
+ 若没有项目角色，则无法查看或管理应用程序

 **VIEWER** 

对 Argo CD 资源的只读访问权限：
+ 查看项目配置
+ 列出所有项目（包括该用户未被分配到的项目）
+ 查看 GPG 密钥和证书
+ 无法列出集群或存储库
+ 无法进行任何更改
+ 若没有项目角色，则无法查看或管理应用程序

**注意**  
要授予 EDITOR 或 VIEWER 用户访问应用程序的权限，ADMIN 或 EDITOR 必须创建项目角色，将 Identity Center 组映射到项目中的特定权限。

## 项目角色和项目范围内的访问权限
<a name="project-roles"></a>

全局角色（ADMIN、EDITOR、VIEWER）将控制对 Argo CD 本身的访问。项目角色控制对特定项目内的资源和功能的访问权限，包括：
+  **资源**：应用程序、ApplicationSets、存储库凭证、集群凭证
+  **功能**：日志访问、对应用程序容器组（pod）的 exec 访问权限

 **了解两级权限模型**：
+  **全局范围**：内置角色决定了用户能够对项目、集群、存储库以及 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 功能可支持最多 1000 个身份。身份可以是用户或组。

 **更新角色映射**：

```
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>

管理员账户专为初始设置和管理任务（例如注册集群和配置存储库）而设计。

 **何时适合使用管理员账户**：
+ 初始功能设置和配置
+ 单人开发或快速演示
+ 管理任务（注册集群、配置存储库、创建项目）

 **管理员账户最佳实践**：
+ 请勿将账户令牌提交给版本控制
+ 如果令牌暴露，则立即轮换
+ 将账户令牌的使用限制在设置和管理任务
+ 设置较短的过期时间（最长 12 小时）
+ 在任何给定时间只能创建 5 个账户令牌

 **何时改用基于项目的访问**：
+ 与多个用户共享的开发环境
+ 任何与生产环境相似的环境
+ 需要有关操作执行者的审计跟踪记录时
+ 需要强制实施资源限制或访问边界时

对于生产环境和多用户场景，请使用基于项目的访问控制，并将专用 RBAC 角色映射到 AWS Identity Center 组。

## 基于项目的访问控制
<a name="_project_based_access_control"></a>

使用 Argo CD 项目（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` 以允许用户在用户界面中查看集群名称。如果没有此权限，则目标集群将显示为“未知”。

 **了解项目角色策略**：

策略格式为：`p, proj:<project>:<role>, <resource>, <action>, <object>, <allow/deny>`

 **资源策略**：
+  `applications, , team-a/, allow`：对 team-a 项目中所有应用程序的完全访问权限
+  `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）的 Exec 访问权限

**注意**  
EDITOR 用户可以创建项目角色，以便在他们能够更新的项目中为自己及他人授予权限。这使得团队负责人能够自行控制其团队所使用的项目范围内资源的访问权限，而无需 ADMIN 的干预。

**注意**  
在 `groups` 字段中使用 Identity Center 组 ID（不是组名称）。您也可以将 Identity Center 用户 ID 用于个人用户访问。在 AWS Identity Center 控制台中或使用 AWS CLI 查找这些 ID。

## 常见权限模式
<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、凭证）和功能（日志、exec）的权限

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>

要在 Application 资源中直接使用 AWS 服务（而无需创建存储库资源），请将所需的 IAM 权限附加到功能角色。

 **用于 Helm 图表的 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 用户界面
<a name="_access_the_argo_cd_ui"></a>

通过 EKS 控制台访问 Argo CD 用户界面：

1. 打开 Amazon EKS 控制台

1. 选择您的集群

1. 选择**功能**选项卡

1. 选择 **Argo CD** 

1. 选择 **Open Argo CD 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 Guide](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 图表注册表。Argo CD 支持针对 GitHub、GitLab、Bitbucket、AWS CodeCommit 和 AWS ECR 的多种身份验证方法。

**注意**  
若要与 AWS 服务直接集成（ECR Helm 图表、CodeCommit 存储库和 CodeConnections），您可以直接在 Application 资源中引用它们，而无需创建存储库配置。功能角色必须具有必要的 IAM 权限。有关详细信息，请参阅 [配置 Argo CD 权限](argocd-permissions.md)。

## 先决条件
<a name="_prerequisites"></a>
+ 已创建具有 Argo CD 功能的 EKS 集群
+ Git 存储库包含 Kubernetes 清单
+  已配置 `kubectl` 以与集群通信

**注意**  
 AWS CodeConnections 可以连接到位于 AWS 云或本地的 Git 服务器。有关更多信息，请参阅 [AWS CodeConnections](https://docs.aws.amazon.com/codeconnections/latest/userguide/welcome.html)。

## 身份验证方法
<a name="_authentication_methods"></a>


| 方法 | 使用场景 | 所需的 IAM 权限 | 
| --- | --- | --- | 
|   **与 AWS 服务直接集成**   | 
|  CodeCommit  |  直接与 AWS CodeCommit Git 存储库集成。无需配置存储库。  |   `codecommit:GitPull`   | 
|  CodeConnections  |  通过托管身份验证连接到 GitHub、GitLab 或 Bitbucket。需要进行连接设置。  |   `codeconnections:UseConnection`   | 
|  ECR OCI 构件  |  直接与 AWS ECR 集成以获取 OCI Helm 图表和清单映像。无需配置存储库。  |   `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 Secret  |  使用集群内密钥的标准 Argo CD 方法  |  无（由 EKS 访问条目使用 Kubernetes RBAC 处理的权限）  | 

## 直接访问 AWS 服务
<a name="direct_access_to_shared_aws_services"></a>

对于 AWS 服务，您可以直接在 Application 资源中引用它们，而无需创建存储库配置。功能角色必须具有必要的 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 图表
<a name="_ecr_helm_charts"></a>

ECR 将 Helm 图表存储为 OCI 构件。Argo CD 支持两种引用方式：

 **Helm 格式**（建议用于 Helm 图表）：

```
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: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` 结合使用。这比单独创建每个存储库的密钥能提供更好的用户体验。有关更多信息，请参阅 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 中创建 Secret**：

```
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 的 Repository Secret**：

```
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 私有密钥的 Secret**：

```
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 创建 Repository Secret**：

```
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 应用程序凭证的 Secret**：

```
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 应用程序创建 Repository Secret**：

```
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` 结合使用。这比为每个存储库单独创建存储库密钥能提供更好的用户体验。

 **创建存储库凭证模板**：

```
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 Secrets
<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>

对于 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 用户界面，在“设置 → 存储库”下检查连接状态。用户界面会显示连接状态和任何身份验证错误。

Repository Secret 不包含状态信息。

## 其他资源
<a name="_additional_resources"></a>
+  [注册目标集群](argocd-register-clusters.md)：注册用于部署的目标集群
+  [创建应用程序](argocd-create-application.md)：创建第一个应用程序
+  [Argo CD 注意事项](argocd-considerations.md)：IAM 权限和安全配置
+  [Private Repositories](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 示例的兼容性。

**注意**  
系统会自动为具有 Argo CD 功能角色的本地集群创建 EKS 访问条目，但默认情况下不会授予 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 Secret**：

```
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。托管功能需要使用 ARN 来识别集群。不支持默认的 `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 权限关联** 

访问条目需要 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 Secret**：

```
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 用户界面的“设置 → 集群”下查看集群状态。

## 私有集群
<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 如果您需要创建 CRD，则需要额外的集群管理员权限

您必须根据自己的要求明确配置 Argo CD 所需的权限。

### Argo CD 的最低权限
<a name="_minimum_permissions_for_argo_cd"></a>

Argo CD 要想正常运行且不出故障，需要两种类型的权限：

 **读取权限（集群范围）**：Argo CD 必须能够读取集群中的所有资源类型和自定义资源定义（CRD），以便：
+ 资源发现和运行状况检查
+ 检测所需状态和实际状态之间的漂移
+ 在部署之前验证资源

 **写入权限（特定于命名空间）**：Argo CD 需要创建、更新和删除应用程序中定义的资源的权限：
+ 部署应用程序工作负载（部署、服务、ConfigMaps 等）
+ 应用自定义资源（特定于您的应用程序的 CRD）
+ 管理应用程序生命周期

### 快速设置
<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`），包括创建 CRD、修改集群范围的资源以及部署到任何命名空间的能力。这便于开发和 POC，但不应在生产环境中使用。对于生产，请使用下面的最低权限设置。

### 具有最低权限的生产设置
<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)：多集群模式和跨账户设置
+  [Declarative Cluster Setup](https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#clusters)：上游集群配置参考

# 使用 Argo CD 项目
<a name="argocd-projects"></a>

Argo CD 项目（AppProject）为应用程序提供逻辑分组和访问控制。项目定义了应用程序可以使用哪些 Git 存储库、目标集群和命名空间，从而在 Argo CD 共享实例中实现多租户和安全边界。

## 何时使用项目
<a name="_when_to_use_projects"></a>

使用项目以：
+ 按团队、环境或业务部门分离应用程序
+ 限制团队可以从中部署哪些存储库
+ 限制团队可以部署到哪些集群和命名空间
+ 强制执行资源配额和允许的资源类型
+ 提供带护栏的应用程序自助部署

## 默认项目
<a name="_default_project"></a>

每个 Argo CD 功能都包含 `default` 项目，该项目允许访问所有存储库、集群和命名空间。这对于初始测试很有用，但对于生产用途，请创建具有明确限制的专用项目。

有关默认项目配置以及如何对其进行限制的详细信息，请参阅 Argo CD 文档中的 [The Default Project](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 文档中的 [Managing Projects](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 文档中的 [Managing Projects](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 文档中的 [Project Roles](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 Projects Documentation](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 集群 ARN，但为了提高可读性，建议使用集群名称。

应用应用程序：

```
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 图表**：

```
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
```

 **带有来自外部 Git 存储库的值的 Helm 图表**（多源模式）：

```
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 图表**：

```
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
```

这对于那些必须先创建 CRD 的资源来说尤其有用，或者在处理 kro 实例时也很适用，因为在这些情况下 CRD 可能无法立即获取到。

## 同步选项
<a name="_sync_options"></a>

其他同步配置：

 **如果命名空间不存在，请创建一个**：

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

 **跳过缺失资源的试运行**：

在应用依赖于尚未存在的 CRD（例如 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 文档中的 [Sync Waves](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/) 和 [Resource Hooks](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 文档中的 [Diffing Customization](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 用户界面**：

通过 EKS 控制台打开 Argo CD 用户界面，查看应用程序拓扑、同步状态、资源运行状况和部署历史记录。有关用户界面访问说明，请参阅[使用 Argo CD](working-with-argocd.md)。

 **回滚应用程序**：

可以通过 Argo CD 用户界面、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)：通过模板部署到多个集群
+  [Application Specification](https://argo-cd.readthedocs.io/en/stable/user-guide/application-specification/)：完整的应用程序 API 参考
+  [Sync Options](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-options/)：高级同步配置

# 使用 ApplicationSets
<a name="argocd-applicationsets"></a>

ApplicationSet 通过模板生成多个应用程序，使您能够通过单个资源定义，跨多个集群、环境或命名空间部署相同的应用程序。

## 先决条件
<a name="_prerequisites"></a>
+ 已创建具有 Argo CD 功能的 EKS 集群
+ 已配置存储库访问权限（请参阅[配置存储库访问权限](argocd-configure-repositories.md)）
+  已配置 `kubectl` 以与集群通信

**注意**  
ApplicationSets 不需要多个目标集群。您可以使用集群生成器以外的生成器（如 list、git 或 matrix 生成器），在没有远程集群的情况下部署应用程序。

## 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 集群 ARN 配合使用。

这将创建三个应用程序：`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 Generator](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 文档中的 [Matrix Generator](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 规范中将 `.syncPolicy.preserveResourcesOnDeletion` 设置为 `true`。有关更多信息，请参阅 Argo CD 文档中的[应用程序修剪和资源删除](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Application-Deletion/)。

**重要**  
Argo CD 的 ApplicationSets 功能存在一些安全方面的考量事项，在使用 ApplicationSets 之前您应当予以了解。有关更多信息，请参阅 Argo CD 文档中的 [ApplicationSet 安全性](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 Documentation](https://argo-cd.readthedocs.io/en/stable/user-guide/application-set/)：完整的生成器参考和模式
+  [Generator Reference](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 使用专用的管理集群。

 **应用程序组织**：规划如何构建 Applications 和 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` 字段限制为特定的存储库 ARN，而不是使用 `"*"`。  
示例：  

```
"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 用户界面

1. 他们使用 AWS Identity Center（可以与企业身份提供者联合）进行身份验证

1.  AWS Identity Center 向 Argo CD 提供用户和组信息

1. Argo CD 会根据配置将用户和组映射到 RBAC 角色

1. 用户只能看到他们有权访问的应用程序和资源

### 使用 IAM Center 权限集简化访问管理
<a name="_simplifying_access_with_identity_center_permission_sets"></a>

 使用 Argo CD 时，AWS Identity Center 提供两种不同的身份验证路径：

 **Argo CD API 身份验证**：Identity Center 向 Argo CD 用户界面和 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 功能可支持最多 1000 个身份。身份可以是用户或组。

## 多集群部署
<a name="_multi_cluster_deployments"></a>

Argo CD 托管功能支持多集群部署，便于您通过单个 Argo CD 实例在开发、暂存和生产集群之间管理应用程序。

### 多集群工作原理
<a name="_how_multi_cluster_works"></a>

当您向 Argo CD 注册其他集群时：

1. 您需要创建集群密钥，并通过 ARN 来引用目标 EKS 集群

1. 您需要创建针对不同集群的 Applications 或 ApplicationSets

1. Argo CD 会连接到每个集群以部署和监视资源

1. 您可以通过单个 Argo CD 用户界面查看和管理所有集群

### 多集群的先决条件
<a name="_prerequisites_for_multi_cluster"></a>

在注册其他集群之前：
+ 在目标集群上，为 Argo CD 功能角色创建访问条目
+ 确保 Argo CD 功能与目标集群之间建立网络连接
+ 验证访问目标集群所需的 IAM 权限

### 注册集群
<a name="_register_a_cluster"></a>

使用 `argocd` 命名空间中的 Kubernetes Secret 注册集群。

获取目标集群 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。托管功能需要使用 ARN 来识别目标集群。

应用该密钥：

```
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 支持对应用程序内的资源（Deployment、Pod、ConfigMap、Secret）进行精细访问控制。

 **使用 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 以在推送更改时立即触发同步。

Webhook 具有以下优势：
+ 推送代码时立即同步响应（秒级而非分钟级）
+ 减少轮询开销并提高系统性能
+ 更有效地使用 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**：创建 Amazon EventBridge 规则，该规则会在 CodeCommit 存储库状态更改时触发，并将通知发送到 Argo CD Webhook 端点。

有关详细的 Webhook 配置说明，请参阅 [Argo CD Webhook Configuration](https://argo-cd.readthedocs.io/en/stable/operator-manual/webhook/)。

**注意**  
Webhooks 是对轮询的补充，并不能取而代之。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` 命名空间。问题排查侧重于功能运行状况、应用程序状态和配置。

## 功能已激活，但应用程序未同步
<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 凭证无效
+  **未创建应用程序**：集群中不存在 Application 资源
+  **同步策略**：需要手动同步（未启用自动同步）
+  **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}'
```

## 应用程序始终处于“Progressing”状态
<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 的 EKS 功能与自主管理型 Argo CD 的比较
<a name="argocd-comparison"></a>

适用于 Argo CD 的 EKS 功能提供了在 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 用户界面通过其自身的直接 URL 托管（可在 EKS 控制台中集群的“功能”选项卡下找到），API 访问则通过 IAM 使用 AWS 身份验证和授权。

 **集群配置**：该功能不会自动配置本地集群或轴辐式拓扑。您需要自行配置部署目标集群和 EKS 访问条目。该功能仅支持将 Amazon EKS 集群作为部署目标，且必须使用 EKS 集群 ARN（而非 Kubernetes API 服务器 URL）。该功能不会自动将本地集群 (`kubernetes.default.svc`) 添加为部署目标，若要部署到创建该功能的同一集群，请使用其 ARN 明确注册该集群。

 **简化的远程集群访问**：该功能使用 EKS 访问条目来授予 Argo CD 远程集群访问权限，从而简化了多集群部署，无需配置服务账户的 IAM 角色（IRSA）或设置跨账户 IAM 角色代入。该功能还支持对完全私有的 EKS 集群进行透明访问，无需进行 VPC 对等连接或专门的网络配置，AWS 会自动管理 Argo CD 功能与私有远程集群之间的连接。

 **直接的 AWS 服务集成**：该功能通过功能角色的 IAM 权限，提供与 AWS 服务的直接集成。您可以直接在 Application 资源中引用 CodeCommit 存储库、ECR Helm 图表和 CodeConnections，而无需创建存储库配置。这简化了身份验证，无需为 AWS 服务管理单独的凭证。有关详细信息，请参阅 [配置存储库访问权限](argocd-configure-repositories.md)。

 **命名空间支持**：该功能要求您指定一个单一命名空间，在该命名空间内必须创建 Argo CD 应用程序、ApplicationSet 以及 AppProject 自定义资源。

**注意**  
此命名空间限制仅适用于 Argo CD 自己的自定义资源（应用程序、ApplicationSet、AppProject）。您的应用程序工作负载可以部署到任何目标集群中的任何命名空间中。例如，如果您使用命名空间 `argocd` 创建功能，则必须在 `argocd` 命名空间中创建所有应用程序 CR，但这些应用程序可以将工作负载部署到 `default`、`production`、`staging` 或任何其他命名空间。

**注意**  
托管功能对 CLI 的使用和 AppProject 配置有特定的要求：  
使用 Argo CD CLI 时，请使用命名空间前缀指定应用程序：`argocd app sync namespace/appname`
AppProject 资源必须指定 `.spec.sourceNamespaces`，以确定该项目可以监控应用程序的哪些命名空间（通常设置为您在创建功能时所指定的命名空间）
资源跟踪注释使用格式：`namespace_appname:group/kind:namespace/name`

 **不支持的功能**：托管功能中不提供以下功能：
+ 用于生成自定义清单的 Config 管理插件（CMP）
+ 用于资源运行状况评测的自定义 Lua 脚本（支持标准资源的内置运行状况检查）
+ 通知控制器
+ 自定义 SSO 提供者（仅支持 AWS Identity Center，包括通过 AWS Identity Center 提供的第三方联合身份）
+ 用户界面扩展和自定义横幅
+ 直接访问 `argocd-cm`、`argocd-params` 和其他配置 ConfigMaps
+ 修改同步超时（固定为 120 秒）

 **兼容性**：Applications 和 ApplicationSets 的工作方式与上游 Argo CD 完全相同，清单无需更改。该功能使用同一 Kubernetes API 和 CRD，因此 `kubectl` 等工具的使用方式将保持不变。该功能完全支持 Applications 和 ApplicationSets、带自动同步的 GitOps 工作流程、多集群部署、同步策略（自动化、修剪、自我修复）、同步波次和钩子、标准 Kubernetes 资源的运行状况评估、回滚功能、Git 存储库源（HTTPS 和 SSH）、Helm、Kustomize 和原生 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。

### 配置
<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 用户界面（**设置** → **账户** → **管理员** → **生成新令牌**）生成账户令牌，然后将其设置为环境变量：

   ```
   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` 需要 `--aws-cluster-name` 标志并指定 EKS 集群 ARN

### 示例：注册集群
<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 配置中是否存在不支持的功能（通知控制器、CMP、自定义运行状况检查、UI 扩展）

1. 将自主管理的 Argo CD 控制器缩减到零副本以防止冲突

1. 在集群上创建 Argo CD 功能资源

1. 导出现有的 Applications、ApplicationSets 和 AppProjects

1. 迁移存储库凭证、集群密钥和存储库凭证模板（repocreds）

1. 如果使用 GPG 密钥、TLS 证书或 SSH 已知主机，请同时迁移这些配置

1. 更新 `destination.server` 字段以使用集群名称或 EKS 集群 ARN

1. 将其应用于 Argo CD 托管实例

1. 验证应用程序是否正确同步

1. 停用自行管理型 Argo CD 安装

托管功能使用相同的 Argo CD API 和资源定义，因此只需最少的修改即可使用现有清单。

## 后续步骤
<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 API。借助 kro，您可以轻松配置全新的自定义 API，这些 API 可用于创建一组 Kubernetes 对象，并定义对象之间的逻辑操作。

基于 EKS 功能，kro 由 AWS 提供全托管服务，无需您在集群中安装、维护和扩缩 kro 控制器。

## kro 工作原理
<a name="_how_kro_works"></a>

kro 引入了一种名为 `ResourceGraphDefinition`（RGD）的自定义资源定义（CRD），支持以简洁高效的方式创建自定义 Kubernetes API。在您创建 `ResourceGraphDefinition` 后，kro 会借助 Kubernetes 原生扩展能力，在集群中创建并管理这些新的 API。基于这份单一的资源规范，kro 会自动根据您的配置创建并注册一个全新的 CRD，同时自适应地管理您所定义的这些新自定义资源。

RGD 可包含多种资源，kro 会自动判断资源间的依赖关系与创建顺序，无需人工干预。您能够通过简单的语法，将配置信息从一个资源注入另一个资源，极大简化了资源组合编排流程，不再需要在集群中部署用于资源衔接的“粘合型”控制器。借助 kro，您所定义的自定义资源既可以包含 Kubernetes 原生资源，也能够兼容集群中已安装的任意自定义资源定义（CRD）。

kro 仅支持一种核心资源类型：
+  **ResourceGraphDefinition (RGD)**：定义一种 Kubernetes 自定义资源，该资源可封装一个或多个底层的 Kubernetes 原生资源或自定义资源

除该核心资源外，kro 还会负责创建并管理由其生成的自定义资源的生命周期，同时管理这些自定义资源所包含的全部组成资源。

kro 可与 AWS Controllers for Kubernetes（ACK）无缝集成，支持您将工作负载资源与 AWS 资源进行组合，从而创建更高级别的抽象资源。此能力可帮助您构建专属的云基础设施组件，简化资源管理流程，并能基于企业标准配置默认值与不可变配置项，形成可复用的模式。

## kro 优势
<a name="_benefits_of_kro"></a>

kro 支持平台团队创建自定义 Kubernetes API，将多个资源组合为更高级别的抽象资源。这一能力可以简化资源管理工作，开发者只需通过简洁、标准化且带版本控制的自定义资源，就能完成复杂应用的部署。您可以为常用的资源组合定义可复用模式，在企业内部实现一致化的资源创建流程。

kro 在 [Kubernetes 环境中采用公共表达式语言（CEL）](https://kubernetes.io/docs/reference/using-api/cel/)实现资源间的值传递与条件逻辑配置，让资源组合编排具备更强的灵活性。您既可以组合 Kubernetes 原生资源，也能将 ACK 管理的 AWS 资源纳入其中，构建出一体化的自定义 API，从而实现应用与基础设施的完整定义。

kro 支持通过 Kubernetes 清单完成声明式配置，可无缝对接 GitOps 工作流程与基础设施即代码实践，与您现有的开发流程深度融合。作为 EKS 托管功能的一部分，kro 由 AWS 提供全托管服务，无需您在集群中安装、配置和维护 kro 控制器。

 **示例：创建 ResourceGraphDefinition** 

以下示例展示了一个简单的 `ResourceGraphDefinition` 配置，用于创建一个包含 Deployment 和 Service 的 Web 应用：

```
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 会自动生成对应的 Deployment 与 Service 资源，并将其生命周期与自定义资源进行统一管理。

## 与其他 EKS 托管功能集成
<a name="_integration_with_other_eks_managed_capabilities"></a>

kro 与其他 EKS 托管功能集成。
+  **AWS Controllers for Kubernetes（ACK）**：借助 kro 将 ACK 资源组合为更高级别的抽象资源，简化 AWS 资源的管理流程。
+  **Argo CD**：通过 Argo CD 管理 kro 自定义资源在多集群的部署，为平台基础设施组件与应用栈启用 GitOps 工作流程。

## kro 入门
<a name="_getting_started_with_kro"></a>

若要开始使用 EKS 托管型 kro，可按照以下步骤操作：

1.  通过 AWS 控制台、AWS CLI 或您偏好的基础设施即代码工具，在 EKS 集群上[创建 kro 功能资源](create-kro-capability.md)。

1. 创建 ResourceGraphDefinition（RGD），定义自己的自定义 API 与资源组合编排规则。

1. 应用自定义资源实例，完成底层 Kubernetes 资源与 AWS 资源的配置和管理。

# 创建 kro 功能
<a name="create-kro-capability"></a>

本主题旨在介绍如何在 Amazon EKS 集群上创建 kro 功能。

## 先决条件
<a name="_prerequisites"></a>

创建 kro 功能之前，确保满足以下条件：
+ 运行受支持 Kubernetes 版本的现有 Amazon EKS 集群（标准支持与扩展支持范围内的所有版本均适用）
+ 可在 EKS 集群上创建功能资源的充足 IAM 权限
+ （适用于 CLI/eksctl）已安装并配置相应 CLI 工具

**注意**  
与 ACK 和 Argo CD 不同，kro 除信任策略外，无需额外的 IAM 权限。kro 完全在集群中运行，不会发起 AWS API 调用。不过，您仍需提供一个配置了相应信任策略的 IAM 功能角色。有关配置 Kubernetes RBAC 权限的信息，请参阅[配置 kro 权限](kro-permissions.md)。

## 选择工具
<a name="_choose_your_tool"></a>

您可以使用AWS 管理控制台、AWS CLI 或 eksctl 创建 kro 功能：
+  [使用控制台创建 kro 功能](kro-create-console.md)：使用控制台获得引导式体验
+  [使用 AWS CLI 创建 kro 功能](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. 自定义资源定义（CRD）将被安装到集群中

1. 系统会使用 `AmazonEKSKROPolicy` 自动为您的 IAM 功能角色创建一个访问条目，该条目授予管理 ResourceGraphDefinitions 及其实例的权限（请参阅 [EKS 功能的安全注意事项](capabilities-security.md)）

1. 该功能会代入您提供的 IAM 功能角色（此角色仅用于信任关系配置）

1. kro 开始监听 `ResourceGraphDefinition` 资源及其对应的实例

1. 功能状态从 `CREATING` 更改为 `ACTIVE` 

功能进入运行状态后，即可创建 ResourceGraphDefinition，以此定义自定义 API，并创建这些 API 对应的实例。

**注意**  
自动创建的访问条目包括授予 kro 管理 ResourceGraphDefinitions 及其实例的权限的 `AmazonEKSKROPolicy`。要允许 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>

本主题旨在介绍如何使用 AWS 管理控制台 创建 kro（Kube Resource Orchestrator）功能。

## 创建 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 功能时，系统会使用 `AmazonEKSKROPolicy` 自动创建 EKS 访问条目，该条目允许 kro 管理 ResourceGraphDefinitions 及其实例。但是，默认情况下，不授予任何权限来创建 ResourceGraphDefinitions 中定义的底层 Kubernetes 资源（如部署、服务、ConfigMaps 等）。

这种有意的设计遵循了最低权限原则，即不同的 ResourceGraphDefinitions 需要不同的权限。您必须根据您的 ResourceGraphDefinitions 将管理的资源明确配置 kro 所需的权限。

对于快速入门、测试或开发环境，请使用 `AmazonEKSClusterAdminPolicy`：

1. 在 EKS 控制台中，导航到 EKS 集群的**访问**选项卡。

1. 在**访问条目**下，找到对应 kro 功能角色的条目（将包含之前创建的角色 ARN）。

1. 选择访问条目，打开对应的详细信息页面。

1. 在**访问策略**部分，选择**关联访问策略**。

1. 从策略列表中选择 `AmazonEKSClusterAdminPolicy`。

1. 在**访问范围**中，选择**集群**。

1. 选择**关联 **。

**重要**  
`AmazonEKSClusterAdminPolicy` 会授予宽泛的权限，以创建和管理所有的 Kubernetes 资源，包括能够在所有命名空间中创建任何类型的资源的权限。这便于开发和 POC，但不应在生产环境中使用。在生产环境使用时，请创建自定义 RBAC 策略，仅授予 ResourceGraphDefinition 需管理的特定资源对应的权限。有关配置最低权限的指引，请参阅[配置 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 功能资源

# 使用 AWS CLI 创建 kro 功能
<a name="kro-create-cli"></a>

本主题旨在介绍如何使用 AWS CLI 创建 kro（Kube Resource Orchestrator）功能。

## 先决条件
<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 功能时，系统会使用 `AmazonEKSKROPolicy` 自动创建 EKS 访问条目，该条目允许 kro 管理 ResourceGraphDefinitions 及其实例。但是，默认情况下，不授予任何权限来创建 ResourceGraphDefinitions 中定义的底层 Kubernetes 资源（如部署、服务、ConfigMaps 等）。

这种有意的设计遵循了最低权限原则，即不同的 ResourceGraphDefinitions 需要不同的权限。例如：\$1 一个仅创建 ConfigMaps 和密钥的 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 资源，包括能够在所有命名空间中创建任何类型的资源的权限。这便于开发和 POC，但不应在生产环境中使用。在生产环境使用时，请创建自定义 RBAC 策略，仅授予 ResourceGraphDefinition 需管理的特定资源对应的权限。有关配置最低权限的指引，请参阅[配置 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 仅能创建和管理 ResourceGraphDefinition 及其对应的实例。若要允许 kro 创建和管理 ResourceGraphDefinition 中定义的底层 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 策略，仅授予 ResourceGraphDefinition 需管理的特定资源对应的权限。有关配置最低权限的指引，请参阅[配置 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 API，将多个资源组合为更高级别的抽象资源。本主题会先引导您完成一个实操案例的演练，再详细阐释使用 EKS 托管型 kro 所需掌握的核心概念。

## kro 入门
<a name="_getting_started_with_kro"></a>

创建 kro 托管功能后（详见[创建 kro 功能](create-kro-capability.md)文档），即可开始在集群中通过 ResourceGraphDefinition 来创建自定义 API。

以下完整示例用于创建简单的 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 会自动创建带有相应配置的 Deployment 和 Service 资源。由于配置中未指定 `image` 参数，系统会采用模式定义中预设的默认值 `nginx:latest`。

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

**重要**  
kro 会在创建阶段对 ResourceGraphDefinition 进行验证，而非在运行时阶段。当您创建一个 RGD 时，kro 会执行以下验证操作：校验 CEL 语法的正确性、基于实际的 Kubernetes 模式对表达式进行类型检查、验证字段是否存在、检测是否存在循环依赖。这意味着相关错误会在创建 RGD 时被立即发现，无需等到部署任何实例之后。

### ResourceGraphDefinition
<a name="_resourcegraphdefinition"></a>

ResourceGraphDefinition（RGD）通过配置以下内容来定义一种 Kubernetes 自定义 API：
+  **Schema**：采用 SimpleSchema 格式定义的 API 结构（字段名称、字段类型、默认值及验证规则）
+  **Resources**：待创建的底层 Kubernetes 资源或 AWS 资源的模板
+  **Dependencies**：资源之间的关联方式（会通过字段引用自动识别）

当您应用一份 RGD 配置后，kro 会在集群中注册一个全新的自定义资源定义（CRD）。之后应用团队即可创建该自定义 API 的实例，由 kro 负责创建并管理所有对应的底层资源。

有关更多信息，请参阅 kro 文档中的 [ResourceGraphDefinition Overview](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 支持 `string`、`integer`、`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 Expressions](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 会在 ResourceGraphDefinition 验证阶段，直接拒绝存在循环依赖的配置。

您可以查看系统计算出的资源创建顺序：

```
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.topologicalOrder}'
```

有关更多信息，请参阅 kro 文档中的 [Graph inference](https://kro.run/docs/concepts/rgd/dependencies-ordering/)。

## 与 ACK 的组合编排
<a name="_composing_with_ack"></a>

kro 可与 EKS 托管型 ACK 无缝协同，实现 AWS 资源与 Kubernetes 资源的组合编排：

```
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 资源、提取其详细信息（如 ARN、URL、端点）并注入应用配置，且所有操作均作为单一单元进行管理。

有关更多组合编排模式及进阶示例，请参阅 [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)：包含进阶 CEL 表达式、验证模式及问题排查方案的完整 kro 文档

# 配置 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 资源：

 **ResourceGraphDefinition**：属于集群级资源，用于定义自定义 API。这类资源通常由平台团队负责管理，平台团队会基于组织内的标准规范完成资源的设计与维护工作。

 **实例**：属于命名空间级资源，基于 ResourceGraphDefinition 创建而来。拥有对应 RBAC 权限的应用团队，即可创建这类实例。

默认情况下，kro 功能会通过 `AmazonEKSKROPolicy` 访问条目策略，获得管理 ResourceGraphDefinition 及其实例的权限。但如果需要让 kro 创建和管理 ResourceGraphDefinition 中定义的底层 Kubernetes 资源（例如 Deployment、Service 或 ACK 资源），则需要为其配置额外权限。您可通过访问条目策略或 Kubernetes RBAC 两种方式授予这些权限。有关授予这些权限的详细信息，请参阅 [kro 自定义资源权限](capabilities-security.md#kro-resource-permissions)。

## 平台团队权限
<a name="_platform_team_permissions"></a>

平台团队需要具备创建和管理 ResourceGraphDefinition 的权限。

 **平台团队的 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
```

**注意**  
Role 配置中的 API 组（本例中为 `kro.run`）必须与 ResourceGraphDefinition 模式文件里定义的 `apiVersion` 保持一致。

## 只读访问权限
<a name="_read_only_access"></a>

授予只读访问权限，允许相关人员查看 ResourceGraphDefinition 及实例，且不赋予修改权限。

 **只读 ClusterRole**：

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kro-viewer
rules:
- apiGroups: ["kro.run"]
  resources: ["resourcegraphdefinitions"]
  verbs: ["get", "list", "watch"]
```

 **实例的只读 Role**：

```
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>

借助 ClusterRole 搭配 RoleBinding，为应用团队授予多命名空间的访问权限。

 **多命名空间访问的 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>

 **最低权限原则**：仅为每个团队授予完成其职责所需的最小权限。

 **优先使用用户组而非独立用户**：将角色绑定到用户组而非单个用户，便于权限的统一管理。

 **分离平台团队与应用团队的职责边界**：平台团队负责管理 ResourceGraphDefinition，应用团队负责管理实例。

 **命名空间隔离机制**：利用命名空间实现不同团队或环境的隔离，并通过 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>

本主题旨在介绍使用 EKS 托管型 kro 的重要注意事项，包括资源组合编排的适用场景、RBAC 配置模式以及与其他 EKS 托管功能的集成方法。

## kro 的适用场景
<a name="_when_to_use_kro"></a>

kro 旨在创建可复用的基础设施模式与自定义 API，以简化复杂的资源管理工作。

 **需要使用 kro 的场景**：
+ 为应用团队构建带有简化 API 的自助式平台
+ 在团队间统一基础设施模式（如数据库 \$1 备份 \$1 监控的组合）
+ 管理资源间的依赖关系，并实现资源间的值传递
+ 构建自定义抽象资源，隐藏底层的实现复杂度
+ 将多个 ACK 资源组合为更高级别的基础设施组件
+ 为复杂的基础设施栈启用 GitOps 工作流程

 **无需使用 kro 的场景**：
+ 管理简单的独立资源（直接使用 ACK 或 Kubernetes 原生资源）
+ 需要动态运行时逻辑（kro 为声明式框架，不支持命令式操作）
+ 资源之间不存在依赖关系或共享配置

kro 的优势在于构建标准化部署流程，即提供预设规则、可复用模式，帮助各团队轻松、合规地部署复杂的基础设施。

## RBAC 模式
<a name="_rbac_patterns"></a>

kro 可实现职责分离，将创建 ResourceGraphDefinition 的平台团队与创建实例的应用团队的工作边界清晰划分。

### 平台团队职责
<a name="_platform_team_responsibilities"></a>

平台团队负责创建并维护用于定义自定义 API 的 ResourceGraphDefinition（RGD）。

 **所需权限**：
+ 创建、更新、删除 ResourceGraphDefinition
+ 管理各类底层资源（Deployment、Service、ACK 资源）
+ 拥有 RGD 待使用的所有命名空间的访问权限

 **平台团队的 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>

应用团队负责创建由 RGD 定义的自定义资源实例，无需理解底层实现的复杂逻辑。

 **所需权限**：
+ 创建、更新、删除自定义资源实例
+ 拥有其所在命名空间的读取权限
+ 不授予底层资源或 RGD 的访问权限

 **优点**：
+ 团队可直接使用简洁的高层级 API
+ 平台团队把控底层实现细节
+ 降低配置错误的风险加快
+ 新团队成员的上手速度

## 与其他 EKS 功能集成
<a name="_integration_with_other_eks_capabilities"></a>

### ACK 资源组合编排
<a name="_composing_ack_resources"></a>

kro 与 ACK 结合使用时，在创建基础设施模式方面的能力尤为突出。

 **常见模式**：
+  **带存储功能的应用程序**：S3 存储桶 \$1 SQS 队列 \$1 通知配置
+  **数据库资源栈**：RDS 实例 \$1 参数组 \$1 安全组 \$1 Secrets Manager 密钥
+  **联网资源**：VPC \$1 子网 \$1 路由表 \$1 安全组 \$1 NAT 网关
+  **带存储功能的计算资源**：EC2 实例 \$1 EBS 卷 \$1 IAM 实例配置文件

kro 会自动处理资源的依赖顺序、实现资源间的值传递（如 ARN、连接字符串），并将所有资源作为单一单元进行全生命周期管理。

有关 ACK 资源组合编排的示例，请参阅 [ACK 概念](ack-concepts.md)。

### 将 Argo CD 与 GitOps 搭配使用
<a name="_gitops_with_argo_cd"></a>

借助适用于 Argo CD 的 EKS 功能，可从 Git 存储库中部署 RGD 及实例。

 **存储库组织方式**：
+  **平台存储库**：存放由平台团队管理的 ResourceGraphDefinition
+  **应用存储库**：存放由应用团队管理的自定义资源容器实例
+  **共享存储库**：小型组织可将 RGD 与实例存放于同一存储库

 **注意事项**：
+ 需先部署 RGD，再部署实例（可借助 Argo CD 的同步波功能实现）
+ 为平台团队与应用团队分别配置独立的 Argo CD 项目
+ 由平台团队管控 RGD 存储库的访问权限
+ 为应用团队分配 RGD 定义文件的只读访问权限

有关 Argo CD 的更多信息，请参阅[使用 Argo CD](working-with-argocd.md)。

## ResourceGraphDefinition 的组织方式
<a name="_organizing_resourcegraphdefinitions"></a>

可按照用途、复杂度和归属方对 RGD 进行分类管理。

 **按用途分类**：
+  **基础设施**：数据库资源栈、联网资源、存储资源
+  **应用程序**：Web 应用、API 服务、批处理任务
+  **平台**：共享服务、监控组件、日志组件

 **按复杂度分类**：
+  **简单**：包含 2-3 个资源，依赖关系极少
+  **中等**：包含 5-10 个资源，存在部分依赖关系
+  **复杂**：包含 10 个以上资源，依赖关系复杂

 **命名规范**：
+ 采用描述性名称，例如：`webapp-with-database`、`s3-notification-queue`
+ 若存在破坏性变更，可在名称中加入版本号，例如：`webapp-v2`
+ 为同类型 RGD 添加统一前缀，例如：`platform- `、`app-`

 **命名空间策略**：
+ RGD 为集群级资源（非命名空间级资源）
+ 实例为命名空间级资源
+ 可在 RGD 中配置命名空间选择器，管控实例允许被创建的命名空间范围

## 版本控制与更新
<a name="_versioning_and_updates"></a>

需提前规划 RGD 的迭代优化与实例的迁移方案。

 **RGD 更新**：
+  **非破坏性变更**：直接原地更新 RGD 即可（操作包括新增可选字段、添加带 includeWhen 条件的新资源）
+  **破坏性变更**：需创建名称不同的新 RGD（例如 webapp-v2）
+  **弃用策略**：通过注解标记旧版 RGD，并同步告知用户迁移时间规划

 **实例迁移**：
+ 基于更新版 RGD 创建新的实例
+ 验证新实例运行状态正常
+ 删除旧版实例
+ kro 会自动处理底层资源的更新操作

 **最佳实践**
+ RGD 变更需先在非生产环境完成测试
+ 有重大变更时，在 RGD 名称中采用语义版本控制命名规则
+ 记录破坏性变更内容及对应的迁移方案
+ 为应用团队提供可直接参考的迁移示例

## 验证与测试
<a name="_validation_and_testing"></a>

将 RGD 部署到生产环境前，需对其进行验证。

 **验证策略**：
+  **模式验证**：kro 会自动对 RGD 模式进行验证
+  **实例试运行**：在开发命名空间中创建测试用实例
+  **集成测试**：验证组合后的各类资源是否能协同正常工作
+  **策略强制执行**：通过准入控制器落实组织内部的标准规范

 **需测试的常见问题**：
+ 资源依赖关系与创建顺序
+ 资源间的值传递逻辑（CEL 表达式）
+ 条件式资源的包含规则（includeWhen）
+ 底层资源的状态反馈机制
+ 实例创建操作对应的 RBAC 权限配置

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

有关使用 kro 的详细信息，请参阅以下内容：
+  [kro 入门](https://kro.run/docs/guides/getting-started)：创建 ResourceGraphDefinition
+  [CEL 表达式](https://kro.run/docs/concepts/cel)：编写 CEL 表达式
+  [kro 指南](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 部署 RGD 及实例

# 排查 kro 功能问题
<a name="kro-troubleshooting"></a>

本主题旨在介绍 EKS 托管型 kro 问题排查指引，内容涵盖功能运行状况检查、RBAC 权限、CEL 表达式错误以及资源组合编排问题。

**注意**  
EKS 功能完全托管，可在您的集群之外运行。您无法访问控制器日志或 `kro-system` 命名空间。问题排查侧重于功能运行状况、RBAC 配置和资源状态。

## 功能状态显示为 ACTIVE，但 ResourceGraphDefinition 无法正常工作
<a name="_capability_is_active_but_resourcegraphdefinitions_arent_working"></a>

若 kro 功能状态显示为 `ACTIVE`，但 ResourceGraphDefinition 无法创建底层资源，请检查功能运行状况、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}'
```

ResourceGraphDefinition 包含三项关键状态条件：
+  `ResourceGraphAccepted`：RGD 是否通过验证（CEL 语法、类型校验、字段存在性验证）
+  `KindReady`：自定义 API 对应的 CRD 是否已生成并完成注册
+  `ControllerReady`：kro 是否正在主动监听自定义 API 的实例

若 `ResourceGraphAccepted` 状态为 `False`，请查看状态条件信息，排查是否存在未知字段、类型不匹配或循环依赖等验证类错误。

## 已创建实例但未生成底层资源
<a name="_instances_created_but_underlying_resources_not_appearing"></a>

若自定义资源实例已存在，但对应的底层 Kubernetes 资源（如 Deployment、Service、ConfigMap）未被创建，请验证 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 功能需要具备创建 ResourceGraphDefinition 中所定义的底层 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 创建阶段被捕获，而非在实例创建阶段。当您创建 RGD 时，kro 会对所有 CEL 语法进行验证、基于 Kubernetes 模式对表达式进行类型检查，同时验证字段是否存在。

 **常见 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"
```

 **常见验证问题**：
+  **必填字段缺失**：实例未提供模式要求的全部必填字段
+  **类型不匹配**：在需要整数类型的位置传入了字符串类型
+  **枚举值无效**：使用了不在允许取值列表内的数值
+  **格式不匹配**：字符串未匹配正则表达式格式

 **查看 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)：一般功能问题排查指导

# EKS 托管型 kro 与自主管理型 kro 的对比
<a name="kro-comparison"></a>

EKS 托管型 kro 具备与自主管理型 kro 完全相同的功能，同时还拥有显著的运维优势。有关 EKS 功能与自主管理型解决方案的总体比较，请参阅 [EKS 功能和注意事项](capabilities-considerations.md)。

EKS 托管型 kro 基于上游 kro 控制器构建，且与上游 kro 完全兼容。ResourceGraphDefinition、CEL 表达式以及资源组合编排的工作方式均保持一致。如需查看 kro 的完整文档与示例，请参阅 [kro 文档](https://kro.run/docs/overview)。

## 迁移路径
<a name="_migration_path"></a>

您可以从自主管理型 kro 无缝迁移到托管型 kro，实现零停机时间。

**重要**  
迁移前，请确保自主管理型 kro 控制器与 EKS 托管型 kro 运行的是同一版本。通过 EKS 控制台或 `aws eks describe-capability` 查看托管型 kro 的版本，随后将自主管理型 kro 安装版本升级到与之匹配。此举可避免迁移过程中出现兼容性问题。

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. 托管功能会自动识别现有的 ResourceGraphDefinition 及其实例，并接管资源调和工作

1. 逐步缩减或移除自主管理型 kro 的部署资源：

   ```
   helm uninstall kro --namespace kro
   ```

此方法允许两个控制器在迁移期间安全共存。托管功能会自动接管此前由自主管理型 kro 管理的 ResourceGraphDefinition 及其实例，保障资源调和流程持续进行且无冲突。

## 后续步骤
<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 资源（CRD）

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 权限。

 **UPDATING**：正在应用配置更改。等待状态恢复为 `ACTIVE`。

 **CREATE\$1FAILED** 或 **UPDATE\$1FAILED**：安装或更新遇到错误。有关详细信息，请查看“运行状况”部分。常见原因：
+ IAM 角色信任策略不正确或缺失
+ IAM 角色不存在或无法访问
+ 集群访问权限问题
+ 无效的配置参数

## 验证 Kubernetes 资源状态
<a name="_verify_kubernetes_resource_status"></a>

EKS 功能在您的集群中创建并管理 Kubernetes 自定义资源定义（CRD）。进行问题排查时，请检查您创建的资源的状态：

```
# 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. 可在控制台（**可观测性** > **监控集群** > **功能**选项卡）中或使用 AWS CLI 检查功能运行状况，了解特定问题：

   ```
   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)：针对功能的安全最佳实践