GitHubで承認されたyamlからArgoCDで自動デプロイする

ArgoCDの初歩 GitHub上のyamlからアプリケーションをデプロイするでArgoCDの機能が試せたので、GitHub上で承認されたyamlをKubernetes上のマニフェストに自動反映してみます。

今回は実際の運用を考えて、登場人物をArgoCD担当者、アプリ開発者、アプリ責任者に分けてみました。ArgoCD担当者はCI/CDチームを想定していて、開発者とは別に開発環境を整えるチームを想定しています。アプリ開発者とアプリ責任者は同じチームで、開発者は変更を加えたら責任者に承認を取得する必要があります。

  • ArgoCD Applicationを作成する(ArgoCD担当者)
  • yamlを編集する(アプリ開発者)
    • ブランチを作成する
    • yamlを編集してpushする
    • プルリクエストを作成する
  • プルリクエストを承認する(アプリ責任者)
  • デプロイを確認する

ArgoCD Applicationを作成する(ArgoCD担当者)


開発者がyamlを編集する前に、対象レポジトリのブランチに変更があれば自動でKubernetes上のマニフェストに反映する設定を行います。以下の記事で作成した、test Applicationの「SYNC POLICY」を「Automation」に設定します。

ArgoCDの初歩 GitHub上のyamlからアプリケーションをデプロイする

test Applicationを選択し、「APP DETAILS」から「ENABLE AUTO SAVE」をクリックします。

yamlを編集する(アプリ開発者)


開発者がyamlを変更し、プルリクエストを作成します。

yamlファイルは、ArgoCDの初歩 GitHub上のyamlからアプリケーションをデプロイするで作成したtest-deployment.yamlを対象とし、HELLO_ENVという環境変数をdeploymentに追加します。

ブランチを作成する


以下のコマンドでdev-branchブランチを作成し、そのブランチに切り替えます。

$ git branch
* master
$ git checkout -b dev-branch
Switched to a new branch 'dev-branch'
$ git branch
* dev-branch
  master
$ git push origin dev-branch

yamlを編集してpushする


以下のようにtest-deployment.yamlを編集し、環境変数HELLO_ENV="Hello Env"を追加します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - name: test 
        image: localhost:32147/helloa:latest
        ports:
        - containerPort: 8080
        env:
        - name: HELLO_ENV
          value: "Hello Env v2"

ちなみに、変更前は当然ながらHELLO_ENVが存在しないので、以下のようになります。

ubuntu@microk8s-vm:~$ microk8s.kubectl exec -it test-6d7d668d8c-xbzfq -- env  |  grep HELLO_ENV

ubuntu@microk8s-vm:~$

以下のコマンドで、dev-branchに変更ファイルを登録します。

$ git add -A
$ git commit -m "add HELLO_ENV env to deployment"
$ git push --set-upstream origin dev-branch

プルリクエストを作成する


以下のコマンドで、dev-branchで行った変更をmasterにも反映するプルリクエストを作成します。今回は自分で作成して自分で承認することになりますが、本来であれば承認できるユーザーを予め設定します。

$ git pull-request

プルリクエストを承認する(アプリ責任者)


アプリ開発者が作成したプルリクエストをアプリ責任者が確認し、承認します。

アプリ責任者がGitにログインすると、以下のように承認待ちのプルリクエストが確認できます。

プルリクエストを開き、中身を確認後、「Merge pull request」→「Confirm merge」をクリックします。

以上で承認処理が完了です。本番運用で導入するなら、Slackやメールを使って、承認者にプルリクエストが通知される仕組みを導入すべきだと思います。

デプロイを確認する


自動でデプロイされることを確認します。

プルリクエストの承認が完了し、少し待っていると、Podのローリングアップデートが行われました。

ubuntu@microk8s-vm:~$ microk8s.kubectl get pods
NAME                    READY   STATUS        RESTARTS   AGE
registry                1/1     Running       4          3d22h
test-64df8695f6-96qhf   1/1     Running       0          13s
test-6d7d668d8c-xbzfq   0/1     Terminating   1          24h

以下のコマンドを実行すると、正しく環境変数が登録されていることがわかります。

ubuntu@microk8s-vm:~$ microk8s.kubectl exec -it test-64df8695f6-96qhf -- env  |  grep HELLO_ENV
HELLO_ENV=Hello Env
ubuntu@microk8s-vm:~$

ArgoCDから見ても、同期が完了してyamlが反映されたことがわかります。

yamlファイルを反映するコマンドを実行しなくても、反映されることがわかりました。GitOpsの片鱗を見た気がします。今回やった内容は実運用でも大分使えると思います。

以上です!