【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を実現する方法は下記の通り、いくつか存在します。
今回は上記のうちArgoCDを使ってGitOpsを実現していきたいと思います。
ちなみにArgoCDを選択した理由としては、下記の通りです。
- 学習コストが低い
- GUIで操作が可能
- 最近ArgoCDを取り入れている企業が多い
ArgoCDとは
Kubernetesで、GitOpsを実現する方法の一つです。
公式では下記のように説明されています。
Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.
ArgoCDを使ったデプロイまでの流れ
- 開発者がmasterにmerge
- CircleCIでテスト、GCRへimageをpush、マニフェストリポジトリにpush
- ArgoCDがGithub上のマニフェストファイルの更新を検知
- 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ログインの画面が下記のように出ていると思います。
ここで先ほど設定したUsername
とPassword
を入力し、ログインします。
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コマンド以外にデプロイメントを更新する方法が調査中ということと、
すでに動いていて、マニフェスト管理をしていないGKE
やEKS
に対して、途中でArgoCDを導入する方法が、ピンときませんでした。
クラスタ構築からすることになるのかな。
参考にした記事
デプロイについて
ビルドとデプロイって結局なんやねん!?!?!???みたいな記事
ArgoCDについて
Architectural Overview
ArgoCDで出てくる言葉の意味 Core Concepts
Webhookについて[Optional]
ArgoCDは、3分おきにgithubの最新の状態を見ているので、時折更新が遅くなることがあります。
そこで、WebHookを設定しておき、Githubに更新があるたびにArgoCDがそれを検知してくれます。
詳しくは下記を参考にしてみてください。
その他
Webinar Series: GitOps Tool Sets on Kubernetes with CircleCI and Argo CD
Kubernetes Meetup Tokyo 21 で 『Argo CD 実践ガイド』というタイトルで LT をしました #k8sjp
Gitブランチ、Dockerリポジトリ、環境毎のk8sクラスタ 俺のデプロイフローを聞いてほしい
FAQ
Author And Source
この問題について(【ArgoCD/GKE】GitOpsを実現させる), 我々は、より多くの情報をここで見つけました https://qiita.com/wqwq/items/d9125ab2586455c29a8d著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .