

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# ターゲットクラスターを登録する
<a name="argocd-register-clusters"></a>

クラスターを登録すると、Argo CD がアプリケーションをそのクラスターにデプロイできるようになります。Argo CD が動作しているのと同じクラスター (ローカルクラスター) を登録することも、別のアカウントやリージョンのリモートクラスターを登録することもできます。クラスターが新規登録されると、そのクラスター内にアプリケーションが作成されるまで、クラスターの接続ステータスは「不明」のままになります。クラスターの登録後に Argo CD アプリケーションを作成するには、「[Application を作成する](argocd-create-application.md)」を参照してください。

## 前提条件
<a name="_prerequisites"></a>
+ EKS クラスターに Argo CD 機能が作成されていること
+  クラスターと通信できるように `kubectl` が設定されていること
+ リモートクラスターの場合: 適切な IAM アクセス許可およびアクセスエントリ

## ローカルクラスターを登録する
<a name="_register_the_local_cluster"></a>

Argo CD が動作しているのと同じクラスターにアプリケーションをデプロイするには、そのクラスターをデプロイターゲットとして登録します。

**重要**  
Argo CD 機能は、ローカルクラスターを自動的には登録しません。アプリケーションを同じクラスターにデプロイするには、そのクラスターを明示的に登録する必要があります。クラスター名 `in-cluster` を使用して、ほとんどのオンラインの Argo CD の例と互換性を持たせることができます。

**注記**  
EKS アクセスエントリは、Argo CD 機能ロールを持つローカルクラスターに対して自動的に作成されますが、デフォルトでは Kubernetes RBAC アクセス許可は付与されません。これは最小特権の原則に従います。ユースケースに基づいて Argo CD に必要なアクセス許可を明示的に設定する必要があります。例えば、このクラスターを Argo CD ハブとしてのみ使用してリモートクラスターを管理する場合、ローカルデプロイのアクセス許可は必要ないはずです。設定オプションについては、以下のアクセスエントリ RBAC 要件セクションを参照してください。

 **Argo CD CLI を使用する**:

```
argocd cluster add <cluster-context-name> \
  --aws-cluster-name arn:aws:eks:us-west-2:111122223333:cluster/my-cluster \
  --name local-cluster
```

 **Kubernetes シークレットを使用する**:

```
apiVersion: v1
kind: Secret
metadata:
  name: local-cluster
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: cluster
stringData:
  name: local-cluster
  server: arn:aws:eks:us-west-2:111122223333:cluster/my-cluster
  project: default
```

以下のとおり設定を適用します。

```
kubectl apply -f local-cluster.yaml
```

**注記**  
Kubernetes API サーバー URL ではなく、`server` フィールドで EKS クラスター ARN を使用します。マネージド機能では、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 アクセス許可に関連付ける** 

アクセスエントリには、Argo CD がアプリケーションをデプロイするための Kubernetes RBAC アクセス許可が必要です。すぐに開始するには、`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 グループに関連付け、適切なロールバインディングまたはクラスターロールバインディングを作成することで、より制限の厳しいアクセス許可を使用してください。最小特権の設定については、以下の本番環境設定セクションを参照してください。

 **ステップ 3: Argo CD にクラスターを登録する** 

 **Argo CD CLI を使用する**:

```
argocd cluster add <cluster-context-name> \
  --aws-cluster-name arn:aws:eks:us-west-2:111122223333:cluster/remote-cluster \
  --name remote-cluster
```

 **Kubernetes シークレットを使用する**:

```
apiVersion: v1
kind: Secret
metadata:
  name: remote-cluster
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: cluster
stringData:
  name: remote-cluster
  server: arn:aws:eks:us-west-2:111122223333:cluster/remote-cluster
  project: default
```

以下のとおり設定を適用します。

```
kubectl apply -f remote-cluster.yaml
```

## クロスアカウントクラスター
<a name="_cross_account_clusters"></a>

さまざまな AWS アカウント内のクラスターにデプロイするには:

1. ターゲットアカウントで、ソースアカウントの Argo CD IAM 機能ロール ARN をプリンシパルとして使用して、ターゲット EKS クラスター上にアクセスエントリを作成します。

1. アクセスポリシーを適切な Kubernetes RBAC アクセス許可に関連付けします。

1. EKS クラスター ARN を使用して Argo CD にクラスターを登録します。

追加で IAM ロールを作成したり、信頼ポリシーを設定したりする必要はありません。EKS アクセスエントリがクロスアカウントアクセスを処理します。

クラスター ARN 形式にはリージョンが含まれているため、クロスリージョンデプロイでは同じリージョンデプロイと同じプロセスが使用されます。

## クラスター登録を検証する
<a name="_verify_cluster_registration"></a>

登録済みのクラスターを表示します。

```
kubectl get secrets -n argocd -l argocd.argoproj.io/secret-type=cluster
```

あるいは、Argo CD UI の [設定] → [クラスター] でクラスターステータスを確認します。

## プライベートクラスター
<a name="_private_clusters"></a>

Argo CD 機能では、VPC ピアリングや特殊なネットワーク設定を施すことなく、完全にプライベートな EKS クラスターに透過的にアクセスできます。

 AWS は、Argo CD 機能とプライベートリモートクラスターとの接続を自動的に管理します。

単に ARN を使用してプライベートクラスターを登録するだけで、別途ネットワークをセットアップする必要はありません。

## アクセスエントリの RBAC 要件
<a name="_access_entry_rbac_requirements"></a>

Argo CD 機能を作成すると、機能ロールに対して EKS アクセスエントリが自動的に作成されますが、デフォルトでは Kubernetes RBAC アクセス許可は付与されません。この設計は、最小特権の原則に従った意図的なものです。異なるユースケースには、異なるアクセス許可が必要となります。

例: \$1クラスターを Argo CD ハブとしてのみ使用してリモートクラスターを管理する場合、ローカルデプロイのアクセス許可は必要ありません。\$1アプリケーションをローカルにデプロイする場合は、クラスター全体の読み取りアクセスと特定の名前空間への書き込みアクセスが必要です。\$1CRD を作成する必要がある場合は、追加のクラスター管理者アクセス許可が必要です。

要件に基づいて Argo CD に必要なアクセス許可を明示的に設定する必要があります。

### Argo CD の最小アクセス許可
<a name="_minimum_permissions_for_argo_cd"></a>

Argo CD には、エラーなしで機能するために 2 種類のアクセス許可が必要です。

 **読み取りアクセス許可 (クラスター全体)**: Argo CD は以下のために、クラスター全体のすべてのリソースタイプとカスタムリソース定義 (CRD) を読み取ることができる必要があります。
+ リソース検出とヘルスチェック
+ 目的の状態と実際の状態の間のドリフトの検出
+ デプロイ前のリソースの検証

 **書き込みアクセス許可 (名前空間固有)**: Argo CD には、Application で定義されたリソースの作成、更新、削除のアクセス許可が必要です。
+ アプリケーションワークロード (デプロイ、サービス、ConfigMaps など) をデプロイする
+ カスタムリソースの適用 (アプリケーション固有の CRD)
+ アプリケーションのライフサイクルを管理する

### Quick Setup
<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: 読み取りアクセス用のクラスターロールを作成する** 

```
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 がアプリケーションをデプロイする名前空間ごとに、このロールバインド手順を繰り返します。

**重要**  
Argo CD は、特定の名前空間にのみデプロイする場合でも、ヘルスチェックと検出のためにクラスター全体のすべてのリソースタイプを読み取ることができる必要があります。クラスター全体の読み取りアクセスがないと、アプリケーションの状態をチェックするときに Argo CD にエラーが表示されます。

## Project でクラスターアクセスを制限する
<a name="_restrict_cluster_access_with_projects"></a>

プロジェクトを使用して、`spec.destinations` で許可されるターゲットクラスターと名前空間を設定することで、Application がデプロイできるクラスターと名前空間を制御します。

```
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) - Application を整理し、セキュリティ境界を確立する
+  [Application を作成する](argocd-create-application.md) - 最初のアプリケーションをデプロイする
+  [ApplicationSet を使用する](argocd-applicationsets.md) - ApplicationSet で複数のクラスターにデプロイする
+  [Argo CD に関する考慮事項](argocd-considerations.md) - マルチクラスターパターンとクロスアカウントセットアップ
+  [宣言型クラスターセットアップ](https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#clusters) - アップストリームクラスター設定リファレンス