本ブログでは、GitOpsを実現するためのツールであるArgo CDを何度か紹介してきました。今回はArgo CDを使って、Helmで管理されたアプリケーションを更新する方法を紹介します。
前提条件
前提として、以下の記事に従ってEKS上にArgo CDのセットアップが済んでいるものとします。
またサンプルアプリとして、リクエストの内容を表示するechoserverを利用します。Helmチャートにしたものがこちらです。
アプリケーションの追加
まず「NEW APP」をクリックして、新しいアプリの登録画面を開きます。
「Application Name」は「echoserver」、「Project Name」は最初からある「default」としましょう。「AUTO-CREATE NAMESPACE」にチェックを入れることを忘れないでください。
ソースのタイプを「HELM」にした上で、「Repository URL」に前述のGitHubのURLを入力します。「Chart」は「helm-echoserver」、リビジョンは「0.6.0」としてください。「DESTINATION」はデプロイ先の指定です。「Cluster URL」はローカルである「https://kubernetes.default.svc」、「Namespace」は「echoserver」としておきます。
Helmのリリースにvalues.yamlが含まれているのですが、デフォルトでExternal-DNSに指定する(弊社の)ドメインが入力されています。以下の図のようにインラインでVALUESを指定して、ingressの設定を自分の環境に合わせてオーバーライドしてください。具体的には「ingress.annotations.external-dns.alpha.kubernetes.io/hostname」と「ingress.hosts[0].host」を、自分のサブドメインに変更します。
最後に「CREATE」をクリックすれば、Helmチャートに従ってアプリケーションがデプロイされます。Argo CDのセットアップが正しく行われていれば、ロードバランサーとDNSレコードが自動的に作成され、Ingressに指定したホスト名にアクセスすると、以下のような画面が表示されます。
アプリケーションのアップデート
当然ですが、アプリケーションは日々更新されます。CDですから、更新されたら自動的に新バージョンがデプロイされて欲しいですよね。ここでは例として、helm-echoserverの0.7.0をリリースしたとしましょう。Argo CDではアプリのAuto Syncを有効にしていると、デフォルトで3分ごとにリポジトリをクロールし、更新を反映してくれるようになっています。
ところがデフォルトでは、Helmでインストールしたアプリは自動的に新しいリビジョンに更新はされません。新しいリビジョンの存在は認識するものの、アプリ作成時に指定したターゲットリビジョンを、自動的に書き変えることはないためです。
つまりHelmアプリケーションを新リビジョンに更新するには、Argo CDのアプリ設定を書き換え、Syncし直す必要があります。これを実現するにはいくつか方法が考えられると思いますが、シンプルなのが、Argo CDのアプリを作るためのマニフェストそのものもGitで管理し、ここもGitOpsしてしまうのがよいのではないでしょうか。こうすることで、「明示的にリビジョンを指定できる」「現在デプロイされているリビジョンをGit管理できる」ためです。
Argo CDアプリケーションのためのマニフェスト
前述のArgo CDアプリケーションを作るマニフェストは以下のようになります。
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: echoserver spec: project: default source: chart: helm-echoserver repoURL: https://VirtualTech-DevOps.github.io/helm-echoserver targetRevision: 0.6.0 helm: valueFiles: - values.yaml releaseName: echoserver values: |- ingress: annotations: alb.ingress.kubernetes.io/scheme: internet-facing external-dns.alpha.kubernetes.io/hostname: echo.devops.virtualtech.jp kubernetes.io/ingress.class: alb hosts: - host: echo.devops.virtualtech.jp paths: - path: / pathType: Prefix chart: helm-echoserver destination: server: "https://kubernetes.default.svc" namespace: echoserver syncPolicy: automated: {} syncOptions: - CreateNamespace=true
このマニフェストをkubectl apply
してあげれば、Argo CD上にアプリケーションが生えてきます。ですがそれでは自動更新ができないため、Git上にこのマニフェストをPushし、リポジトリと連携させます。
このマニフェストを管理するGitリポジトリのサンプルがこちらです。このリポジトリを使って、Argo CDにアプリケーションを登録しましょう*1。なおアプリの登録は、先ほどのようにWeb UIからポチポチしてもよいのですが、CLIを使えば以下のコマンドで済みます。
$ argocd app create apps \ --repo https://github.com/VirtualTech-DevOps/argocd-echoserver.git \ --path manifest \ --dest-server https://kubernetes.default.svc \ --revision main \ --sync-policy automated \ --dest-namespace argocd
このように、マニフェストを読み込んでechoserverアプリケーションを作る、メタなアプリケーションが作成されました。
このアプリケーションはHelmのようにリビジョンを指定しているわけではなく、mainブランチを追跡しているため、マニフェストのtargetRevisionを書き換えた上でmainブランチにコミットすれば、自動で変更を取り込みます。その結果、echoserverも新リビジョンがデプロイされるというわけです。
またこの手法(Argo CDのアプリを内包したアプリを作る)を使うと、複数のアプリをまとめて管理、デプロイすることも可能になります。新しいアプリを追加したい場合も、Argo CDの設定に手を入れることなく、マニフェストをGitに追加するだけで済むというメリットもありますね。この手法を「App for Apps」パターンと呼びます。
Argo CDでHelmアプリケーションをデプロイする場合は、アプリケーションの管理そのものもGitOps化するのがよいかもしれませんね。
*1:このサンプルのGit上のマニフェストは、ホスト名などのvaluesを書き換えていません(上記マニフェストのvalues部分がありません)。実際に試す場合は、自分の環境に合わせて書き換えたマニフェストをコミットした、独自のリポジトリを作ることをお薦めします