Kubernetesやクラウドネイティブをより便利に利用する技術やツールの概要、使い方を凝縮して紹介する連載。今回は、「Argo CD」によるクラウドネイティブなCD(継続的デリバリー)「GitOps」について解説します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Kubernetesやクラウドネイティブをより便利に利用する技術やツールの概要、使い方を凝縮して紹介する本連載「Cloud Nativeチートシート」。前回、前々回とクラウドネイティブにおけるCI/CD(継続的インテグレーション/継続的デリバリー)について説明してきましたが、今回はCDにフォーカスします。
クラウドネイティブにおけるCI/CDの概要については『「Kubernetes Native」なCI/CDとは何か――クラウドネイティブ時代に至る歴史、主要ツール、パイプラインとフローの在り方』、CIについては「GitLabによるCI実践入門――Kubernetesで利用するコンテナイメージをビルドする」をご覧ください。
本稿では、上記のCI/CDの概要で説明したクラウドネイティブなCD「GitOps」の詳細、および「Argo CD」によるGitOpsの実装方法、GitOpsの原則、実践ポイントを説明します。
GitOpsは、2017年にWeaveworksが提唱した開発手法です。GitOpsを使うと、「Git」とKubernetesクラスタで実行されているものとの差分を検出できます。違いがある場合は、クラスタの状態を自動的に更新またはロールバックすることで常にGitとKubernetes環境を同期し続けることができます。
また、GitをCDのベースとすることで、Gitのマージ/プルリクエストといったなじみのある開発方法でKubernetesにデプロイできます。
GitOpsでは、デプロイをCDツール、ビルド部分をCIツールが担い、CIとCDの責務を分離します。
従来のCDと比較したGitOpsの特徴については、本連載の前々回記事で説明しているので、興味がある方は参考にしてください。
Argo CDは「Kubernetes Native」なGitOpsベースのCDツールです。Kubernetesと組み合わせて便利に使えます。どう便利なのかを見ていきましょう。
Argo CDは、Kubernetesに「Helm」やYAMLでデプロイして簡単に使い始めることができます。また、オープンソースソフトウェア(OSS)で提供されているので、ライセンスの購入などを気にする必要もありません。
KubernetesマニフェストをGitリポジトリで管理している方も多いと思いますが、Argo CDはGitリポジトリをサポートしています。「GitHub」「GitLab」、自分で立てたGitリポジトリサーバなどのGitリポジトリを利用できます。
WebのUIを備え、アプリケーションのデプロイを直感的に定義できます。また、GUI上でデプロイされたリソースの確認や、リポジトリの定義情報とKubernetesクラスタ上のリソースの差分も分かりやすく確認できます。また、コマンドラインのCLIも利用できます。
WebブラウザやコマンドラインのCLIは、使い始めたときは便利ですが、デプロイ情報を本格的に管理したい場合には向きません。「Kubernetes Native」なツールなだけあり、YAMLファイルでデプロイ情報を記述してGitリポジトリなどでデプロイ情報を管理できます。
「Kustomize」やHelmのようなマニフェスト管理ツールとの連携機能を標準で備えています。
リポジトリへの変更をトリガーにデプロイをするだけではなく、リポジトリで定義されたYAMLファイルとKubernetesにデプロイされているリソースの差分を検出してデプロイできます。Kubernetesを運用していると、誰かが勝手にKubernetes上のリソースを変更してしまうことがありますが、そのような場合の環境修復にも役に立ちます。
なお、2021年4月7日にリリースされたArgo CD 2.0からは、下記の機能が追加され、個別にリリースされています。これらは、それぞれ追加でインストールする必要があります。
これまで、デプロイ完了などのイベントを通知するためには、各サービスに通知ジョブを実装した上で「Resource Hooks」の仕組みを利用してJobを起動する必要がありました。2.0からは、「Notifications」機能で簡単に通知できるようになりました。電子メール、「Slack」、GitHubなどのサービスに対応している他、任意のWebhookに対して通知を送ることもできます。
Argo CDでは「Application」というカスタムリソースでデプロイ設定を定義し、「Deployment」や「Service」などのマニフェスト群をまとめて管理します。
「ApplicationSet」はApplicationのテンプレートに対して複数のパラメーターを適用し、自動的にApplicationを生成する機能です。同じApplicationを複数のクラスタに展開したい場合や、大量のApplicationを管理する場合に便利です。
「Image Updater」はArgo CDで管理されているKubernetesのコンテナイメージレジストリを監視し、クラスタ上のワークロードのイメージを自動的に更新する機能です。コンテナリポジトリ内のコンテナイメージのバージョンをトラッキングし、対象の選別を自動化してデプロイできます。従来はコンテナイメージを変更した後にマニフェストの内容を更新する必要がありましたが、その作業を自動化します。
Argo Projectの実験的プロジェクトargoproj-labsのプロジェクトの一つです。
なおArgo CDは「Argo Project」のプロダクトの一つです。Argo Projectでは、Argo CDの他にワークフローエンジンの「Argo Workflows」やイベント駆動フレームワークの「Argo Events」なども提供しています。
Applicationリソースは、デプロイの単位ごと(アプリケーションやサービスなどまとまったデプロイ対象ごと)に作成します。WebブラウザやCLIで作成できる他、YAMLファイルを定義して、クラスタに「kubectl apply」で適用することもできます。Applicationリソースの定義には、下記のようにデプロイ設定を記述します。
Applicationリソースに定義された情報を基に、Argo CDのコンポーネントの一つである「Application Controller」がデプロイを管理します。Application Controllerはその名の通り、Kubernetesのコントローラーとして実装されており、クラスタ上のデプロイされたリソースの状態とGitリポジトリ上のマニフェストの内容を監視します。Gitリポジトリ上のマニフェストが更新された場合や、クラスタ上のリソースが直接変更された場合などに差分を検出し、変更内容の同期(デプロイ)などをします。
Argo CDにはApplicationリソースの他、複数のApplicationをグルーピングする「AppProject」というカスタムリソースも存在します。AppProjectは、Argo CDをマルチテナントで使用する際にテナントごとにApplicationを管理するケースなどで役に立ちます。
本稿では詳しく紹介しないので、詳細は「Declarative Setup - Argo CD - Declarative GitOps CD for Kubernetes」をご覧ください。
ここからは、Argo CD v2(執筆時点ではv2.0.4)によるCD実装を説明します。プライベートリポジトリのGitLabからデプロイマニフェストを取得し、Kubernetesクラスタにデプロイするサンプルを例に紹介します。
本稿で利用するArgo CDの概要は下記の通りです。
Kubernetesクラスタ上にArgo CDをインストールし、デプロイメントをApplicationリソースとして定義すると、Applicationリソースの定義を基に、リソースごとに定義されたアプリケーションがデプロイされます。
本稿では、「kubectl port-forward」でポートフォワードした操作端末の「8080」ポートを利用してArgo CDに接続します。Argo CDへの接続には、Webブラウザ(GUI)やArgo CDのCLIを利用します。
Serviceリソースのロードバランサーや「Ingress」が利用できる場合は、ポートフォワードを利用する代わりにArgo CDを外部公開しても構いません。その場合は、Argo CDのCLIやWebブラウザ(GUI)で指定するURL「https://localhost:8080」を適宜読み替えてください。
Copyright © ITmedia, Inc. All Rights Reserved.