

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 注册目标集群
<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* 替换为远程集群所在的 Amazon 区域，将 *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>

要部署到不同 Amazon 账户中的集群，请执行以下操作：

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 对等连接或专门的网络配置。

 Amazon 会自动管理 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)：上游集群配置参考