セルフホストGitLabと連携したFlux v2のセットアップ

対象環境は以下の通りです。

- クラスタ：EKS
- Git：AWS上のセルフホストGitLab

このセルフホストGitLabはMarketplaceで公開されているGitLabのAMIを使用しています。セルフホストGitLabにはEIPを付与しており外からアクセスするときはEC2のパブリックホスト名でアクセスしています。レポジトリのホスト名設定はあらかじめこのEC2のパブリックホスト名に設定変更してあります。（デフォルトだと謎のホスト名になっているため）

Flux v2のセットセットアップは[公式のガイド](https://toolkit.fluxcd.io/get-started/)を見ながら進めます。

# FluxCLI

Flux v1の`fluxctl`コマンドとは別で`flux`コマンドをインストールする必要があるようです。公式手順通りにインストールします。

``` sh
brew install fluxcd/tap/flux
```

またbash補完が使えるので以下を`.zshrc`などに追記しておきます。

```
# Flux
command -v flux >/dev/null && . <(flux completion zsh) && compdef _flux flux
```

# GitLabにSSHキーをセットアップ

FluxがGitクローンするのにhttpsかsshを使用します。今回はsshでセルフホストGitLabにアクセスできるようにセットアップします。

## 鍵の作成

作業端末で以下の様に秘密鍵と公開鍵を作成します。パスフレーズは無しで作成します。

``` sh
$ ssh-keygen -t rsa -b 4096
> Generating public/private rsa key pair.
> Enter file in which to save the key (/Users/moriryota62/.ssh/id_rsa): <Key名>
> Enter passphrase (empty for no passphrase): {空エンター}
> Enter same passphrase again: {空エンター}
```

以下のように秘密鍵と公開鍵ができていることを確認します。

``` sh
$ ls <Key名>*
<Key名>     <Key名>.pub
```

秘密鍵は~/.sshに移動しておきます。

``` sh
mv <Key名> ~/.ssh/
```

## GitLabにSSHキーを設定

セルフホストGitLabにログインして以下のようにsshキーを設定します。

- 画面右上のユーザアイコン -> Settings を表示
- 左メニューのSSH Keysを表示
- Keyにさきほど作成した<Key名>.pubの内容を貼り付け、有効期限はなしでも良い
- add keyで鍵を登録

sshでセルフホストGitLabにアクセスできるか確認します。なお、この接続確認ができていないとflux bootstrapに失敗するおそれがあるので必ずします。（多分、~/.ssh/known_hostsにセルフホストGitLabがないからだと思います。）  
そのままEC2のホスト名でアクセスしようとしても名前解決で失敗してしまったためまずは~/.ssh/configに以下設定を追加します。なお、HostNameには間違って**http://など入れない様に注意**しましょう。

```
Host <短縮名>
    HostName <EC2のパブリックなホスト名>
    IdentityFile ~/.ssh/<Key名>
    User git
```

上記設定したら以下コマンドで接続確認します。

``` sh
$ ssh -T <短縮名>
The authenticity of host '<EC2ホスト名>' can't be established.
ECDSA key fingerprint is SHA256:yYBZsicGqwr8pyqCjpNtrPdwYOsmwmDrEtIlvykfVpM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '<EC2ホスト名>' (ECDSA) to the list of known hosts.
Welcome to GitLab, @mo-ri!
```

# Fluxコンポーネントのインストール

kubectlのプロファイルが設定されている状態で以下コマンドを実行し環境をチェックします。

``` sh
$ flux check --pre
► checking prerequisites
✔ kubectl 1.20.0 >=1.18.0-0
✔ Kubernetes 1.19.6-eks-49a6c0 >=1.16.0-0
✔ prerequisites checks passed
```

bootstrapコマンドを実行します。ここでセルフホストGitLabを指定する様にします。GitLabの指定方法は公式だと[ここ](https://toolkit.fluxcd.io/guides/installation/#gitlab-and-gitlab-enterprise)で案内されています。が、GitLabの場合だとsshでうまく接続できず、httpsで接続しようとしてしまう。そこで汎用Gitサーバとして指定してセットアップします。汎用Gitサーバの手順は[ここ](https://toolkit.fluxcd.io/guides/installation/#generic-git-server)

`branch`にはFluxが同期するブランチ名を指定します。`path`はFluxがapplyするマニフェストを配置してある場所を指定します。`private-key`にさきほど作成した秘密鍵をフルパスで指定します。

``` sh
$ flux bootstrap git \
  --url=ssh://git@<EC2ホスト名>/<オーナー名>/<レポジトリ名> \
  --branch=<ブランチ名> \
  --path=<マニフェスト配置場所> \
  --private-key-file=<Key名>
► cloning branch "master" from Git repository "ssh://git@<EC2ホスト名>/<オーナー名>/<レポジトリ名>"
✔ cloned repository
► generating component manifests
✔ generated component manifests
✔ committed sync manifests to "master" ("1954f896fa01d41f4d25396540f4c1cc589bd6cc")
► pushing component manifests to "ssh://git@<EC2ホスト名>/<オーナー名>/<レポジトリ名>"
► installing components in "flux-system" namespace
✔ installed components
✔ reconciled components
► determining if source secret "flux-system/flux-system" exists
► generating source secret
✔ public key: ssh-rsa AAAA~略~
Please give the key access to your repository: y█
► applying source secret "flux-system/flux-system"
✔ reconciled source secret
► generating sync manifests
✔ generated sync manifests
✔ committed sync manifests to "master" ("31ed5a826d968a2254d343c5ac17e6e94af3119d")
► pushing sync manifests to "ssh://git@<EC2ホスト名>/<オーナー名>/<レポジトリ名>"
► applying sync manifests
✔ reconciled sync configuration
◎ waiting for Kustomization "flux-system/flux-system" to be reconciled
✔ Kustomization reconciled successfully
► confirming components are healthy
✔ helm-controller: deployment ready
✔ notification-controller: deployment ready
✔ source-controller: deployment ready
✔ kustomize-controller: deployment ready
✔ all components are healthy
```

以上でFluxの導入は完了です。

Flux関連のコンポーネントがK8sにデプロイできたことが確認できます。

``` sh
$ kubectl get pod -n flux-system
NAME                                      READY   STATUS    RESTARTS   AGE
helm-controller-5bbd94c75-n4hcx           1/1     Running   0          5m46s
kustomize-controller-97dbdcb99-nnbhh      1/1     Running   0          5m45s
notification-controller-d66bdc787-xszzt   1/1     Running   0          5m44s
source-controller-86d84856cf-sxmqt        1/1     Running   0          5m43s
```

# アンインストール

ちなみに削除は以下コマンドでできます。

``` sh
$ flux uninstall
Are you sure you want to delete Flux and its custom resource definitions: y█
► deleting components in flux-system namespace
✔ Deployment/flux-system/helm-controller deleted
✔ Deployment/flux-system/kustomize-controller deleted
✔ Deployment/flux-system/notification-controller deleted
✔ Deployment/flux-system/source-controller deleted
✔ Service/flux-system/notification-controller deleted
✔ Service/flux-system/source-controller deleted
✔ Service/flux-system/webhook-receiver deleted
✔ NetworkPolicy/flux-system/allow-scraping deleted
✔ NetworkPolicy/flux-system/allow-webhooks deleted
✔ NetworkPolicy/flux-system/deny-ingress deleted
✔ ServiceAccount/flux-system/helm-controller deleted
✔ ServiceAccount/flux-system/kustomize-controller deleted
✔ ServiceAccount/flux-system/notification-controller deleted
✔ ServiceAccount/flux-system/source-controller deleted
✔ ClusterRole/crd-controller-flux-system deleted
✔ ClusterRoleBinding/cluster-reconciler-flux-system deleted
✔ ClusterRoleBinding/crd-controller-flux-system deleted
► deleting toolkit.fluxcd.io finalizers in all namespaces
✔ GitRepository/flux-system/flux-system finalizers deleted
✔ Kustomization/flux-system/flux-system finalizers deleted
► deleting toolkit.fluxcd.io custom resource definitions
✔ CustomResourceDefinition/alerts.notification.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/buckets.source.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/gitrepositories.source.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/helmcharts.source.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/helmreleases.helm.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/helmrepositories.source.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/kustomizations.kustomize.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/providers.notification.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/receivers.notification.toolkit.fluxcd.io deleted
✔ Namespace/flux-system deleted
✔ uninstall finished
```

# イメージの自動更新

長くなるので[別の投稿](https://qiita.com/moriryota62/items/fa0bb58beb453e89753c)にしました。