Argo CD は kustomize をサポートしているため,簡単に kustomize プロジェクトを GitOps 化できる.さっそく試していく!
検証環境
前回書いた記事で使った kustomize プロジェクトを使う. Namespace + Service + Deployment (nginx) という構成で,replicas
と images
を kustomize で変更している.詳しくは以下に置いてある.
Argo CD Application
今回は Argo CD v2.0.5+4c94d88 を使う.まずは GitHub リポジトリと紐付けるために Argo CD Application を作る.Argo CD の Web 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 プロジェクトと判別する.
実際に Argo CD の実装をザッと読むと,ドキュメントと同様に Tool Detection や kustomize build
コマンドを実行している感じだった.
適用後に kubectl
コマンドを実行すると Namespace と Service と Deployment が作られている.
$ 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 でもリソースを確認できる.
レプリカ数を強制的に変更してみる
意図しない操作として kustomization.yaml
に設定しているレプリカ数を 7
に変更してみる.一瞬 7 Pods になったけど,直後に Argo CD によって削除されていた.「自己回復 (Self-Healing)」も含めて GitOps を実現できている.Argo CD と kustomize の連携は簡単だった!
$ 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
今回はサンプルとして commonAnnotations
を使って Annotation を追加する.Argo CD Application の YAML は以下のようになり spec.source.kustomize
に commonAnnotations
を設定している.
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