最近よく聞くようになった「GitOps」というデリバリ戦略があり,Single Source of Truth として Git を採用し,Kubernetes リソースなどを継続的にデリバリーしていく.GitOps では,直接 kubectl
などを実行せず,例えば GitOps Operator などを使って,Operator からマニフェストを適用する.なお,Git への push をトリガーして CI サービスからデプロイする従来の戦略は比較として「CIOps」と表現される.詳しくは以下の記事に載っている.
- Guide To GitOps
- Kubernetes anti-patterns: Let's do GitOps, not CIOps!
- Kubernetesを最大限に活かすためのGitOps入門 - Speaker Deck
また,GitOps を実現するツールも多くある.最近だと「Argo CD」の話題をよく見る.他にも「Flux」や「Jenkins X」などもある.また Intuit と Weaveworks のパートナーシップにより「Argo CD」と「Flux」を組み合わせた「GitOps Engine」というソリューションもある.詳しくは以下の記事に載っている.
- https://argoproj.github.io/argo-cd/
- Flux - The GitOps operator for Kubernetes
- GitHub - weaveworks/awesome-gitops: A curated list for awesome GitOps resources
- GitHub - argoproj/gitops-engine: Democratizing GitOps
- Introducing Argo Flux - A Weaveworks-Intuit-AWS Collaboration
チュートリアル「Get started with Flux」
今回は GitOps に入門するために Flux のチュートリアル「Get started with Flux」を試す.
https://docs.fluxcd.io/en/1.20.2/tutorials/get-started/docs.fluxcd.io
1. 事前準備
今回は Docker Desktop for Mac "Edge" を使って,以下の Kubernetes 環境で試す.
$ kubectl version --short Client Version: v1.18.6 Server Version: v1.18.6
次に fluxctl
コマンドを使えるようにする.今回は brew
でインストールしておく.
$ brew install fluxctl $ fluxctl version 1.20.2
最後にチュートリアルで使う GitHub リポジトリをフォークしておく.
2. セットアップ
まず,Flux で使う Namespace flux
を作っておく.
$ kubectl create namespace flux
次に,Flux 関連の Kubernetes リソースをセットアップする.環境変数 GHUSER
に GitHub の個人アカウントを設定して,以下の fluxctl install
コマンドを実行すると,マニフェストが自動生成されるため,直接 kubectl apply
で適用する.
$ export GHUSER=kakakakakku $ fluxctl install \ --git-user=${GHUSER} \ --git-email=${GHUSER}@users.noreply.github.com \ --git-url=git@github.com:${GHUSER}/flux-get-started \ --git-path=namespaces,workloads \ --namespace=flux | kubectl apply -f - serviceaccount/flux created clusterrole.rbac.authorization.k8s.io/flux unchanged clusterrolebinding.rbac.authorization.k8s.io/flux unchanged deployment.apps/flux created secret/flux-git-deploy created deployment.apps/memcached created service/memcached created $ kubectl rollout status deployment/flux -n flux deployment "flux" successfully rolled out $ kubectl get deployments -n flux NAME READY UP-TO-DATE AVAILABLE AGE flux 1/1 1 1 50s memcached 1/1 1 1 50s
実行結果に載っている通り,Flux / Memcached / RBAC 関連のリソースを起動している.なお,GitOps の全体像や Memcached の利用箇所などは,Flux のドキュメントにも載っている.
3. アクセス権限の設定
Flux は起動時に SSH キーを生成する仕組みになっている.生成された「公開鍵」をコピーして,GitHub リポジトリに設定することにより,Kubernetes クラスターと GitHub リポジトリを同期できるようになる.そこで fluxctl identity
コマンドを実行すれば「公開鍵」を確認できる.今回はそのままコピーして,GitHub リポジトリの Deploy keys に追加する.なお Allow write access にもチェックを入れておく.
$ fluxctl identity --k8s-fwd-ns flux
ssh-rsa xxx
4. 動作確認
チュートリアル手順では,次に GitHub UI でマニフェストを修正していたけど,その前に動作確認をしておくと理解しやすい.既に Flux によって Namespece demo
にアプリケーションが起動されているため,以下のように Deployment に対してポートフォワードをする.すると http://localhost:9898
にアクセスできるようになる.curl
で JSON を取得し,具体的な値として message
を確認すると greetings from podinfo v3.1.5
になっている.
$ kubectl -n demo port-forward deployment/podinfo 9898:9898 $ curl -s http://localhost:9898 | jq '.message' "greetings from podinfo v3.1.5"
なお,ブラウザから http://localhost:9898
にアクセスすると,以下のようなアプリケーション画面になる.紫イカ?の下にも同じく greetings from podinfo v3.1.5
と表示されている.
5. アプリケーションの修正
事前準備でフォークした GitHub リポジトリ flux-get-started
の中にある Deployment マニフェスト flux-get-started/workloads/podinfo-dep.yaml
を修正する.podinfod
コンテナの command
に --ui-message
オプションを追加すると,任意の文字列をメッセージとして表示できる仕組みになっているようだった.以下のマニフェストのように --ui-message
に Welcome to Flux
を追加する.コミットまでしておく.
command: - ./podinfo - --port=9898 - --port-metrics=9797 - --grpc-port=9999 - --grpc-service-name=podinfo - --level=info - --random-delay=false - --random-error=false - --ui-message='Welcome to Flux'
6. Flux による自動適用
約5分程度(インターバル設定による)待つと Flux によって,GitHub にコミットしたマニフェストの修正が自動的に適用される.今回はすぐに確認するため fluxctl sync
コマンドを使って即時適用をする.適用後に Pod を確認すると,新しく作られていた.これこそ Flux を使った GitOps の基本と言える.
$ fluxctl sync --k8s-fwd-ns flux Synchronizing with ssh://git@github.com/kakakakakku/flux-get-started Revision of master to apply is xxxxxxx Waiting for xxxxxxx to be applied ... Done. $ kubectl get pods -n demo NAME READY STATUS RESTARTS AGE podinfo-695dc4ffdb-4v9lg 1/1 Running 0 100s podinfo-695dc4ffdb-qj5bf 1/1 Running 0 100s
同じく Deployment に対してポートフォワードをして動作確認をする.curl
で JSON を取得すると,message
が Welcome to Flux
に変更されている.
$ kubectl -n demo port-forward deployment/podinfo 9898:9898 $ curl -s http://localhost:9898 | jq '.message' "Welcome to Flux"
アプリケーション画面も紫イカ?の下に Welcome to Flux
と表示されている.
7. リソース削除
チュートリアル手順には載っていなかったけど,最後にリソースを削除しておく.以下のコマンドを使えば良いと思う.
$ export GHUSER=kakakakakku $ fluxctl install \ --git-user=${GHUSER} \ --git-email=${GHUSER}@users.noreply.github.com \ --git-url=git@github.com:${GHUSER}/flux-get-started \ --git-path=namespaces,workloads \ --namespace=flux | kubectl delete -f - deployment.apps "flux" deleted secret "flux-git-deploy" deleted deployment.apps "memcached" deleted service "memcached" deleted serviceaccount "flux" deleted clusterrole.rbac.authorization.k8s.io "flux" deleted clusterrolebinding.rbac.authorization.k8s.io "flux" deleted $ kubectl delete namespace flux $ kubectl delete deployments podinfo -n demo $ kubectl delete horizontalpodautoscalers.autoscaling/podinfo -n demo $ kubectl delete service/podinfo -n demo
まとめ
最近よく聞く「GitOps」に入門するために Flux のチュートリアル「Get started with Flux」を試した.試すだけなら,1時間もかからず簡単に楽しめる.また他にも Helm と組み合わせたチュートリアルもある.Flux に限らず Argo CD も含めて,引き続き試していくぞ!
https://docs.fluxcd.io/en/1.20.2/tutorials/get-started/docs.fluxcd.io