この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
おはようございます、もきゅりんです。
先日、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