EKSでFlux with KustomizeのGitOpsチュートリアルを試してみた
はじめに
おはようございます、もきゅりんです。
先日、EKSでWeave Fluxを使ってGitOpsしてみる によって、かなり楽にk8sでCI/CDを体験することができました。
しかし、実用の場面ではstg, prodといった複数の環境ごとに設定の調整することを考慮しなくてはなりません。
ということで、Kustomize *1 を使ったFluxでGitOpsを再びEKSでやってみました。
を元に進めていきます。
このチュートリアルのシナリオとしては、staging
と production
と2つのk8s clusterがあり、それぞれに設定される最小のpod数がstgが1つ、prodが2つとなっていますが、この稿では、1clusterで2回デプロイすることで対応します。
環境について
EKS Workshpの GETTING STARTED に沿って進めます。
Cloud9(EC2 / t2.micro / Amazon Linux2)で作業します。
Install Kubernetes Toolsでは、Kustomizeが統合されたkubectlが利用したいのでv1.14.0以上でインストールします。
sudo curl --silent --location -o /usr/local/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/v1.14.8/bin/linux/amd64/kubectl sudo chmod +x /usr/local/bin/kubectl kubectl version
LAUNCH USING EKSCTL の通りに進めます。
最新のFluxctlをインストールします。
sudo wget -O /usr/local/bin/fluxctl https://github.com/fluxcd/flux/releases/download/1.16.0/fluxctl_linux_amd64 sudo chmod 755 /usr/local/bin/fluxctl fluxctl version
それと、自身のGitリポジトリを持っていることが前提です。
1 flux-kustomize-example を Forkする
自身のGitHubにログインしている状態でForkします。
2 Deploy Flux version 1.13.0 or newer
How to bootstrap Flux using Kustomize にしたがってデプロイします。
Cloud9上で対応していきます。
fluxの名前空間を作成します。
kubectl create ns flux
yamlを作成して対応します。 *2
mkdir fluxcd cat > fluxcd/kustomization.yaml <<EOF namespace: flux bases: - github.com/fluxcd/flux//deploy patchesStrategicMerge: - patch.yaml EOF
README に書かれているとおりなのですが、デプロイする際に下記更新して対応します。
--manifest-generation=true
にする。--git-url
はforkした自身のリポジトリです。--git-path=staging
or--git-path=production
にする。
export GHUSER="YOURUSER" cat > fluxcd/patch.yaml <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: flux spec: template: spec: containers: - name: flux args: - --manifest-generation=true - --memcached-hostname=memcached.flux - --memcached-service= - --ssh-keygen-dir=/var/fluxd/keygen - --git-branch=master - --git-path=staging - --git-user=${GHUSER} - --git-email=${GHUSER}@users.noreply.github.com - --git-url=git@github.com:${GHUSER}/flux-kustomize-example EOF
clusterにFlux with Kustomizeをデプロイします。
kubectl apply -k fluxcd
Fluxがスタートするのを待ちます。
kubectl -n flux rollout status deployment/flux
deployment "flux" successfully rolled out
が表示されればOKです。
3 SSHキーを発行して公開鍵をForkしたGitリポジトリに登録する
SSHキーを発行します。
fluxctl identity --k8s-fwd-ns flux
表示された公開鍵を以下のように貼り付けます。
Allow write access
のチェックを忘れずに!
4 確認する
デフォルト設定は、5分間ごとのpull同期ですが、即同期させます。
$ fluxctl sync --k8s-fwd-ns flux Synchronizing with ssh://git@github.com/hogehoge/flux-kustomize-example Revision of master to apply is 951fe65 Waiting for 951fe65 to be applied ... Done.
pod数を確認してみます。
$ kubectl get -n demo pods NAME READY STATUS RESTARTS AGE podinfo-8559db597-bqr8l 1/1 Running 0 4m43s
Podは1つです。
今度は production
でデプロイしてみます。
fluxcd/patch.yaml の --git-path=staging
を --git-path=production
に変更します。
kubectl apply -k fluxcd
$ kubectl get -n demo pods NAME READY STATUS RESTARTS AGE podinfo-7575ff669-6k5bw 1/1 Running 0 48s podinfo-7575ff669-mnqb4 1/1 Running 0 57s
Podは2つになっています。
今度は、応答の文言を変えてみて同期してみます。
以下のようにしてサービスにアクセスします。
kubectl -n demo port-forward deployment/podinfo 9898:9898 & curl localhost:9898 { "hostname": "podinfo-7575ff669-mnqb4", "version": "1.3.2", "revision": "2fc253a", "color": "green", "message": "greetings from podinfo v1.3.2", "goos": "linux", "goarch": "amd64", "runtime": "go1.11.2", "num_goroutine": "6", "num_cpu": "2" }
Gitリポジトリのflux-kustomize-example > base > podinfo-dep.yaml の PODINFO_UI_COLOR
を見ると現在、"green"になっています。
ここを"blue"に変更してCommitします。
ポートフォワーディングを維持する必要があるので、別ターミナルで作業して下さい。
即同期して、若干時間を置いてから確認します。
fluxctl sync --k8s-fwd-ns flux curl localhost:9898
ちゃんと文言は更新されています。
--git-path
を切り替えることで、環境ごとの設定の調整を容易に行うことができました。
最後に
GitOpsツールには同じようなものにArgo CDがありますが、Argo CDには綺麗なUIがあるので、大きな違いがあると思います。
ただ、Fluxでは導入が比較的簡易であることや、便利な管理機能はこれからより増えていくと思われるので、利用機会も増えていくのではないでしょうか。(より軽量で高速な導入を図る、みたいな思想のプロダクトなのかもしれません) *3
以上です。
どなたかのお役に立てば幸いです。
参考:
- Using Flux with Kustomize
- How to bootstrap Flux using Kustomize
- fluxctl install does not know about --manifest-generation flag