フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

ArgoCDとは?GitOps含めてわかりやすく説明します

f:id:lirlia:20200414043748p:plain

ArgoCDとは?

ArgoCDGitOpsによる継続的なデプロイメント(continuous delivery)を実現するためのkubernetes向けのツールです。

いくつか単語が出てきましたね。

継続的なデプロイメント(CD)

アプリケーションのリリースをより早くするために使われる概念です。

すごい簡単にいうと変更をしたらすぐに世の中に公開するために「アプリケーションのデプロイを自動化」しましょうというものになります。

GitOpsとは

f:id:lirlia:20200414163733p:plain

GitOpsは「Gitを使って運用(オペレーション)を管理する手法」です。

kubernetes上で動作するアプリケーションの運用がターゲットとなっており、アプリケーションのバージョン管理や、デプロイ方法の管理をGit上でやってしまおうというものになります。

kubernetesを操作する場合はkubectlというコマンドを使ったり、APIを叩いたりなど自由でした。しかし自由な反面

  • 何がどうなっているのか?をトレースし辛い
  • 環境ごとの差分が出てしまった
  • 元に戻しづらい

いったことが発生しました。


そこででてきたのがすべてをGitリポジトリで管理しようという発想です。

ということで上で紹介した

ArgoCDはGitOpsによる継続的なデプロイメント(Contenius Derivery)を実現するためのkubernetes向けのツールです。

は「kubentes上で動かすアプリケーションを自動でデプロイするためにGitを使おう」そして「その管理にArgoCDがいいよ」と言っています。

具体的にどのような動きをするのか?

こちらはArgoCDで掲載されている図です。

f:id:lirlia:20200414155722p:plain

少し簡略化してみます。するとこんな感じ。

f:id:lirlia:20200414164031p:plain

  1. 開発者がコードをGitにPushします
  2. ArgoCDがそれを検知します
  3. ArgoCDが検知した内容をkubernetesに適用します

このようにすることでArgoCDは「Gitリポジトリ=kubernetes」の環境を維持しています。

※ArgoCDのデフォルトの動作ではArgoCDがGitリポジトリを定期的にポーリングしていますが、設定変更でGitリポジトリ→ArgoCDへのWebhookも可能です

ArgoCDによって実現できること

f:id:lirlia:20200414043748p:plain

抽象的な言い方をすると以下の通りです。

  • アプリケーションの定義や設定、環境を宣言的にできバージョンコントロールができる
  • アプリケーションのデプロイやライフサイクルマネジメントの自動化や、簡単に認識できるようになる

具体的にいうとGitを使いそれと連動することで、Gitさえ正しくコントロールしておけば「Gitの操作のみ」でアプリケーションをあるべき状態にすることができるのです。

やってみよう

例えば以下のようなコードがあったとします。

print "hello world version.1"

バージョンアップしてみる

これをバージョンアップしたければ、以下のコードをGitにPushすれば勝手にArgoCDが検知して変更してくれます。

print "hello world version.2"
git add hello.py
git commit -m "version2" hello.py
git push

ロールバックしてみる

やっぱり元に戻したいとなったら以下のコマンドでなかったことにすれば

git revert [先ほどのcommit ID]
git push

こちらに戻り、kubernetes上のアプリもArgoCDによって元に戻されます。

print "hello world version.1"

ArgoCDのアーキテクチャー

ArgoCDはkubernetes上で動作するコントローラーで、稼働しているアプリのモニタリングとGitリポジトリとの比較を常に行なっています。

状態が異なった場合はモニタリング対象のアプリがOutofSyncというモードになり、手動または自動で同期を行うことができます。

ArgoCDのコンポーネント

ArgoCDは3つのコンポーネントからなります。

役割 働き
API サーバ API(gRPC/REST受付)の公開を行う
リポジトリサーバ アプリのmanifestを管理するGitリポジトリのキャッシュを保持する内部向けサーバ
アプリケーションコントローラー kubernetesのコントローラーで稼働しているアプリのモニタリングとGitリポジトリとの比較を行なっている

API サーバ

  • アプリケーションの管理やステータスのレポーティング
  • アプリケーションへの運用(Syncやロールバックなど)を実行
  • 各種認証情報の管理
  • RBACの執行
  • Git webhook eventsのリスナー兼フォワーダー

リポジトリサーバ

  • リポジトリの管理を行う

アプリケーションコントローラー

  • kubernetesのコントローラーで稼働しているアプリのモニタリングとGitリポジトリとの比較を行なう
  • 変更を検知したらユーザがライフサイクルに登録したイベントを呼び出す責任がある

サポート対象のマニュフェスト管理

  • kustomize アプリ
  • helm チャート
  • ksonnet アプリ
  • jsonnet ファイル
  • 平文の YAML/json manifests
  • 構成管理プラグインとして構成されたカスタム構成管理ツール

実際に使ってみよう

こちらの記事で紹介していますのでご覧ください。

blog.framinal.life

参考