Ritolabo
  1. Home
  2. Kubernetes
  3. ArgoCD
  4. Argo CD のインストールから Git の YAML を反映するまで

Argo CD のインストールから Git の YAML を反映するまで

  • 公開日
  • カテゴリ:ArgoCD
  • タグ:Kubernetes,ArgoCD,学習メモ
Argo CD のインストールから Git の YAML を反映するまで

Argo CD は、クラスタの中で動き、Git リポジトリにある YAML を Kubernetes に反映し続けるプログラム。(何をするものかは「Argo CD の概要と仕組み」を参照)

この記事では、Argo CD を手元のクラスタに入れ、GitHub に置いた Deployment の YAML を kubectl apply を打たずにクラスタに入れるところまでを確認する。

contents

  1. 今回作るもの
  2. Argo CD をインストールする
  3. 画面にログインする
  4. Git に Deployment の YAML を置く
  5. private リポジトリを Argo CD に登録する
    1. GitHub でトークンを作る
    2. Argo CD の画面に登録する
  6. Application を書く
  7. Sync する
  8. どこで何が動いているか
  9. 用語メモ
  10. 参考 URL

今回作るもの

上から順に作る。クラスタは kind(Docker の上に作る Kubernetes)で、Control Plane 1 つと Worker 2 つ。Argo CD は v3.5.5。

作るものどこにできるか
Argo CDクラスタの argocd namespace に Pod が 7 つ
GitHub の private リポジトリ argocd-studyGitHub。中身は web/deployment.yaml の 1 ファイル
Application webクラスタの argocd namespace のデータ

最後の Application を入れると、Argo CD が GitHub の web/deployment.yaml を読んで、default namespace に Deployment を作る。

Argo CD をインストールする

Argo CD は Kubernetes の一部ではなく、あとから入れるプログラム。公式が 1 ファイルにまとめた install.yaml を kubectl apply する。

$ kubectl create namespace argocd
# => namespace/argocd created

$ kubectl apply -n argocd --server-side --force-conflicts -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
  • -n argocd: install.yaml には namespace が書いていないので、ここで指定する。公式が argocd という名前を前提にしている(権限の設定にこの名前が書いてある)
  • --server-side --force-conflicts: 公式の Getting Started のとおりに付ける。install.yaml の中に、通常の apply では大きすぎて入らない定義(CRD)があるため

Pod が全部 Running になるまで待つ。

$ kubectl get pods -n argocd
NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          42s
argocd-applicationset-controller-66d7f7865d-ltblh   1/1     Running   0          42s
argocd-dex-server-6d8ddc4748-49nrf                  1/1     Running   0          42s
argocd-notifications-controller-6bdf867f45-pfd4v    1/1     Running   0          42s
argocd-redis-5fbd54c8cc-8jjhr                       1/1     Running   0          42s
argocd-repo-server-66875c66b4-4vkmv                 1/1     Running   0          42s
argocd-server-7f85776b5c-jfkjx                      1/1     Running   0          42s

Pod が 7 つ。どれも argocd namespace で動くプログラム。この記事で関わるのは 3 つ。

Pod何をするプログラムか
argocd-serverブラウザに画面を出す
argocd-repo-serverGitHub からファイルを取ってくる
argocd-application-controllerGit の内容とクラスタの中身を比べ、違っていれば apply する

Pod のほかに、新しい種類のデータが 3 つ書けるようになる。Argo CD が CRD(Custom Resource Definition。Kubernetes に新しい kind を追加する仕組み)で足したもの。

$ kubectl api-resources | grep argoproj
applications                        app,apps           argoproj.io/v1alpha1              true         Application
applicationsets                     appset,appsets     argoproj.io/v1alpha1              true         ApplicationSet
appprojects                         appproj,appprojs   argoproj.io/v1alpha1              true         AppProject

この記事で書くのは Application だけ。Deployment や Service と同じく、YAML を書いて kubectl apply すると etcd に保存されるデータ。

画面にログインする

画面を出しているのは argocd-server で、クラスタの中の Pod。手元のブラウザからそのままでは届かないので、kubectl port-forward でつなぐ。

kubectl port-forward は、手元の localhost:8080 への接続を、クラスタの中の Service argocd-server の 443 番に中継し続けるコマンド。打っているあいだだけ有効で、Ctrl+C で止まる。別のターミナルで打ちっぱなしにする。

$ kubectl port-forward svc/argocd-server -n argocd 8080:443
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

ブラウザで https://localhost:8080 を開く。argocd-server が自分で作った証明書(自己署名証明書)を使っているので、ブラウザが「この接続ではプライバシーが保護されません」のような警告を出す。手元のクラスタなので、「詳細設定」から進む。

Argo CD のログイン画面

ユーザー名は admin。パスワードは、Argo CD が最初の起動時にランダムに作って、argocd namespace の Secret argocd-initial-admin-secret に入れてある。Secret の値は base64 でエンコードされているので、base64 -d で戻す。

$ kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath='{.data.password}' | base64 -d; echo
# => (ランダムな文字列。これがパスワード)

ログインすると Applications の一覧画面が開く。まだ 1 つもない。

ログイン直後の Applications 画面。No applications available to you just yet と表示されている

画面から Application を作ることもできる(+ NEW APP)が、この記事では YAML を書いて kubectl apply する。画面で作ると、何を入れたかが手元のファイルに残らないため。

Git に Deployment の YAML を置く

Argo CD が読むのは GitHub にあるファイルで、手元のファイルは読まない。GitHub に private リポジトリ argocd-study を作り、web/deployment.yaml を 1 つ push する。

nginx を 1 つ動かす Deployment。namespace は書かない(どの namespace に入れるかは、あとで書く Application で決める)。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.27
          ports:
            - containerPort: 80

Argo CD はファイル 1 つではなく、ディレクトリ 1 つを読む。web というディレクトリに置いたのは、あとで Service や ConfigMap を同じディレクトリに足すため。

private リポジトリを Argo CD に登録する

private リポジトリなので、argocd-repo-server がそのまま取りに行くと GitHub に断られる。公式ドキュメント(Private Repositories)のとおり、ユーザー名と Personal Access Token を Argo CD に登録する。(Personal Access Token を使うのは学習用のため。公式ドキュメントには SSH 鍵や GitHub App での登録方法もある)

Personal Access Token は、GitHub がパスワードの代わりに発行する文字列。「どのリポジトリを」「何していいか(読むだけ、など)」を絞って作れる。

GitHub でトークンを作る

GitHub の Settings → Developer settings → Personal access tokens → Fine-grained tokens から作る。

項目値
Repository accessOnly select repositories → argocd-study
Repository permissions → ContentsRead-only

Argo CD がやるのは git fetch(ファイルを読む)だけなので、Contents の読み取りだけで足りる。生成されたトークンは 1 回しか表示されないので、コピーしておく。

Argo CD の画面に登録する

左のメニューの Settings → Repositories → + CONNECT REPO。

項目値
Choose your connection methodVIA HTTPS
Typegit
Projectdefault
Repository URLhttps://github.com/example-user/argocd-study.git
UsernameGitHub のユーザー名
Password上で作ったトークン

CONNECT を押すと、Argo CD がその場で GitHub につなぎに行く。一覧に argocd-study の行が出て、CONNECTION STATUS が Successful になれば登録できている。

画面から入れた URL・ユーザー名・トークンは、argocd namespace の Secret に保存される。

$ kubectl get secret -n argocd -l argocd.argoproj.io/secret-type=repository
NAME              TYPE     DATA   AGE
repo-xxxxxxxxxx   Opaque   5      1m

Application を書く

Application は「どの Git の、どのディレクトリを、どの namespace に入れるか」を書いたデータ。Argo CD の仕事の単位で、これを 1 つ apply すると Argo CD が仕事を始める。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: web
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example-user/argocd-study.git
    targetRevision: HEAD
    path: web
  destination:
    server: https://kubernetes.default.svc
    namespace: default
フィールド何を決めているか今回の値
spec.sourceどの Git の、どのブランチの、どのディレクトリを読むか上のリポジトリ。HEAD は既定のブランチの最新。web ディレクトリ
spec.destinationどのクラスタの、どの namespace に入れるかhttps://kubernetes.default.svc は「Argo CD 自身が動いているクラスタ」を指す決まった書き方。namespace は default
spec.projectApplication をまとめるグループArgo CD を入れた時点である default

metadata.namespace は argocd。Application は Argo CD が読むデータなので、Argo CD と同じ namespace に置く。Deployment ができる先の default ではない。

このファイルは GitHub には置かず、手元から apply する。

$ kubectl apply -f application.yaml
# => application.argoproj.io/web created

$ kubectl get applications -n argocd
NAME   SYNC STATUS   HEALTH STATUS
web    OutOfSync     Missing

apply の直後は SYNC STATUS が Unknown のことがある。数秒待ってもう一度打つと OutOfSync になる。

画面の Applications の一覧にも web が出る。クリックすると、Application web の右に、点線で deploy web がぶら下がった図になる。

Application web の画面。APP HEALTH が Missing、SYNC STATUS が OutOfSync で、Deployment が点線でつながっている
画面の表示意味今の状態
SYNC STATUS OutOfSyncGit の内容とクラスタの中身が違うGitHub には Deployment web があるが、クラスタにはまだない
APP HEALTH MissingGit に書いてあるものがクラスタにない同上

Argo CD は Application を読んだ時点で GitHub を取りに行き、Git とクラスタを比べた。比べただけで、まだ何も入れていない。この Application には「自動で入れてよい」と書いていないので(画面にも Auto sync is not enabled. とある)、人がボタンを押すまで待っている。

Sync する

Sync は、Git の内容をクラスタに反映すること。中身は kubectl apply 相当で、やるのは argocd-application-controller。

Application web の画面の上の SYNC → 右に出るパネルの SYNCHRONIZE を押す。押す前に、別のターミナルで default namespace の Pod を -w で見ておく。SYNCHRONIZE を押すと、kubectl apply を打っていないのに、default namespace に Pod が作られる。

$ kubectl get pods -n default -w
NAME                   READY   STATUS              RESTARTS   AGE
web-557577df75-5m5lr   0/1     Pending             0          0s
web-557577df75-5m5lr   0/1     ContainerCreating   0          0s
web-557577df75-5m5lr   1/1     Running             0          7s

Deployment と Application も見る。

$ kubectl get deployment,pods -n default
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/web   1/1     1            1           49s

NAME                       READY   STATUS    RESTARTS   AGE
pod/web-557577df75-5m5lr   1/1     Running   0          49s

$ kubectl get applications -n argocd
NAME   SYNC STATUS   HEALTH STATUS
web    Synced        Healthy

画面では、点線が実線になり、Deployment → ReplicaSet → Pod まで見える。

Sync 後の Application web の画面。APP HEALTH が Healthy、SYNC STATUS が Synced で、Deployment、ReplicaSet、Pod が実線でつながっている
画面の表示意味
SYNC STATUS SyncedGit の内容とクラスタの中身が一致している
APP HEALTH Healthy入れたものが正常に動いている。Deployment なら「replicas の数だけ Pod が新しい定義で揃っている」

Healthy になる前は、Pod が起動中のあいだ Progressing が出る。Application の Health は、入れたものの中でいちばん悪いものに合わせる。

どこで何が動いているか

ここまでで作ったものを、GitHub とクラスタの 2 つの場所と、その両方を操作する自分に分けて描く。角が二重の箱は動くプログラム(Pod)、それ以外は etcd に保存されたデータ。

図を描画しています…
  • 自分が kubectl apply したのは Application だけ。Deployment は argocd-application-controller が入れた
  • Deployment の中身は、自分で apply したときと同じ etcd のデータ。違うのは「誰が入れたか」だけ
  • namespace はマシンではなく、etcd のデータに付いた名前の区切り。Argo CD のデータは argocd、Git から入れた Deployment は default に分かれている
  • Pod は Node の上

用語メモ

用語読み方意味
Applicationアプリケーション「どの Git の、どのディレクトリを、どの namespace に入れるか」を書いたデータ。Argo CD の仕事の単位
SyncシンクGit の内容をクラスタに反映すること。kubectl apply 相当
SyncedシンクトGit の内容とクラスタの中身が一致している
OutOfSyncアウトオブシンクGit の内容とクラスタの中身が違う
Healthyヘルシー入れたものが正常に動いている
Progressingプログレッシング入れたものが起動中
MissingミッシングGit に書いてあるものがクラスタにない
Personal Access TokenパーソナルアクセストークンGitHub がパスワードの代わりに発行する文字列。対象のリポジトリと、できることを絞れる

まとめ

  • Argo CD は、公式の install.yaml を kubectl apply で入れる。argocd namespace に Pod が 7 つ作られ、Application という新しい種類のデータが書けるようになる
  • 画面は argocd-server が出す。kubectl port-forward で https://localhost:8080 につなぎ、admin と Secret argocd-initial-admin-secret のパスワードでログインする
  • private リポジトリは、画面の Settings / Repositories からユーザー名と Personal Access Token を登録する。登録した値は argocd namespace の Secret に保存される
  • Application の YAML に書くのは、どの Git のどのディレクトリを読むか(source)と、どのクラスタのどの namespace に入れるか(destination)。Argo CD と同じ argocd namespace に apply する
  • 画面の OutOfSync / Synced は「Git とクラスタが違う / 一致している」。Missing / Progressing / Healthy は「クラスタにない / 起動中 / 正常に動いている」
  • 自分で apply したのは Application だけで、Deployment は Sync のときに Argo CD が入れた

参考 URL


[Prev] Argo CD の概要と仕組み

Author

rito

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級