🐙

ArgoCDでApplicationをmanifestで管理する

2023/04/26に公開

目標

App Of Appsを適用して3つのApplicationをmanifestで管理する。

  1. app of apps
  2. apache
  3. nginx

App Of Appsとは

複数のApplicationを管理する親のApplicationを作成する構成です。

こちらの記事にメリデメがわかりやすくまとめられていました。
https://dev.classmethod.jp/articles/argocd-app-of-apps-pattern/
https://argo-cd.readthedocs.io/en/stable/operator-manual/cluster-bootstrapping/

リポジトリ構成

リポジトリ構成
root
├ argocd
  └ app-of-apps.yaml #親Application
├ httpd
  └ httpd.yaml #リソース(Namespace/Deployment/Service)
├ installs
  └ httpd.yaml #子Application
  └ nginx.yaml #子Application
├ nginx
  └ nginx.yaml #リソース Namespace/Deployment/Service

親Application

app-of-apps.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: app-of-apps
  namespace: argocd
spec:
  destination:
    namespace: argocd
    server: https://kubernetes.default.svc
  project: default
  source:
    path: installs #子Applicationのmanifestがあるディレクトリを指定する
    repoURL: https://github.com/xxx/argocd-sample-app.git
    targetRevision: main
  syncPolicy:
    automated: {}

子Application

apache

httpd.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: httpd
spec:
  destination:
    namespace: defalut
    server: https://kubernetes.default.svc
  project: default
  source:
    path: httpd
    repoURL: https://github.com/xxx/argocd-sample-app.git
    targetRevision: main
  syncPolicy:
    automated: {}

nginx

nginx.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: nginx
spec:
  destination:
    namespace: defalut
    server: https://kubernetes.default.svc
  project: default
  source:
    path: nginx
    repoURL: https://github.com/xxx/argocd-sample-app.git
    targetRevision: main
  syncPolicy:
    automated: {}

リソース Namespace/Deployment/Service

apache

httpd.yaml
kind: Namespace
apiVersion: v1
metadata:
  name: httpd
  labels:
    name: httpd
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd
  namespace: httpd
spec:
  replicas: 4
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: httpd
        image: httpd:2.4
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: httpd
  namespace: httpd
  labels:
    app: httpd
spec:
  ports:
  - port: 80
  selector:
    app: httpd

nginx

nginx.yaml
kind: Namespace
apiVersion: v1
metadata:
  name: nginx
  labels:
    name: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 4
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: nginx
  labels:
    app: nginx-app
    name: nginx
spec:
  type: NodePort
  ports:
  - name: nginx-port
    port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: nginx

デプロイ

親Applicationのapp-of-apps.yamlをデプロイするだけでOKです。

>> argocd/
kubectl apply -f app-of-apps.yaml

アプリケーションがデプロイできました。

小アプリケーションのリソースが期待値通りか確認します。

apache

期待値通りです。

nginx

期待値通りです。

子Applicationを追加する場合の手順

  1. 子Applicationのディレクトリ作成&manifestファイル作成
  2. /installsに新規ファイル作成&Applicationを定義
  3. Githubリポジトリにpushする ※spec.syncPolicyautomatedにしていれば自動でArgoCDがデプロイしてくれる

Discussion