はじめに
TIG岸下です。CNCF連載6日目になります。
業務では主にCIとしてJenkinsを利用しているのですが、前々から気になっていたArgo CDを本連載を機に体感してみたいと思います。
CI/CD is 何?
画像引用元: CD Foundation - CI/CD Patterns and Practices
皆さんは、コードの作成からデプロイまでの流れをどのように行っていますか?
エンジニアは効率化が大好きで、プロセスが常に最適化されるような試行錯誤を常日頃行っております。その結果、過去には手作業で行われていたテストやデプロイが自動化され、開発者はより創造的な作業に集中できるようになりました。また、画像のようなDevOpsの潮流もあり、Dev(開発)とOps(運用)を合体させて、ユーザーへクイックにソフトウェアをデリバリーすることが要求されるようになったことも背景にあります。
その変革の一環として注目されているのが、CI/CD(Continuous Integration / Continuous Delivery)です。CI/CDは、エラーの早期発見や迅速な新機能のリリースを可能にするだけでなく、開発者が直面するストレスを減らし、創造性を高めることを目指しています。
Continuous Integration(継続的インテグレーション)は、コードの変更を頻繁にメインラインにマージするプラクティスです。これにより、バグやコンフリクトを早期に検出し、修正を容易にします。一方、Continuous Deployment(継続的デプロイメント)は、ビルドとテストが成功したコードの変更を自動的に本番環境にデプロイします。これにより、新しい機能や修正を素早くユーザーに提供することが可能となります。
開発プロセスの自動化が求められるようになった背景には、複数の開発者が同時に取り組む大規模なプロジェクトが増え、バグやエラーを早期に発見して修正し、新機能を安全かつ迅速にリリースする必要性が高まったことがあります。
Argoって?
このような状況を背景に、CI/CDを実現する様々なツールが登場しました。
弊ブログでも過去にCI/CDツールを取り上げておりますので、ぜひ参考にして下さい。
こうした中でクラウドネイティブなアプリケーションの開発・デプロイメントと、そのためのツールと環境の必要性として生まれたのがArgoになります。Argoは、最初からKubernetesを基盤として設計されています。KubernetesのAPIを直接使用し、Kubernetes上での実行を自然にサポートしています。
また、 「Get More Done with Kubernetes」 を掲げていることからも、Kubernetesという現代のクラウドネイティブ環境を最大限活用することを目指し、自動化・効率化を更に進化させる手段として開発されていることがわかります。
Argoの核となる機能
ArgoはArgo CDを含めて4つの主要な機能を提供しております。
Argo CD
GitOpsの理念を追求するためのCDツールです。GitリポジトリをSingle Source of Truthと位置づけ、デプロイメントの状態が常にGitの内容と同期していることを保証します。
Argo Workflows
Kubernetes上で一連のタスクを連携させ、複雑なワークフローを作成、実行、管理するためのツールです。例えば、機械学習のパイプラインやデータ処理のワークフローなどを効率的に構築できます。
Argo Events
イベント駆動型のワークフローを支えるツールです。具体的には、Webhookやメッセージキューなどの外部イベントに反応して、ワークフローやKubernetesリソースを自動的に起動します。
Argo Rollouts
より高度なデプロイメント戦略を実装するためのツールです。例えば、カナリアリリースやBlue/Green DeploymentなどのProgressive Delivery戦略を簡単に実行できます。
本記事ではArgo CDを触ってみようと思います。
Argo CDを触ってみる
Kubernetesクラスタの準備
minikubeやkind、もしくはGoogle CloudのGKEなどを利用してクラスタを構築します。
# kind |
Argo CDとArgo CD CLIのインストール
以下のコマンドでArgo CDとArgo CD CLIをインストールします。
# Argo CDをインストールする前に、Namespace:argocdを作る必要がある |
Argo CDのインストールができたらサーバーへアクセスしてみましょう。
以下のコマンド実行後、https://localhost:8080
からダッシュボードへアクセスできます。
# Argo CDのServiceをポートフォワード |
Usernameはadmin
、Passwordは以下のコマンドから取得できます。
# Secretからパスワードを取得 |
アプリケーションのデプロイ
今回はArgo CDが公開している下記のサンプルリポジトリをForkしてデプロイできるように設定していきます。
https://github.com/argoproj/argocd-example-apps
以下のコマンドでアプリケーションをArgo CDへ登録します。
argocd app create guestbook \ |
--repo
: Argo CDに登録するリポジトリ。--path
: リポジトリ内に存在するアプリケーションのパス。--dest-server
: クラスタ内部のPodがKubernetes APIに接続するためのアドレス。--dest-namespace
: デプロイ先のNamespace。--revision
: Argo CDで監視するブランチ。今回の場合、masterブランチに変更があった場合、CDが走る。--sync-policy
: リポジトリとの同期オプション。automated
で自動で同期されるようになる。
上記コマンド実行後、以下のようにアプリケーションが登録されていればOKです。
アプリケーション内の「SYNC」→「SYNCHRONIZE」からアプリケーションをデプロイしてみましょう。
アプリケーションのデプロイ後、アプリケーションをクリックするとそれぞれのマニフェストの関係がグラフ化されます。マニフェストはそれぞれ独立して書くこと多く、マニフェスト同士の関係がうまく想像できなくなることがよくあるのですが、このように可視化されるとわかりやすいですね。
さらに、SYNCされた際の情報やヘルスチェック情報なども表示されています。
デプロイされたアプリケーションにもアクセスして動作確認をしてみます。
以下のコマンドを実行後、http://localhost:8081
にアクセスするとアプリケーションを見ることができます。
# guestbookアプリケーションのServiceをポートフォワード |
CDを走らせてみる
監視先のリポジトリのマニフェストファイルを変更し、CDを走らせてみます。
今回は、guestbook/guestbook-ui-deployment.yaml
のimage versionを変更します。適当なブランチを切り、プルリクエストを投げてApprove後、マージというような状態を想定してみましょう(もちろん、masterブランチにそのままPushしてもCDは走ってくれます)。
Forkしたリポジトリ内でプルリクエストを出す際はマージ先にFork元を指定できてしまうため、
間違えてFork元にPRを作成しないように気を付けてください。
... |
Argo CDでは--sync-policy
をautomated
にしている場合、デフォルトで180秒毎にSync先のリポジトリにポーリングしに行くので、少し待っていると「LAST SYNC」の箇所が最新化され、アプリも以下の様なversion 0.1のimageがデプロイされます。
環境差分を考慮する
実運用を考えるうえで、デプロイ先のdev/stg/prdといった環境の違いを考慮する必要があります。
例えば、devであればPod数1、stg/prdはPod数3にしたり、dev/stg/prd毎でサービス公開先のドメインを変更したりするなどアプリケーションのインフラとなる以上、1つのファイルで管理することはほぼ不可能です。デプロイの度に変数を変更するという運用で頑張ろうスタイルもありますが、人間はミスをする生き物である以上、その運用は確実に破綻します。
Argo CDではkubectlだけでなく、下記のツールを利用することで環境差分を考慮したデプロイが可能となっております。
- Kustomize
- 「kustomization.yaml」または「kustomization.yml」というファイルがある場合。
- Ksonnet
- 「app.yaml」と「components/params.libsonnet」という2つのファイルがある場合。
- Helm
- 「Chat.yaml」というファイルがある場合。
- kubectl
- 上記以外の場合。
今回はKustomizeを利用してみます。
Kustomize
Kustomizeの構文の基本は、変更元のマニフェストファイルに対して変更箇所だけを記載したマニフェストを足す形でデプロイ用のマニフェストファイルを作成します。
kubectl v1.14以降であれば、Kustomizeをサポートしているため特にインストールの必要はありません。
今回利用しているアプリケーションでもKustomizeのサンプルは付いているのですが、実運用をシミュレーションするうえで以下のようなフォルダ構成に変更します。
kustomize-guestbook |
base
配下には基本となるマニフェストファイルを配置し、overlays
配下には環境識別子毎の差分を格納したkustomizeファイルを配置します。base
のkustomization.yamlファイルの中身は以下のようになります。
apiVersion: kustomize.config.k8s.io/v1beta1 |
また、overlays
配下は以下のようになります。
apiVersion: kustomize.config.k8s.io/v1beta1 |
stg側のkustomization.yamlはdevの箇所がstgに変わるだけで、その他は違いがありません。
Gitリポジトリ内にdev
とstg
のブランチを作成後、それぞれをArgo CDにデプロイします。
今回はどちらも同じクラスターにデプロイしていますが、実運用上だと環境ごとに異なるクラスターが用意されていることが想定されます。
for env in dev stg; do |
デプロイ後、ダッシュボードからそれぞれを確認すると各マニフェストの名前に環境識別子のプレフィックスがついていることがわかります(以下はSTG)
このように、環境を考慮したCDができるようになりました。
今回はArgo CDを体感するのみでしたが、imageのversionやハッシュを置き換えたり、別のdeployment.yamlを用意しておいてPatch機能を使ってマニフェストの中身を置き換えたりすることもできます。
また、運用に合わせてHelmやKsonnetの方が適用しやすいこともあるので、実情に合わせたデプロイツールの選択が大切になります。
まとめ
本記事ではArgo CDの特性と利便性について説明し、簡単なハンズオンをやってみました。UIが非常に見やすく、マニフェストの関係同士を可視化してくれるなど、Kubernetesを利用するにあたって非常に便利なツールだなと実感しました。
本連載ではCNCFが公認したクラウドネイティブなソフトウェアを取り扱ってきました。ただ、Kubernetesなんかは響きはカッコいいものの取り扱いが難しいと感じることもありますが、CNCF(Cloud Native Computing Foundation)では、それらを導入するハードルを下げる取り組みが多々行われています。
特に、ArgoのようなCNCFが公認したGraduatedと認定したツール群はKubernetesの難解さを緩和し、その真の力を引き出す一助となります。また、これらのツールはクラウドネイティブのエコシステム全体を理解することにも役立ちます。
またGraduatedなプロジェクトだけでなく、本連載でも取り上げたIncubating/Sandboxのような期待値の高いプロジェクトも多く存在します。この連載を通じて、クラウドネイティブに興味を持った方はぜひCNCFのプロジェクトを覗き、一緒にクラウドネイティブの未来を切り開いていきましょう。
アイキャッチ画像にはCNCF公式のArgoロゴを利用させていただいております。