MinikubeでWeave Fluxを使ってGitOpsしてみる

GitOpsに興味があり、MinikubeでWeave Fluxを試してみたメモ。

以下のガイドに従い試してみる。

- https://github.com/weaveworks/flux/blob/master/site/get-started.md

GitOptsとはについては以下の資料などを参照。

- [GitOpsでKubernetesのManifest管理](https://www.slideshare.net/shinyasasaki1024/gitopskubernetesmanifest)
- [Introduction to GitOps Deployment to Kubernetes](https://speakerdeck.com/sakajunquality/introduction-to-gitops-deployment-to-kubernetes)

## 準備

コマンドラインツールの[fluxctl](https://github.com/weaveworks/flux/blob/master/site/fluxctl.md)をインストールする。今回の作業だけならこのツールはなくても大丈夫。

```shell-session
brew install fluxctl
```

Fluxにウォッチさせるリポジトリとして、サンプルのリポジトリをフォークして使用する。以下のリポジトリでForkボタンを押す。

- https://github.com/weaveworks/flux-get-started

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/31d0d0fd-cad7-17de-873f-6d4bb3e3cfc4.png)

## Weave Fluxの導入

Minikubeを起動する。

```shell
minikube start
```

Fluxのリポジトリをローカルにクローンする。

```shell
git clone https://github.com/weaveworks/flux
```

FluxのDeploymentのマニフェストを修正する。ウォッチするリポジトリをフォークした自分のリポジトリに変更する。

```shell
vi deploy/flux-deployment.yaml
```

```yaml
...
        # replace or remove the following URL
        - --git-url=git@github.com:sotoiwa/flux-get-started.git
        - --git-branch=master
...
```

`deploy`ディレクトリ配下のマニフェスト群をデプロイする。

```shell
kubectl apply -f deploy
```

Podが起動したことを確認する。

```shell-session
$ kubectl get po
NAME                        READY   STATUS    RESTARTS   AGE
flux-546fdf9957-vbltb       1/1     Running   0          3s
memcached-57f9c8d4c-fxn8p   1/1     Running   0          8m58s
$
```

Fluxが起動時に生成した鍵ペアの公開鍵を確認する。

```shell
fluxctl identity
```

`fluxctl`を導入していない場合は以下コマンドでも確認できる。

```
kubectl logs deployment/flux | grep identity.pub
```

公開鍵をdeploy keyとして登録する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/c7941aa8-820b-1798-423e-c1057cb1ce2f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/199ec4c7-62ce-5670-2868-fc9580edd41a.png)

以上で完了。

ウォッチしたリポジトリにあるマニフェストに従い、`demo`というNamespaceが作成され、`podinfo`のDepoymentが作成される。あとHPAも。

```
$ kubectl get po -n demo
NAME                       READY   STATUS    RESTARTS   AGE
podinfo-597bdb4466-qnkt9   1/1     Running   0          3m15s
podinfo-597bdb4466-vlsdk   1/1     Running   0          3m30s
$ kubectl get hpa -n demo
NAME      REFERENCE            TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
podinfo   Deployment/podinfo   <unknown>/99%   2         4         2          10m
$
```

## リポジトリに変更をコミット

フォークしたリポジトリをローカルにクローンする。

```shell
git clone git@github.com:sotoiwa/flux-get-started.git
```

今回はMasterブランチでDeploymeht定義を修正する。

現在デプロイされているDeploymentの`PODINFO_UI_COLOR`環境変数を確認。

```shell-session
$ kubectl get deployments -n demo podinfo -o yaml | grep -2 "name: PODINFO_UI_COLOR"
        - --random-error=false
        env:
        - name: PODINFO_UI_COLOR
          value: green
        image: stefanprodan/podinfo:1.3.2
```

マニフェスト上の`PODINFO_UI_COLOR`環境変数の`green`を`blue`に変える。

```shell
cd flux-get-started/
vi workloads/podinfo-dep.yaml
```

```yaml
...
        env:
        - name: PODINFO_UI_COLOR
          value: blue
...
```

変更をコミットしてpushする。

```shell
git add
git commit
git push
```



デフォルトでは5分間隔で変更をウォッチしているので、しばらく待つとDeploymentが更新されることが確認できる。

```shell-session
$ kubectl get deployments -n demo podinfo -o yaml | grep -2 "name: PODINFO_UI_COLOR"
        - --random-error=false
        env:
        - name: PODINFO_UI_COLOR
          value: blue
        image: stefanprodan/podinfo:1.3.2
$
```

以上。

FluxのPodも非常に軽量なので、とてもよさそうに思える。

```shell-session
$ kubectl top pod
NAME                        CPU(cores)   MEMORY(bytes)
flux-546fdf9957-vbltb       3m           31Mi
memcached-57f9c8d4c-fxn8p   0m           9Mi
$
```