Kubernetes クラスタに Argo CD をインストールして Git リポジトリの Manifest に加えた変更が同期されるようにする

kubernetes

Argo CD は Kubernetes 用の CD ツール。

CRD や Controller などをインストールする。

$ kubectl create namespace argocd
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
...
service/argocd-server-metrics created
deployment.apps/argocd-applicationset-controller created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-notifications-controller created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created
statefulset.apps/argocd-application-controller created
...

CLI をインストールして、admin のパスワードを取得してログインする。

$ brew install argocd
$ ADMIN_PASSWORD=$(argocd admin initial-password -n argocd)
$ echo $ADMIN_PASSWORD

$ argocd login localhost:8080 --username admin --password $ADMIN_PASSWORD --insecure

サンプルアプリケーションを作成する。

$ argocd app create guestbook \
  --repo https://github.com/argoproj/argocd-example-apps.git \
  --path guestbook --dest-server https://kubernetes.default.svc \
  --dest-namespace default
application 'guestbook' created

$ kubectl get -n argocd application
NAME        SYNC STATUS   HEALTH STATUS
guestbook   OutOfSync     Missing

UI 上でも確認できる。

$ kubectl port-forward svc/argocd-server -n argocd 8080:443

まだ sync されていないので apply される manifest が diff として表示される。

sync すると Pod が立ち上がる。

今度は Application リソースで Auto sync を有効にしてアプリケーションを追加してみる。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/sambaiz/argocd-example-apps.git
    targetRevision: HEAD
    path: guestbook
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

リポジトリに manifest を追加して push すると自動で sync が走る。argocd.argoproj.io/sync-wave annotation で順序を制御できる。 prune によってリポジトリから削除した manifest はクラスタからも削除され、selfHeal によって手動でクラスタに加えた変更は元に戻る。

argocd-notifications-secret Secret に token などを格納して、argocd-notifications-cm ConfigMap の notifications や Application に notifications.argoproj.io/subscribe.(trigger).(service): (recipients) annotation を設定するとトリガーの発火時に通知が飛ぶ

metadata:
  annotations:
    notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my-channel1;my-channel2