kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Flux を使った GitOps 入門チュートリアル「Get started with Flux」を試した

最近よく聞くようになった「GitOps」というデリバリ戦略があり,Single Source of Truth として Git を採用し,Kubernetes リソースなどを継続的にデリバリーしていく.GitOps では,直接 kubectl などを実行せず,例えば GitOps Operator などを使って,Operator からマニフェストを適用する.なお,Git への push をトリガーして CI サービスからデプロイする従来の戦略は比較として「CIOps」と表現される.詳しくは以下の記事に載っている.

また,GitOps を実現するツールも多くある.最近だと「Argo CD」の話題をよく見る.他にも「Flux」「Jenkins X」などもある.また Intuit と Weaveworks のパートナーシップにより「Argo CD」「Flux」を組み合わせた「GitOps Engine」というソリューションもある.詳しくは以下の記事に載っている.

チュートリアル「Get started with Flux」

今回は GitOps に入門するために Flux のチュートリアル「Get started with Flux」を試す.

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 リポジトリをフォークしておく.

github.com

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 のドキュメントにも載っている.

f:id:kakku22:20200907094721p:plain
GitHub - fluxcd/flux: The GitOps Kubernetes operator より引用

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 と表示されている.

f:id:kakku22:20200907100604p:plain
アプリケーション画面 - Before

5. アプリケーションの修正

事前準備でフォークした GitHub リポジトリ flux-get-started の中にある Deployment マニフェスト flux-get-started/workloads/podinfo-dep.yaml を修正する.podinfod コンテナの command--ui-message オプションを追加すると,任意の文字列をメッセージとして表示できる仕組みになっているようだった.以下のマニフェストのように --ui-messageWelcome 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 を取得すると,messageWelcome to Flux に変更されている.

$ kubectl -n demo port-forward deployment/podinfo 9898:9898

$ curl -s http://localhost:9898 | jq '.message'
"Welcome to Flux"

アプリケーション画面も紫イカ?の下に Welcome to Flux と表示されている.

f:id:kakku22:20200907100643p:plain
アプリケーション画面 - After

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 も含めて,引き続き試していくぞ!

docs.fluxcd.io