初心者がざっくり学ぶGitOpsとかArgoCDって何なの?

April 03, 2020

しばらく業務で Docker/Kubernetes に触らせてもらってその中で CircleCIHeml などの技術を学んできました。

そんな時次にぶつかった壁が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 にアクセスします。 スクリーンショット 2020-04-03 21.34.12.png こちらから admin / 先ほど自分で設定した password でログインします

スクリーンショット 2020-04-03 21.34.25.png +NEW APP を押します

今回は ArgoCD が用意している以下のサンプルを利用します https://github.com/argoproj/argocd-example-apps

以下のように設定していき、CREATE を押します. スクリーンショット 2020-04-03 21.35.08.png スクリーンショット 2020-04-03 21.36.41.png スクリーンショット 2020-04-03 21.37.05.png

このようになれば成功です。 スクリーンショット 2020-04-03 21.38.44.png

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 の方で上手いこといっているか確認します

スクリーンショット 2020-04-03 21.48.05.png

スクリーンショット 2020-04-03 21.48.19.png

成功しました!

ここまでで 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 を完全に分離できることになります

チュートリアルでできたものを色々いじってみる

せっかくなので少しいじってみましょう

スクリーンショット 2020-04-03 21.57.52.png

この画面から guestbook-ui を選択して、適当に diff を作っています スクリーンショット 2020-04-03 22.02.01.png こんな感じで replica の数を 2 にしてみました。すると

スクリーンショット 2020-04-03 22.05.52.png このように 2 つに pod が増えているのがわかります。

スクリーンショット 2020-04-03 22.20.44.png また、このように履歴も残っていますね

こんな感じで UI から直接 Pod を増やしたりしてみましたが、実際はこういった変更を GitHub に PR を投げてマージされれば、CD が回り Kubernetes リソースを更新と言う流れになるのでしょう

終わりに

何となくですが GitOps、Argo CD について学べました。 理解が追いついていない部分もあるので精進したいと思います。

ツッコミや補足などあれば是非コメントかTwitterまでよろしくお願いします!

このエントリーをはてなブックマークに追加