Argo CDは、Gitに置かれた望ましい状態とKubernetesクラスタの状態を比較し、差分を同期するGitOpsツールです。今回は公式guestbookのApplicationを一つだけ作ります。
今回やること

Gitのguestbook → Argo CD Application → 学習用クラスタ → Synced / Healthy
前提: 自分のローカルminikubeなど、削除してよい学習用クラスタを使います。共有・本番クラスタでは実行しません。
Argo CDを導入する
現在のクラスタを確認してから、公式のgetting started手順で導入します。
kubectl config current-context
kubectl create namespace argocd
kubectl apply --server-side --force-conflicts -n argocd \
-f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl wait --for=condition=Ready pod --all \
-n argocd --timeout=300s
stable URLは学習用の簡略手順です。チーム環境では、変更内容を確認したリリース版のmanifestをGitで管理し、版を固定します。
Applicationを一つ作る
guestbook-application.yamlを作ります。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: default
source:
repoURL: https://github.com/argoproj/argocd-example-apps.git
targetRevision: HEAD
path: guestbook
destination:
server: https://kubernetes.default.svc
namespace: guestbook
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
kubectl apply -f guestbook-application.yaml
kubectl get application guestbook -n argocd
この例は学習用のためHEADを追います。本番ではレビュー済みのcommit SHAやtagへ固定し、予期しない変更が入らないようにします。
同期を確認する
Argo CDがGitを読み、guestbook namespaceへリソースを作るまで待ちます。
kubectl get application guestbook -n argocd --watch
SYNC STATUSがSynced、HEALTH STATUSがHealthyになったらCtrl + Cで止めます。詳細は次でも確認できます。
kubectl get application guestbook -n argocd \
-o jsonpath='{.status.sync.status}{" / "}{.status.health.status}'
kubectl get all -n guestbook
成功確認
- Applicationが
Syncedになる - Applicationが
Healthyになる - guestbook namespaceにDeployment、Service、Podが作られる
- GitのpathとクラスタのリソースがApplicationで結び付いている
自動同期を有効にしたため、手動のSyncボタンは押しません。Applicationを作った後、Argo CD自身が同期することを確認します。
よくあるつまずき
ApplicationがUnknownのまま
Argo CDのPodがReadyか、クラスタからGitHubへ接続できるかを確認します。
kubectl get pods -n argocd
kubectl describe application guestbook -n argocd
OutOfSyncが続く
ApplicationのEventsとConditionsを読み、manifestのエラーや権限不足を確認します。焦ってクラスタを直接直すとGitとの差分が残るため、原因となる定義を確認します。
練習
guestbook-application.yamlのsyncPolicy.automatedを一度コメントアウトした場合、作成直後の状態がどう変わるか予想してください。自動同期と手動同期の違いを説明できれば成功です。
後片付け
finalizerによりguestbook側も削除されることを確認します。
kubectl delete application guestbook -n argocd
kubectl get all -n guestbook
kubectl delete namespace guestbook
finalizerはApplicationが追跡するDeploymentやServiceを削除します。CreateNamespace=trueで作られたnamespaceは残る場合があるため、空になったことを確認してから明示的に削除します。
Applicationが消えた後、この学習で入れたArgo CD自体も不要なら削除します。
kubectl delete namespace argocd
共有クラスタではnamespaceを削除しません。ローカルクラスタ全体を消す場合はKubernetes入門の手順を使います。