EKSでFlux with KustomizeのGitOpsチュートリアルを試してみた

2019.11.26

はじめに

おはようございます、もきゅりんです。

先日、EKSでWeave Fluxを使ってGitOpsしてみる によって、かなり楽にk8sでCI/CDを体験することができました。

しかし、実用の場面ではstg, prodといった複数の環境ごとに設定の調整することを考慮しなくてはなりません。

ということで、Kustomize *1 を使ったFluxでGitOpsを再びEKSでやってみました。

Using Flux with Kustomize

を元に進めていきます。

このチュートリアルのシナリオとしては、stagingproduction と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します。

fork repository

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 のチェックを忘れずに!

ssh key enroll

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します。

change green to blue

ポートフォワーディングを維持する必要があるので、別ターミナルで作業して下さい。

即同期して、若干時間を置いてから確認します。

fluxctl sync --k8s-fwd-ns flux
curl localhost:9898

color bule

ちゃんと文言は更新されています。

--git-path を切り替えることで、環境ごとの設定の調整を容易に行うことができました。

最後に

GitOpsツールには同じようなものにArgo CDがありますが、Argo CDには綺麗なUIがあるので、大きな違いがあると思います。

ただ、Fluxでは導入が比較的簡易であることや、便利な管理機能はこれからより増えていくと思われるので、利用機会も増えていくのではないでしょうか。(より軽量で高速な導入を図る、みたいな思想のプロダクトなのかもしれません) *3

以上です。

どなたかのお役に立てば幸いです。

参考:

脚注

  1. Kustomizeは、ベースとなるyamlをそのまま利用して、複数の目的に(例えば、stg/prodごとに)カスタマイズできるkubernetesを対象としたツールです。kubectl v1.14.0でkubectlに統合されたようです。
  2. fluxctlではまだ --manifest-generation オプションには対応しておらず、yamlで対応しなければならないようです。
  3. 楽天やスターバックスも利用しているようです。