【ArgoCD/GKE】GitOpsを実現させる


GitOps

Kubernetesがコンテナを管理するツールとして、デファクトスタンダードになりつつある中、そのデプロイ方法についても日々更新されていっています。
その中でも、GitOpsという方法が最近勢いがあり、触る機会があったので、備忘録として残します。

GitOpsとは

Githubを正とし、またGithubを中心にCI/CDを回していきましょうという考え方で理解をしています。
GitOps - Operations by Pull Request

GitOpsの特徴

  • KubernetesのソースコードもGithubで管理する
  • アプリケーションのリポジトリとKubernetesのリポジトリを分ける
  • kubectlコマンドを使用しない

Githubで管理する

アプリケーションの場合は、これが普通だとは思いますが、KubernetesをGithubで管理できているところは少ないでしょう。
Githubで管理することで、どんな設定が現在反映されているのかソースベースで確認することができます。
また、Githubのソースコードを正とします。

アプリケーションとKubernetesのリポジトリを分ける

なぜこうするかというと、同じにしてしまうと、無駄なビルドが走ってしまう時が多くあると考えられます。
例えば、Kuerbenetsの変更だけの場合は、アプリケーションのビルドは必要ありません。
このような場合、リポジトリを分けることが有効です。

アプリケーション用リポジトリ
アプリケーションのリポジトリです。Goだったり、Rubyだったりが入ってます。

マニフェスト用リポジトリ
Kubernetesのマニフェストを格納するリポジトリです。

kubectlコマンドを使用しない

こうすることで、人為的ミスを最大限に減らすことができます。
実際の運用で、 kuberctl applyコマンドだったり、kubectl set imageコマンドを使用している人は多いと思います。
間違って異なる kubectlコマンドを使ってしまったなどは往々にしてあります。

全体像

下記のようなフローがGitOpsに当たります。
この流れは、どのツールを使っても共通だと思います。

  • 開発者がgithubにコミット
  • CIツールが回って、imageをbuild&push
  • Kubernetesのめなファイルをアップデート
  • クラスタ情報を更新

GitOpsの全体像を理解するのは下記が役立つので、一読することをお勧めします。
Argo CDによってGKEでGitOpsをする

GitOpsを実現する方法

GitOpsを実現する方法は下記の通り、いくつか存在します。

Jenkins X
ArgoCD
Flux

今回は上記のうちArgoCDを使ってGitOpsを実現していきたいと思います。
ちなみにArgoCDを選択した理由としては、下記の通りです。

  • 学習コストが低い
  • GUIで操作が可能
  • 最近ArgoCDを取り入れている企業が多い

ArgoCDとは

Kubernetesで、GitOpsを実現する方法の一つです。
公式では下記のように説明されています。

Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.

What Is Argo CD?

ArgoCDを使ったデプロイまでの流れ

  1. 開発者がmasterにmerge
  2. CircleCIでテスト、GCRへimageをpush、マニフェストリポジトリにpush
  3. ArgoCDがGithub上のマニフェストファイルの更新を検知
  4. ArgoCDがクラスタを最新の状態にする

構築

アプリケーションのデプロイ

アプリケーションの公開

今回はGKEを使ってGitOpsを構築していきます。
下記のGCPのドキュメントを参考に、「ステップ 6: アプリケーションをインターネットに公開する」まで実施してください。
コンテナ化されたウェブ アプリケーションのデプロイ

この際注意しなければいけないのは、Kubernetesのマニフェストを実装して、別のリポジトリで管理することです。
リポジトリを分けて管理するのは、下記の記事が参考になります。
Cloud Build を使用した GitOps スタイルの継続的デリバリー

アプリケーションの確認

GKEの管理画面の「ServiceとIngress」という箇所をクリックし、作成したアプリケーションの「エンドポイント」をクリックします。そして作成したアプリケーションが表示されているか確認します。

Githubに最新の状態をpush

アプリケーション用、マニフェスト用のリポジトリに最新の物をpushしておきます。

ArgoCDのマニフェスト作成

下記ドキュメントを使ってArgoCDの設定を行なっていきます。
「4. Login Using The CLI」まではスラスラいくと思います。
Getting Started

Register A Cluster To Deploy Apps To(自分が少し詰まったところ)

連携したいクラスタを登録します。

現在自分が扱っている全てのクラスタ情報を出力してくれます。
argocd cluster add

接続するクラスタを選択します。
argocd cluster add [Cluster NAME]

ここでは、後ほどArgoCDで連携させるクラスタを選択する必要があるので、それを事前に登録しているイメージです。

ログイン

設定が完了したら、ArgoCDログインの画面が下記のように出ていると思います。
ここで先ほど設定したUsernamePasswordを入力し、ログインします。

ArgoCD 設定

ここでは、クラスタと連携するための設定を行なっていきます。

Githubのリポジトリを連携する

左メニューの歯車マークをクリックし、「Repositoriy」をクリックします。

Repository URLには、HTTPSのURLを入力します。

アプリケーションの作成

右側のプラスマークをクリックし、「New Application」を選択します。

リポジトリ選択の画面が出てくるので、ここで先ほど登録したリポジトリを選択します(自動で候補として出てきます)

次の画面に遷移したら、「Create App From Directory」を選択します。

下記が入力項目になります。
Revision
HEADという書き方かブランチ名にすることができます。
Tracking and Deployment Strategies

Path
Kubernetesのマニフェストファイルがどこに存在するかを記載します。
注意すべきところとしては、マニフェストに関してはディレクトリで管理していないと、アプリケーションの作成ができないところです。

使用できるマニフェストファイルは以下の通りです。
kustomize
helm
プレーンなYAMLファイル

私の場合は、プレーンなYAMLファイルを使用しました。

Project
TODO: 内容調べる
成功したアプリケーションだと、defaultを使用していた。

Application Name
ここは任意の名前で問題ありません。

Cluster URL
ここで事前に登録したクラスタを選択します。
ここもクリックすると自動的に選択肢が表示されます。

Namespace
ここは基本defaultで問題ないと思います。
異なるNamespaceを作成している場合は、それを指定してください。
Namespace(名前空間)

ArgoCDとクラスタを連携できるようにする

アプリケーションが作成し終わったタイミングで、ほとんど連携はできています。
あとは、「Enable Auto Sync」をクリックして、自動で連携するようにします。

CircleCI連携

CIツールは、CircleCIを使用します。
Githubとの連携は、下記を非常にわかりやすかったです。
GitHub+CircleCI入門

CircleCIでGKEにアクセスできるようにする

GKEにアクセスできるようにするには、サービスアカウントを作成する必要があるので作成していきます。
GCPにログインし、「IAMと管理」から「サービスアカウント」をクリックします。
権限としては2つ付与しておきます。
「ストレージ管理者」「Kubernetes Engine 管理者」を選択し、Keyを作成します。
ストレージ管理者は、GCRへのpushができるようにすることと、
Kubernetes Engine 管理者は、GKEにアクセスするために付与しました。

CircleCIでマニフェスト用のリポジトリをclone,commit,pushできるようにする

CircleCI上で、プライベートリポジトリを扱うためには、SSH Keyを設定する必要があります。
Keyには、2つの種類があり、deploy key, user keyがあります。

設定項目の「Checkout SSH Keys」をクリックし、そこでKeyを追加することで、設定が可能です。
GitHub および Bitbucket のインテグレーション

これを追加すると、fingerprintが発行されるので、それをCircleCIに設定します。

- add_ssh_keys:
    fingerprints:
      - "発行されたfingerprint"

またgithubに公開鍵を追加するような手順で、「SSH Permissions」も設定することができます。
SSH Permissions
※この登録をする際は、CircleCIはpemの形式でしか登録できないので、気をつけてください!
Circle CI で Github に write access 可能な Deploy key を設定する

imageの修正

デプロイするためには、Deploymentファイルのimageを更新する必要があります。
自分の場合は、原始的ですが、sedコマンドで対応しました。
sedでこういう時はどう書く?
sedコマンドの備忘録
sedコマンドで覚えておきたい使い方12個(+3個)

使用してみての感想

ArgoCDは気軽にGitOpsを始めるのであれば、最適なツールかもしれないです。
ただイメージのアップデートの方法は、sedコマンド使いましたが、別の方法があるとは思うので、引き続き調査したいと思います。

改めて、ArgoCDのメリットとしては、 学習コストが低い
ただ、sedコマンド以外にデプロイメントを更新する方法が調査中ということと、
すでに動いていて、マニフェスト管理をしていないGKEEKSに対して、途中でArgoCDを導入する方法が、ピンときませんでした。
クラスタ構築からすることになるのかな。

参考にした記事

デプロイについて

ビルドとデプロイって結局なんやねん!?!?!???みたいな記事

ArgoCDについて

Architectural Overview
ArgoCDで出てくる言葉の意味 Core Concepts

Webhookについて[Optional]

ArgoCDは、3分おきにgithubの最新の状態を見ているので、時折更新が遅くなることがあります。
そこで、WebHookを設定しておき、Githubに更新があるたびにArgoCDがそれを検知してくれます。
詳しくは下記を参考にしてみてください。

Webhookとは?

その他

Webinar Series: GitOps Tool Sets on Kubernetes with CircleCI and Argo CD
Kubernetes Meetup Tokyo 21 で 『Argo CD 実践ガイド』というタイトルで LT をしました #k8sjp
Gitブランチ、Dockerリポジトリ、環境毎のk8sクラスタ 俺のデプロイフローを聞いてほしい
FAQ