とことんDevOps | 日本仮想化技術が提供するDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けするとことんDevOpsでは、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果など、DevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、アジャイル開発、コンテナ開発など

開催予定の勉強会

各種SNSのフォローもよろしくお願いいたします。

Argo CDのアプリケーションをArgo CDで管理する

本ブログでは、GitOpsを実現するためのツールであるArgo CDを何度か紹介してきました。今回はArgo CDを使って、Helmで管理されたアプリケーションを更新する方法を紹介します。

前提条件

前提として、以下の記事に従ってEKS上にArgo CDのセットアップが済んでいるものとします。

devops-blog.virtualtech.jp

またサンプルアプリとして、リクエストの内容を表示するechoserverを利用します。Helmチャートにしたものがこちらです。

アプリケーションの追加

まず「NEW APP」をクリックして、新しいアプリの登録画面を開きます。

左上の「+ NEW APP」ボタンをクリックする

「Application Name」は「echoserver」、「Project Name」は最初からある「default」としましょう。「AUTO-CREATE NAMESPACE」にチェックを入れることを忘れないでください。

アプリの設定(その1)

ソースのタイプを「HELM」にした上で、「Repository URL」に前述のGitHubのURLを入力します。「Chart」は「helm-echoserver」、リビジョンは「0.6.0」としてください。「DESTINATION」はデプロイ先の指定です。「Cluster URL」はローカルである「https://kubernetes.default.svc」、「Namespace」は「echoserver」としておきます。

アプリの設定(その2)

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に指定したホスト名にアクセスすると、以下のような画面が表示されます。

echoserverの画面

アプリケーションのアップデート

当然ですが、アプリケーションは日々更新されます。CDですから、更新されたら自動的に新バージョンがデプロイされて欲しいですよね。ここでは例として、helm-echoserverの0.7.0をリリースしたとしましょう。Argo CDではアプリのAuto Syncを有効にしていると、デフォルトで3分ごとにリポジトリをクロールし、更新を反映してくれるようになっています。

Auto Syncの設定

ところがデフォルトでは、Helmでインストールしたアプリは自動的に新しいリビジョンに更新はされません。新しいリビジョンの存在は認識するものの、アプリ作成時に指定したターゲットリビジョンを、自動的に書き変えることはないためです。

0.7.0の存在は認識しているものの、ターゲットリビジョンが自動的に上がることはない

つまり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部分がありません)。実際に試す場合は、自分の環境に合わせて書き換えたマニフェストをコミットした、独自のリポジトリを作ることをお薦めします