kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Argo CD で kustomize プロジェクトを GitOps 化する

Argo CDkustomize をサポートしているため,簡単に kustomize プロジェクトを GitOps 化できる.さっそく試していく!

argo-cd.readthedocs.io

検証環境

前回書いた記事で使った kustomize プロジェクトを使う. Namespace + Service + Deployment (nginx) という構成で,replicasimageskustomize で変更している.詳しくは以下に置いてある.

github.com

Argo CD Application

今回は Argo CD v2.0.5+4c94d88 を使う.まずは GitHub リポジトリと紐付けるために Argo CD Application を作る.Argo CDWeb UI を使っても作れるし,argocd app create コマンドを使っても作れるけど,今回はマニフェストで宣言をする.以下のように application.yaml を作った.ポイントは大きく2点ある.

  • spec.source.path : overlays/dev など kustomize で作る環境ディレクトリを指定する
  • spec.syncPolicy : automated.selfHeal: true を指定して「自動同期」「自己回復 (Self-Healing)」を有効化する
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sandbox-kustomize-argocd
  namespace: argocd
spec:
  destination:
    namespace: kakakakakku-dev
    server: https://kubernetes.default.svc
  project: default
  source:
    repoURL: https://github.com/kakakakakku/sandbox-kustomize.git
    path: overlays/dev
    targetRevision: HEAD
  syncPolicy:
    automated:
      selfHeal: true

リソース確認

次に application.yaml を適用すると,Argo CD によって自動的にリソースが作られる.なお,Argo CD には Tool Detection という機能があり自動的にプロジェクトを判別する.具体的には kustomization.yaml / kustomization.yml / Kustomization ファイルを発見した場合に kustomize プロジェクトと判別する.

argoproj.github.io

実際に Argo CD の実装をザッと読むと,ドキュメントと同様に Tool Detectionkustomize build コマンドを実行している感じだった.

github.com

適用後に kubectl コマンドを実行すると NamespaceServiceDeployment が作られている.

$ kubectl get namespaces kakakakakku-dev
NAME              STATUS   AGE
kakakakakku-dev   Active   3m30s

$ kubectl get services -n kakakakakku-dev kakakakakku-dev-nginx
NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kakakakakku-dev-nginx   ClusterIP   10.98.69.104   <none>        80/TCP    3m40s

$ kubectl get deployments -n kakakakakku-dev kakakakakku-dev-nginx
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
kakakakakku-dev-nginx   5/5     5            5           4m20s

Web UI でもリソースを確認できる.

f:id:kakku22:20210819170100p:plain

f:id:kakku22:20210819170414p:plain

レプリカ数を強制的に変更してみる

意図しない操作として kustomization.yaml に設定しているレプリカ数を 7 に変更してみる.一瞬 7 Pods になったけど,直後に Argo CD によって削除されていた.「自己回復 (Self-Healing)」も含めて GitOps を実現できている.Argo CDkustomize の連携は簡単だった!

$ kustomize build overlays/dev | kubectl apply -f -

$ kubectl get pods -n kakakakakku-dev
NAME                                     READY   STATUS    RESTARTS   AGE
kakakakakku-dev-nginx-7c7bbd5d59-2tgww   2/2     Running   0          5s
kakakakakku-dev-nginx-7c7bbd5d59-8rfsj   2/2     Running   0          8m30s
kakakakakku-dev-nginx-7c7bbd5d59-cq4vt   2/2     Running   0          5s
kakakakakku-dev-nginx-7c7bbd5d59-dptvl   2/2     Running   0          8m30s
kakakakakku-dev-nginx-7c7bbd5d59-mb5xs   2/2     Running   0          8m30s
kakakakakku-dev-nginx-7c7bbd5d59-p6w9n   2/2     Running   0          8m30s
kakakakakku-dev-nginx-7c7bbd5d59-wqpm8   2/2     Running   0          8m30s

$ kubectl get pods -n kakakakakku-dev
NAME                                     READY   STATUS    RESTARTS   AGE
kakakakakku-dev-nginx-7c7bbd5d59-8rfsj   2/2     Running   0          8m50s
kakakakakku-dev-nginx-7c7bbd5d59-dptvl   2/2     Running   0          8m50s
kakakakakku-dev-nginx-7c7bbd5d59-mb5xs   2/2     Running   0          8m50s
kakakakakku-dev-nginx-7c7bbd5d59-p6w9n   2/2     Running   0          8m50s
kakakakakku-dev-nginx-7c7bbd5d59-wqpm8   2/2     Running   0          8m50s

Argo CD 側で kustomize の設定を変更する

ドキュメントを読んでいたら Argo CD は以下の kustomize 設定をサポートしていると書いてあったけど,ドキュメントを読むだけでは正直よくわからなかった.試した結果,正しく表現するなら Argo CD Application の設定で一部の kustomize 設定を変更できるという意味だった.

  • namePrefix
  • nameSuffix
  • images
  • commonLabels
  • commonAnnotations

f:id:kakku22:20210830121332p:plain

今回はサンプルとして commonAnnotations を使って Annotation を追加する.Argo CD Application の YAML は以下のようになり spec.source.kustomizecommonAnnotations を設定している.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sandbox-kustomize-argocd
  namespace: argocd
spec:
  destination:
    namespace: kakakakakku-dev
    server: https://kubernetes.default.svc
  project: default
  source:
    repoURL: https://github.com/kakakakakku/sandbox-kustomize.git
    path: overlays/dev
    targetRevision: HEAD
    kustomize:
      commonAnnotations:
        my-key: my-value
  syncPolicy:
    automated:
      selfHeal: true

Argo CD Application を更新する前後の Annotation は以下のようになった.ちゃんと my-key: my-value が追加されている.どういうときに使うと便利なのか今のところは思い付かないけど,kustomize の一部設定を kustomization.yaml ではなく Argo CD Application で管理したいときに使えそう!

$ kubectl describe pod -n kakakakakku-dev | grep Annotations
Annotations:  <none>
Annotations:  <none>
Annotations:  <none>
Annotations:  <none>
Annotations:  <none>

$ kubectl describe pod -n kakakakakku-dev | grep Annotations
Annotations:  my-key: my-value
Annotations:  my-key: my-value
Annotations:  my-key: my-value
Annotations:  my-key: my-value
Annotations:  my-key: my-value