ArgoCDことはじめ(minikubeでチュートリアルやってみた)


この記事はPlayground Advent Calendar 2019の12/1の記事です。
こんにちは。にっし〜です。
ここではGitOpsのCDツールであるArgoCDの概要と始め方について書きます。
実際の業務で使う際の諸々については@zoetro さんのこちらの記事をご覧ください。

もくじ

  • ArgoCDを触ったきっかけ
  • そもそもArgoCDって何さ??
  • チュートリアルをminikubeでやってみた
  • まとめ
  • 参考URL

きっかけ

夏インターン(時期的には秋でしたが...w)でリクルートライフスタイルさんにお世話になっていた際に、メンターさんがこのツールをプロジェクトに導入して整備していたことがきっかけでArgoCDを触ることになりました。
もともと軽くK8sに触れていたのでそこまでキャッチアップには詰まりませんでしたが、そんなに日本語ドキュメントが多くはない気がしたのでここで書きます。(ガチプロじゃないのでそんなに詳しく書けないかもしれませんが精進します)

そもそもArgoCDって何さ??

ArgoCDはKubernetes上のアプリケーションのCD(継続的デリバリー)を実現するためのツールです。
マスコットキャラクターがこちら↓↓なのですが、明らかにタコさんウインナーですね笑

全体のアーキテクチャーは公式が出している以下の図を見ていただければと思います

アプリケーションレイヤーのPRがmergeされるとCIによってビルドされ、 webhookされることでそのイメージがコンテナリポジトリに登録されます。

また、K8sのマニフェストファイル(アプリケーションをデプロイするための各種リソースの設定)をGitリポジトリにPushすると、 Argo CDはそれらを各Kubernetesクラスタに適用してくれます。

GitOps良いですね〜!!

ただ、ArgoCDの良さはまだあります。
ArgoCDは実行中のアプリケーションを継続的に監視し、現在のアプリケーションの状態を目的の状態(Gitリポジトリで指定されていると比較してくれます。そして、2者間の違いを視覚化し、アプリケーションの状態を目的のターゲット状態に自動的または手動で同期する機能を提供します。

何が言いたいかというと、ArgoCDの提供してくれるUI上で試しに
- podの数を増やしたり
- policy設定(アクセス権限)をいじったり
- その他色々
をしても、Gitリポジトリをsyncするだけで綺麗に元どおりにできます。環境をぶち壊して元に戻せなくなった...ということがないので安心ですね。

(当たり前ですが、手動syncの場合です。自動syncをonにしているとUI上でyamlを書き換えた段階で差分が検出されてGitリポジトリの内容で書き換えられてしまいます)

それでは最後に実際にどうやってArgoCDの環境を構築するのかを見ていきます。

チュートリアルをminikubeでやってみた

環境
minikube: v1.1.1

まずはDockerを立ち上げて、minikubeを起動します。minikubeの導入・使い方は説明を省きます。
こちらを参考にして導入すれば躓く事はないと思います
cluster nameは設定せずに起動します。

minikube start

statusを確認して以下のようになっていれば起動完了です。

起動できたら、argocd用のnamespaceを切って、設定用のmanifestをminikubeで用意したclusterにapplyします。

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

kubectl get pod -n argocdで状態が以下のようになっていることを確認してください。

それでは次にArgoCDのUI環境を構築していきます。
まずはbrewでCLIをダウンロードします。

brew tap argoproj/tap
brew install argoproj/tap/argocd

次に、デフォルトでArgoCDは外部IPから接続できないようになっているので、ここではPort Forwardingしてローカルから接続できるようにします。
Port Forwardingなんぞや??って人はこの辺見ると良いと思います。

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

これで8080番でローカルから接続できるようになりました。

次に、初期パスワードを変更するためにCLIにログインをします。
ArgoCDでは初期パスワードがArgo CD API serverのpod nameで設定されています。
そのままでも良いのですが、新しいパスワードに変更しましょう。

初期パスワードを取得します。(今回は自分の場合はargocd-server-77cb9df44-srp6sです)

kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2

初期パスワードを使ってログインします。Usernameはadminです。

argocd login localhost:8080

次のコマンドでパスワード再設定をします。

argocd account update-password

こんな感じになればOKです。

最後に、UI画面からアプリケーションの構築をしていきます。
まずは http://localhost:8080 にアクセスしてください。
Usernameはadmin、Passwordは先ほど設定したものを使用してください。

ログインできたら本題のApplication構築の前に、Gitリポジトリと接続しましょう。左側のメニューの歯車マークのところからRepositoriesにとんでください。

今回は公式が用意しているサンプルリポジトリを使用します。
Repository URLにhttps://github.com/argoproj/argocd-example-apps.gitを記入してください。optionalのところは空欄にしておきます。

接続ができると以下のようになります。

右側の縦書き三点リーダーボタンを押すとCreate applicationメニューが出てくると思うので、そこからアプリケーションを構築していきます。

設定項目は色々あります。yamlで書くこともできますが、初回設定はポチポチして設定して、生成されたyamlを保存しておくのが良いと思います。

今回は
- Application name:sample
- Project:default
- SYNC POLICY:Manual
- Repository URL:自動入力されているはずです
- Revision:HEAD
- Path:kustomize-guestbook
- Cluster:https://kubernetes.default.svc
- Namespace:default
で設定します。(kustomizeの設定は省略します)

すると、Applicationが構築されます。

SYNC POLICYをManualにしているのでOutOf Syncになってますね。
SYNCボタンを押して、同期します。

少し待つとこのように同期されてStatusがHealthyになります。

この状態を維持するために、SYNC POLICYをAutomaticにしましょう。
APP DETAILSボタンから設定の変更ができます。

ENABLE AUTO-SYNCボタンを押して差分を自動で検出して同期するようにします。
Prune ResourcesとSelf HealもENABLEにしておきましょう。
それぞれ、更新によっていらなくなったリソースの削除、何らかの理由でアプリケーションが落ちた時に自動で同期して再構築をしてくれます。

まとめ

ArgoCDの概要の紹介と初回構築の手順をさらってみました。
さらに詳しい機能の説明は公式ドキュメントから見れるほか、ArgoCD自体はGoで実装されたOSSなので(リポジトリ)コードベースで仕様を追うこともできます。
ぜひ使ってみてください!!

参考URL

・公式ドキュメント
https://argoproj.github.io/argo-cd/

・公式リポジトリ
https://github.com/argoproj/argo-cd/

・Argo CDによる継続的デリバリーのベストプラクティスとその実装(Cybozu Inside Out)
https://blog.cybozu.io/entry/2019/11/21/100000