しばらく業務で Docker/Kubernetes に触らせてもらってその中で CircleCI
や Heml
などの技術を学んできました。
そんな時次にぶつかった壁がArgo CDです。原因は圧倒的な日本語による解説記事の少なさです。
Qiita でも ArgoCD
のタグをつけられている記事は執筆現在23 記事です。少ない。。
この記事では
ArgoCD
とは何のためのツールかArgoCD
の理解の上で避けて通れないGitOps
とは何か
と言うことを初心者なりにざっくりですがまとめていきます。
ツッコミや補足などあれば是非コメントかTwitterまでよろしくお願いします!
ArgoCD って何なの?
https://argoproj.github.io/argo-cd/
Argo CD follows the GitOps pattern of using Git repositories as the source of truth for defining the desired application state
Argo CD は、GitOps のパターンに沿って、Git リポジトリを、望ましいアプリケーションの状態を定義するための真実のソースとして使用します。(訳: DeepL)
よくわかりません。 まず、GitOps って何やねん。。
GitOps って何なの?
こちらのスライド達がものすごく参考になります。 忙しい人のための GitOps 入門 Kubernete の運用を支える GitOps
僕はそもそも CI と CD の違いすらわかっていませんでした。
- CI = 自動テスト実行&ビルドしたものを Dockerimage などとしてアップロード
- CD = 自動的なアプリのデプロイ
となっており、役割が違うことがわかります。
このCI/CD をちゃんと分離したものとして扱おうねと言う目的のもとで GitOps が活きてきます。
普段私たちがアプリケーションのソースコードを Github などでバージョン管理するのと同様に、 GitOps ではKubernetes の manifest などをバージョン管理します。 そして、PR→ マージの流れでデプロイを自動で実行することになります。 (Helm の Chart などこちらに例として挙げられているようなもの達を管理します)
Deploy を kubectl で直接行うのではなく、全て git 経由で行うことにより、コードとして履歴を残し、後の不具合調査やロールバックが楽になります。
これを踏まえて ArgoCD って何なの?
Argo CD follows the GitOps pattern of using Git repositories as the source of truth for defining the desired application state
Argo CD は、GitOps のパターンに沿って、Git リポジトリを、望ましいアプリケーションの状態を定義するための真実のソースとして使用します。(訳: DeepL)
先ほどの文章です。 これは Helm で言うところの Chart などをソースコードとして Git リポジトリを利用して管理する。と言うことを示しています。
Argo CD は GitOps の運用を実際に行うためのツールと言うことになります。
実際に ArgoCD を使ってみる
ArgoCD の公式のチュートリアルを通して実際に何ができるのかを試してみます。 ArgoCD - Getting Started
Install Argo CD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
argocd
と言う namespace を作ります。そこに ArgoCD のリソースを install します。
Download Argo CD CLI
Argo CD CLI をダウンロードします。
brew tap argoproj/tap
brew install argoproj/tap/argocd
Access The Argo CD API Server
デフォルトでは Argo CD API server は external IP を持っていないらしいので argocd-server の service の Type を LoadBalancer に変更することで外からアクセス可能になります
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
kubectl get service -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-dex-server ClusterIP 10.106.159.0 <none> 5556/TCP,5557/TCP 26m
argocd-metrics ClusterIP 10.108.45.241 <none> 8082/TCP 26m
argocd-redis ClusterIP 10.101.223.24 <none> 6379/TCP 26m
argocd-repo-server ClusterIP 10.111.135.57 <none> 8081/TCP,8084/TCP 26m
argocd-server LoadBalancer 10.105.222.110 localhost 80:31720/TCP,443:31832/TCP 26m
argocd-server-metrics ClusterIP 10.105.63.99 <none> 8083/TCP 26m
argocd-server に localhost でアクセスできるようになりました
Login Using The CLI
ArgoCD にログインするための初期パスワードは Argo CD API server の pod 名です。
kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name
これで pod/argocd-server-hogehoge-hogehoge
と出てくると思うので argocd-server-hogehoge-hogehoge
がパスワードになります。
以下のコマンドでログインとパスワードの更新をします
argocd login argocd-server-hogehoge-hogehoge #ログイン
argocd account update-password #パスワード更新
Register A Cluster To Deploy Apps To (Optional)
クラスターの登録を行います。ArgoCD がデプロイされているクラスターにデプロイする際は飛ばしても良いそうです。
argocd cluster add CONTEXTNAME
context って何やねんと言う方は以下の記事が参考になると思います(ちなみに僕もふわっとしかわかってないです ← おい) [Kubernetes 入門] kubectl のアクセス先(コンテキスト)を切り替える方法
これで追加したクラスターに対して ArgoCD がデプロイや監視などを行えるようになります
Create An Application From A Git Repository
CLI と UI で作成する方法が紹介されていますが、UI の方で行きます
先ほどの service の Type の変更で externalIP が設定されているはずです。
kubectl get service -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-dex-server ClusterIP 10.106.159.0 <none> 5556/TCP,5557/TCP 26m
argocd-metrics ClusterIP 10.108.45.241 <none> 8082/TCP 26m
argocd-redis ClusterIP 10.101.223.24 <none> 6379/TCP 26m
argocd-repo-server ClusterIP 10.111.135.57 <none> 8081/TCP,8084/TCP 26m
argocd-server LoadBalancer 10.105.222.110 localhost 80:31720/TCP,443:31832/TCP 26m
argocd-server-metrics ClusterIP 10.105.63.99 <none> 8083/TCP 26m
http://localhost にアクセスします。 こちらから admin / 先ほど自分で設定した password でログインします
+NEW APP を押します
今回は ArgoCD が用意している以下のサンプルを利用します https://github.com/argoproj/argocd-example-apps
以下のように設定していき、CREATE を押します.
このようになれば成功です。
Sync (Deploy) The Application
作成後の UI の方の画像にも出ていましたが、OutOfSync と言うステータスになっています
$ argocd app get guestbook
Name: guestbook
Project: default
Server: https://kubernetes.default.svc
Namespace: default
URL: https://localhost/applications/guestbook
Repo: https://github.com/argoproj/argocd-example-apps.git
Target: HEAD
Path: guestbook
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: OutOfSync from HEAD (6bed858)
Health Status: Missing
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service default guestbook-ui OutOfSync Missing
apps Deployment default guestbook-ui OutOfSync Missing
アプリケーションはまだデプロイされておらず、Kubernetes リソースも作成されていないためです。
なので以下のコマンドでデプロイします
argocd app sync guestbook
UI の方で上手いこといっているか確認します
成功しました!
ここまでで ArgoCD のチュートリアルは終了です。
チュートリアルで使用した sample のリポジトリをみてみる
https://github.com/argoproj/argocd-example-apps/tree/master/guestbook こちらですね
kubernetes の標準的な manifest です。
実際に ArgoCD を導入して CD/CI を運用する際には
- git 管理されているアプリケーションのソースコードを更新し、テスト&ビルドしたものを Dockerimage などとしてアップロード(=CI)
- git 管理されている kubernetes の manifest の image のタグを更新し、Kubernetes リソースを更新(=CD)
と言う風に CI と CD を完全に分離できることになります
チュートリアルでできたものを色々いじってみる
せっかくなので少しいじってみましょう
この画面から guestbook-ui を選択して、適当に diff を作っています こんな感じで replica の数を 2 にしてみました。すると
このように 2 つに pod が増えているのがわかります。
また、このように履歴も残っていますね
こんな感じで UI から直接 Pod を増やしたりしてみましたが、実際はこういった変更を GitHub に PR を投げてマージされれば、CD が回り Kubernetes リソースを更新と言う流れになるのでしょう
終わりに
何となくですが GitOps、Argo CD について学べました。 理解が追いついていない部分もあるので精進したいと思います。
ツッコミや補足などあれば是非コメントかTwitterまでよろしくお願いします!