

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

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

# ApplicationSet を使用する
<a name="argocd-applicationsets"></a>

ApplicationSet によりテンプレートから複数の Application が生成されるため、単一のリソース定義で複数のクラスター、環境、または名前空間に同じアプリケーションをデプロイできます。

## 前提条件
<a name="_prerequisites"></a>
+ EKS クラスターに Argo CD 機能が作成されていること
+ リポジトリアクセスが設定されていること (「[リポジトリアクセスを設定する](argocd-configure-repositories.md)」を参照)
+  クラスターと通信できるように `kubectl` が設定されていること

**注記**  
ApplicationSet には複数のターゲットクラスターは必要ありません。クラスタージェネレーター以外のジェネレーター (リスト、git、マトリックスジェネレーターなど) を使用して、リモートクラスターなしでアプリケーションをデプロイできます。

## ApplicationSet の仕組み
<a name="_how_applicationsets_work"></a>

ApplicationSet は、ジェネレーターを使用してパラメータを生成し、生成したパラメータを Application テンプレートに適用します。生成したパラメータのセットごとに Application が 1 つ作成されます。

EKS のデプロイによく使用されるジェネレーター:
+  **リストジェネレーター** - 環境ごとにクラスターとパラメータを明示的に定義します。
+  **クラスタージェネレーター** - 登録されたすべてのクラスターに自動的にデプロイします。
+  **Git ジェネレーター** - リポジトリ構造から Application を生成します。
+  **マトリックスジェネレーター** - 多次元デプロイ用にいくつかジェネレーターを組み合わせます。
+  **マージジェネレーター** – 複数のジェネレーターからのパラメータをマージします。

ジェネレーターの詳細なリファレンスについては、「[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` の 3 つの Application が作成されます。

## クラスタージェネレーター
<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
```

これにより、登録済みのクラスターごとに Application が自動的に作成されます。

 **クラスターをフィルタリングする**:

`matchLabels` を使用して特定のクラスターを含めるか、`matchExpressions` を使用してクラスターを除外します。

```
spec:
  generators:
  - clusters:
      selector:
        matchLabels:
          environment: production
        matchExpressions:
        - key: skip-appset
          operator: DoesNotExist
```

## Git ジェネレーター
<a name="_git_generators"></a>

Git ジェネレーターは、リポジトリ構造に基づいて Application を作成します。
+  **ディレクトリジェネレーター** - 各ディレクトリを個別の Application としてデプロイします (マイクロサービスに有用です)。
+  **ファイルジェネレーター** - パラメータファイルから Application を生成します (マルチテナントデプロイに有用です)。

 **例: マイクロサービスのデプロイ** 

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: microservices
  namespace: argocd
spec:
  generators:
  - git:
      repoURL: https://github.com/example/microservices
      revision: HEAD
      directories:
      - path: services/*
  template:
    metadata:
      name: '{{path.basename}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/microservices
        targetRevision: HEAD
        path: '{{path}}'
      destination:
        name: my-cluster
        namespace: '{{path.basename}}'
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
        syncOptions:
        - CreateNamespace=true
```

Git ジェネレーターとファイルベースの設定の詳細については、Argo CD ドキュメントの「[Git ジェネレーター](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators-Git/)」を参照してください。

## マトリックスジェネレーター
<a name="_matrix_generator"></a>

複数のジェネレーターを組み合わせて、複数のディメンション (環境 × クラスター) にデプロイします。

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: multi-env-multi-cluster
  namespace: argocd
spec:
  generators:
  - matrix:
      generators:
      - list:
          elements:
          - environment: dev
          - environment: staging
          - environment: prod
      - clusters:
          selector:
            matchLabels:
              region: us-west-2
  template:
    metadata:
      name: 'app-{{environment}}-{{name}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/app
        targetRevision: HEAD
        path: 'overlays/{{environment}}'
      destination:
        name: '{{name}}'
        namespace: 'app-{{environment}}'
```

ジェネレーターを組み合わせる方法の詳細については、Argo CD ドキュメントの「[マトリックスジェネレーター](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators-Matrix/)」を参照してください。

## マルチリージョンデプロイ
<a name="_multi_region_deployment"></a>

複数のリージョンでクラスターにデプロイします。

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: global-app
  namespace: argocd
spec:
  generators:
  - list:
      elements:
      - clusterName: prod-us-west
        region: us-west-2
      - clusterName: prod-us-east
        region: us-east-1
      - clusterName: prod-eu-west
        region: eu-west-1
  template:
    metadata:
      name: 'app-{{region}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/app
        targetRevision: HEAD
        path: kubernetes
        helm:
          parameters:
          - name: region
            value: '{{region}}'
      destination:
        name: '{{clusterName}}'
        namespace: app
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
```

## ApplicationSet を管理する
<a name="_manage_applicationsets"></a>

 **ApplicationSet と生成された Application を表示する**:

```
kubectl get applicationsets -n argocd
kubectl get applications -n argocd -l argocd.argoproj.io/application-set-name=<applicationset-name>
```

 **ApplicationSet を更新する**:

ApplicationSet の仕様を変更して再適用します。Argo CD は、生成したすべての Application を自動的に更新します。

```
kubectl apply -f applicationset.yaml
```

 **ApplicationSet を削除する**:

```
kubectl delete applicationset <name> -n argocd
```

**警告**  
ApplicationSet を削除すると、生成されたすべての Application も削除されます。削除対象の Application に `prune: true` がある場合、そのリソースもターゲットクラスターから削除されます。  
ApplicationSet を削除するときにデプロイされたリソースを保持するには、ApplicationSet 仕様で `.syncPolicy.preserveResourcesOnDeletion` を `true` に設定します。詳細は、Argo CD ドキュメントの「[Application Pruning & Resource Deletion](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Application-Deletion/)」を参照してください。

**重要**  
Argo CD の ApplicationSet 機能には、ApplicationSet を使用する前に注意すべきセキュリティ上の考慮事項があります。詳細は、Argo CD ドキュメントの「[ApplicationSet Security](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Security/)」を参照してください。

## その他のリソース
<a name="_additional_resources"></a>
+  [Argo CD プロジェクトを操作する](argocd-projects.md) - Project で ApplicationSet を整理する
+  [Application を作成する](argocd-create-application.md) - Application 設定を理解する
+  [ApplicationSet ドキュメント](https://argo-cd.readthedocs.io/en/stable/user-guide/application-set/) - ジェネレーターの詳細なリファレンスとパターン
+  [ジェネレーターのリファレンス](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators/) - ジェネレーターの詳細な仕様