第1回: Argo CD、Operatorでのインストールと主要コンポーネントの解説

13 Apr 2021, 10:21 By mosuke5

Argo CD学習シリーズ

こんにちは、もーすけです。
前回の「Tekton学習シリーズ」に続きArgo CD学習シリーズをやっていきます。 わたしは、Argo CDを何年か前に検証で確認はしていたのですが、だいぶ忘れてしまったい、改めてまとめなおしたいと思っています。 初回は、インストールと概念編です。

GitOpsという考え方

Argo CDのはなしをする前に、GitOpsという考え方について理解しておく必要があります。 GitOpsとは、Kubernetesクラスタの管理やアプリケーションデプロイの手法のひとつで、Gitレポジトリを唯一信頼できる情報源(Single source of truth)と考え、クラスタ上の状態とGitレポジトリ上の差分を埋めるやりかたと認識すると良さそうです。

Kubernetesのコントローラの発想と非常に近しいかなと思います。 Kubernetesでは、API Serverの管理する期待する状態(マニフェスト)と、クラスタ上の実際の状態との差分をReconciliation loopが解消する、というのが大きなコンセプトです。そう考えると、Gitレポジトリを期待する状態とし、クラスタ上の実態との差分をGitOpsツール(Reconciliation loop)が解消すると置き換えて読むこともできますよね。

gitops

また、Kubernetesにおいてこの考え方が重要な理由は、ソースコードとそれが動く状態としたコンテナイメージ、そしてオーケストレーションとしてKubernetesマニフェストこれらの関係性にあると考えます。 コンテナイメージは、ソースコードとDockerfileから作ることができます。Kubernetesのマニフェストは、コンテナイメージとその他の設定記述で表すことができます。つまり、アプリケーション成果物としてのコンテナイメージと、それをどうコンフィギュレーションして動かすか(オーケストレーションするか)は切り離して考えることができるということです。

そして、Argo CDというツールはまさにGitOpsのためのツールであり、GitレポジトリのKubernetesマニフェストを監視し、定期的に(あるいは任意のタイミングで)クラスタに反映することをします。Kubernetesのコントローラみたいなもんですね。

Argo CDのインストール

では、インストールします。 最新版のArgo CDを利用したい場合は、公式ドキュメントの"Getting Started“でマニフェストをapplyしてください。非常に簡単です。

今回は、Argo CD Operatorを用いてインストールします。 理由としては、可能な限りツール類はOperatorで管理したほうがやっぱり楽かな?と試行錯誤している状態のため検証です。 みなさんは好きな方法でインストールしてください。 以下は、Argo CD Operatorに関する関連リンクです。

Argo CDを以下のマニフェストで起動しました。Web UIをIngress経由で公開したかったためIngressの設定を追加しています。

# argocd.yaml
---
apiVersion: argoproj.io/v1alpha1
kind: ArgoCD
metadata:
  name: my-argocd
spec:
  # 今回はIngress経由でArgo CDを外部から接続したいので以下設定を追加しているがなくてもよい
  server:
    host: argocd.mosuke.tech
    ingress:
      enabled: true
    insecure: true

上記のマニフェストを適応して、作成されたリソースを確認します。

$ kubectl apply -f argocd.yaml
argocd.argoproj.io/my-argocd created

$ kubectl get pod,sa,configmap,secret,service,ingress -n my-argocd-operator
NAME                                                    READY   STATUS    RESTARTS   AGE
pod/argocd-operator-cdb84b944-vxwln                     1/1     Running   0          24h
pod/my-argocd-application-controller-69dd7dcb84-ppfr7   1/1     Running   0          21h
pod/my-argocd-dex-server-5bfb9ccf95-sv4tr               1/1     Running   0          21h
pod/my-argocd-redis-55cc975d48-8vxsx                    1/1     Running   0          21h
pod/my-argocd-repo-server-65f45dd8c4-g88xv              1/1     Running   0          21h
pod/my-argocd-server-868d56f649-sgkqt                   1/1     Running   0          21h

NAME                                           SECRETS   AGE
serviceaccount/argocd-application-controller   1         24h
serviceaccount/argocd-dex-server               1         24h
serviceaccount/argocd-operator                 1         24h
serviceaccount/argocd-redis-ha                 1         24h
serviceaccount/argocd-server                   1         24h
serviceaccount/default                         1         24h

NAME                                  DATA   AGE
configmap/argocd-cm                   15     21h
configmap/argocd-operator-lock        0      24h
configmap/argocd-rbac-cm              3      21h
configmap/argocd-ssh-known-hosts-cm   1      21h
configmap/argocd-tls-certs-cm         0      21h
configmap/kube-root-ca.crt            1      24h
configmap/my-argocd-ca                1      21h

NAME                                               TYPE                                  DATA   AGE
secret/argocd-application-controller-token-t5scx   kubernetes.io/service-account-token   3      24h
secret/argocd-dex-server-token-z9rtk               kubernetes.io/service-account-token   3      24h
secret/argocd-operator-token-zmbdx                 kubernetes.io/service-account-token   3      24h
secret/argocd-redis-ha-token-fgzw8                 kubernetes.io/service-account-token   3      24h
secret/argocd-secret                               Opaque                                5      21h
secret/argocd-server-token-xrcpc                   kubernetes.io/service-account-token   3      24h
secret/default-token-7vtbf                         kubernetes.io/service-account-token   3      24h
secret/my-argocd-ca                                kubernetes.io/tls                     3      21h
secret/my-argocd-cluster                           Opaque                                1      21h
secret/my-argocd-tls                               kubernetes.io/tls                     2      21h

NAME                               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
service/argocd-operator-metrics    ClusterIP   10.7.255.82    <none>        8383/TCP,8686/TCP   24h
service/my-argocd-dex-server       ClusterIP   10.7.251.243   <none>        5556/TCP,5557/TCP   21h
service/my-argocd-metrics          ClusterIP   10.7.241.124   <none>        8082/TCP            21h
service/my-argocd-redis            ClusterIP   10.7.252.82    <none>        6379/TCP            21h
service/my-argocd-repo-server      ClusterIP   10.7.242.29    <none>        8081/TCP,8084/TCP   21h
service/my-argocd-server           ClusterIP   10.7.242.255   <none>        80/TCP,443/TCP      21h
service/my-argocd-server-metrics   ClusterIP   10.7.255.83    <none>        8083/TCP            21h

NAME                                  CLASS    HOSTS                ADDRESS        PORTS     AGE
ingress.extensions/my-argocd-server   <none>   argocd.mosuke.tech   34.84.159.22   80, 443   21h

Argo CDの主要コンポーネント

Argo CDをインストールすると、以下の6種類のPodが起動していました。 それぞれどんな役割をになっているか説明します。

コンポーネント 説明
argocd-operator OperatorHubからインストールした場合のみ作成されます。Argo CD自身を構築するためのリソースを管理するカスタムコントローラ。
application-controller Argo CDに登録するアプリケーションを管理するコントローラ。Gitレポジトリ内のあるべき状態とクラスタ上のアプリケーションの状態を定期的に確認し差分を埋める役割。Argo CDのコアと理解しても良い存在。
dex-server dexは、OpenID Connectのプロバイダを提供するソフトウェアのこと。Argo CDでの認証部分の役割をになう。
redis データのキャッシュとして利用。データはロストしても問題なし。
repo-server Gitレポジトリのキャッシュを管理する役割。こちらもデータを失っても問題ない。
server Web UIやCLIなどから利用するgRPC/REST APIを提供するAPI Server。

Web UIへの接続

管理者の初期パスワードは、Secret内に保存されているのでとりだしましょう。

$ kubectl -n my-argocd-operator get secret my-argocd-cluster -o jsonpath='{.data.admin\.password}' | base64 -d
<your-admin-password>

Ingress経由でアクセスすると以下のような画面にたどりつけます。
もし、Ingress等で公開しない人は、port-forwardを利用してください。うえの例でいうとservice/my-argocd-serverにアクセスできればWeb UIにたどり着けます。 kubectl port-foward service/my-argocd-server 8080:80 と実行すればローカルPCの8080ポートから接続できます。

argocd-login

アプリケーションの登録

Argo CDでサンプルのレポジトリも用意されているので、それを活用してアプリケーションをデプロイしてみます。やり方自体は、公式ドキュメントの “Getting Started“とおりなのでそちらを参照いただくとして、それぞれの設定項目などを解説します。

  • GENERAL
    • Application Name
      • 任意の名前です。hello-worldとします
    • Project
      • Argo CD内のプロジェクトです。はじめは default しかないはずなのでこちらを選択します。
    • SYNC POLICY
      • ManualAutomaticを選択できます。
      • 「SYNC」とは、Gitレポジトリのマニフェストの内容をクラスタに反映する動作のことを指します。
      • Automatic を選択すると180秒に一度SYNCを行います。
    • SYNC OPTIONS
  • SOURCE
    • Repository URL
      • 名前の通り、マニフェストファイルがおいてあるレポジトリを指定する
      • プライベートのレポジトリを利用する場合は、別でレポジトリ登録が必要(ドキュメント
    • Revision
      • 利用するGitレポジトリのリビジョン。ブランチなどを指定可能。
      • 本番環境、テスト環境など分けるときなどに有効
    • Path
      • 利用するマニフェストへのパス
  • DESTINATION
    • Cluster URL
      • どこのKubernetesクラスタへデプロイするの設定。
      • Argo CDが起動していない外部のクラスタも指定可能。
      • 内部クラスタを指定する場合は、NAME=in-clusterとするといい
      • クラスタ設定は別に可能
    • Namepace
      • デプロイしたいNamespace
  • Directory, Helm, Kustomize…
    • 最後の項目はデプロイするマニフェストに何を利用しているかによって変わる。
    • プレーンのマニフェストも利用できるが、テンプレートエンジンであるHelmやKustomizeを使ったマニフェストもデプロイ可能

こちらのアプリケーションの登録をすると、そのデータはKubernetesのリソースとして登録されています。 つまり、Argo CD自身は、永続的なボリュームをもっておらず、永続ボリュームとしてKubernetesのetcdを使っているということです。まさに、Kubernetes Nativeなアプリケーションを代表していますね。

$ kubectl get application -n my-argocd-operator
NAME          AGE
hello-world   44s

$ kubectl get application -n my-argocd-operator hello-world -o yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  creationTimestamp: "2021-04-14T09:05:14Z"
  generation: 2
  managedFields:
  - apiVersion: argoproj.io/v1alpha1
    fieldsType: FieldsV1
    fieldsV1:
      f:spec:
...

さいごに

うまくArgo CDを使って、アプリケーションをデプロイできましたでしょうか。 触ってみるとわかるかもしれませんが、意外とシンプルなソフトウェアですよね。Gitレポジトリの状態をKubernetesのコントローラ的に監視をして反映するということです。 Argo CDがうまく組み込まれた環境では、「デプロイ作業」というのをそれほど気にしなくていいとも言えますね。もちろん、デプロイ後のテストをどうするの?とかいろいろ疑問が湧いてくると思いますが、そのあたりは、また別の回で解説していきたいと思います。


Argo CD学習シリーズ

記事へのフィードバック

本記事に対して、フィードバックあればこちらのフォームからご記入ください。フォードバックしてみる

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