TECHSTEP

ITインフラ関連の記事を公開してます。

GitLabとFluxを連携する

今回はGitLabとFluxを組み合わせる方法を紹介します。

docs.gitlab.com

背景

GitLabはGitOpsを実現する方法として、Fluxのインストールを案内しています。FluxはWeaveworks社が管理するGitOspを実現するツールです。Fluxの詳細は過去に紹介したこちらの記事をご覧ください。

techstep.hatenablog.com

GitLabでFluxを利用する場合、合わせてGitLab agent for Kubernetesのインストールも推奨されています。FluxはGitLab上のコードとクラスター上のリソースとの同期をサポートする一方、GitLab agentはFluxのインストール・GitLabからKubernetesへのアクセス・ダッシュボードでのKubernetesリソースの表示などをサポートします。そのためFluxとGitLab agentを組み合わせることで、GitLabとKubernetesとの連携をより強化できます。

※参考: Flux / GitLab agentによるデプロイの流れ (GitLabドキュメントより)

なおFluxをサポートするWeaveworks社の閉鎖に伴い、同社のサポートするOSSもメンテナンスされなくなるのでは、という懸念がありましたが、GitLabはFluxをサポートし続けることをアナウンスしています。

about.gitlab.com

検証

Fluxの検証のため、事前にGitLab Project / Amazon EKSクラスターを用意しておきます。なおProjectを作成していない場合はFlux bootstrap時に指定した名称のProjectが作成されるので、なくても大丈夫です。

# AWS CloudShellから操作
[cloudshell-user@ip-10-134-18-67 ~]$ kubectl version
Client Version: v1.30.0-eks-036c24b
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.29.7-eks-2f46c53
[cloudshell-user@ip-10-134-18-67 ~]$ kubectl get pods -A
NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE
kube-system   aws-node-bt7tt             2/2     Running   0          41m
kube-system   aws-node-hn46z             2/2     Running   0          42m
kube-system   coredns-676bf68468-wfjlc   1/1     Running   0          44m
kube-system   coredns-676bf68468-xbmwr   1/1     Running   0          44m
kube-system   kube-proxy-ccdnn           1/1     Running   0          42m
kube-system   kube-proxy-p87kh           1/1     Running   0          41m
[cloudshell-user@ip-10-134-18-67 ~]$ 

今回はGitLabドキュメントの案内する手順をベースに、一部修正した手順でFluxのインストールと検証を行いました。

Fluxのインストール

まずFluxをクラスターにインストールします。ここでは flux bootstrap コマンドを使い、FluxのインストールとGitLabリポジトリへのFlux定義ファイルの配置を行います。ただしFluxがGitLabリポジトリにコミットするには権限を付与する必要があるため、事前にPersonal access tokenを用意します。

なおPersonal access tokenでなくProject access tokenでできないかも試したのですが、そちらはエラーとなりました。

トークンを作成後は flux コマンドのインストールと flux bootstrap コマンドを実行します。

# fluxコマンドのインストール
[cloudshell-user@ip-10-134-18-67 ~]$ curl -s https://fluxcd.io/install.sh | sudo bash
[INFO]  Downloading metadata https://api.github.com/repos/fluxcd/flux2/releases/latest
[INFO]  Using 2.3.0 as release
[INFO]  Downloading hash https://github.com/fluxcd/flux2/releases/download/v2.3.0/flux_2.3.0_checksums.txt
[INFO]  Downloading binary https://github.com/fluxcd/flux2/releases/download/v2.3.0/flux_2.3.0_linux_amd64.tar.gz
[INFO]  Verifying binary download
which: no shasum in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/var/lib/snapd/snap/bin)
[INFO]  Installing flux to /usr/local/bin/flux
[cloudshell-user@ip-10-134-18-67 ~]$ flux --version
flux version 2.3.0
[cloudshell-user@ip-10-134-18-67 ~]$ 

# Fluxインストール
[cloudshell-user@ip-10-134-18-67 ~]$ export GITLAB_TOKEN=<GitLab Personal access token>
[cloudshell-user@ip-10-134-18-67 ~]$ flux bootstrap gitlab \
>  --deploy-token-auth \
>  --owner=fy0323 \
>  --repository=flux-test \
>  --branch=main \
>  --path=clusters/eks-cluster \
>  --personal

(割愛)

✔ all components are healthy
[cloudshell-user@ip-10-134-18-67 ~]$ 

# インストール後の確認
[cloudshell-user@ip-10-134-18-67 ~]$ kubectl get ns
NAME              STATUS   AGE
default           Active   56m
flux-system       Active   2m7s
kube-node-lease   Active   56m
kube-public       Active   56m
kube-system       Active   56m
[cloudshell-user@ip-10-134-18-67 ~]$ kubectl get pods -n flux-system
NAME                                       READY   STATUS    RESTARTS   AGE
helm-controller-5f7457c9dd-mrxlz           1/1     Running   0          2m16s
kustomize-controller-5f58d55f76-bljnj      1/1     Running   0          2m16s
notification-controller-685bdc466d-jxlfj   1/1     Running   0          2m16s
source-controller-86b8b57796-nvqjv         1/1     Running   0          2m16s
[cloudshell-user@ip-10-134-18-67 ~]$ 

Fluxのインストール後は以下のようにファイルが配置されます。

GitLab agent for Kubernetesのインストール

次にGitLab agent for Kubernetesをインストールします。詳細は以前の記事を見ていただければと思いますが、今回もKubernetesダッシュボードを利用するため、 config.yaml ファイルを用意しておきます。

なおGitLabドキュメントにはFluxを利用してGitLab agentをインストールする方法も紹介されています。こちらも簡単に試したので、ログを残しておきます。

※こちらのクリックすると作業ログを表示します

すでにGitLab agentをインストールしている場合は作業前に削除しておきます。

# インストール済みのGitLab agentを削除
[cloudshell-user@ip-10-134-18-67 ~]$ kubectl delete ns gitlab-agent-eks-cluster
namespace "gitlab-agent-eks-cluster" deleted

まずはGitLab agent用のNamespaceを作成するため、以下のようにGitLabにファイルを配置します。

次にGitLab agentの登録をGitLab画面から行います。この時もダッシュボードにアクセスしたい場合はAgentを指定します。登録方法は前回の記事をご覧ください。

techstep.hatenablog.com

次にGitLab agent登録時に発行されるトークンを使うため、以下のようなSecretリソースを作成します。なおここではSecretリソースを kubectl コマンドでデプロイしていますが、GitOpsを利用する際は秘匿情報を含むファイルはGit管理しない、または秘匿情報を直接記載しないようにすることが推奨されているためです。

[cloudshell-user@ip-10-134-18-67 ~]$ vi secret-gitlab.yaml

[cloudshell-user@ip-10-134-18-67 ~]$ cat secret-gitlab.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: gitlab-agent-token
  namespace: gitlab
type: Opaque
stringData:
  token: "<GitLab agentトークン>"

[cloudshell-user@ip-10-134-18-67 ~]$ kubectl apply -f secret-gitlab.yaml -n gitlab
secret/gitlab-agent-token created

次に以下のような agentk.yaml ファイルをリポジトリに配置します。これはGitLab agentの定義ファイルを管理するHelmリポジトリを指定するものです。

※本記事記載時はGitLabドキュメントにあるファイルAPIが古いものを指していたため、修正しています。

---
# apiVersion: source.toolkit.fluxcd.io/v1beta2
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  labels:
    app.kubernetes.io/component: agentk
    app.kubernetes.io/created-by: gitlab
    app.kubernetes.io/name: agentk
    app.kubernetes.io/part-of: gitlab
  name: gitlab-agent
  namespace: gitlab
spec:
  interval: 1h0m0s
  url: https://charts.gitlab.io
---
# apiVersion: helm.toolkit.fluxcd.io/v2beta1
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: gitlab-agent
  namespace: gitlab
spec:
  chart:
    spec:
      chart: gitlab-agent
      sourceRef:
        kind: HelmRepository
        name: gitlab-agent
        namespace: gitlab
  interval: 1h0m0s
  values:
    config:
      kasAddress: "wss://kas.gitlab.com"
      secretName: gitlab-agent-token

上記ファイルを配置後、コンソールからリソースの作成を確認します。

[cloudshell-user@ip-10-134-18-67 ~]$ kubectl get helmrepository -n gitlab
NAME           URL                        AGE   READY   STATUS
gitlab-agent   https://charts.gitlab.io   41s   True    stored artifact: revision 'sha256:0fc0a2cdb1a8ce1f6d6941f7c3193a8c56967206bd6607785b1bb133b5c964cf'

[cloudshell-user@ip-10-134-18-67 ~]$ kubectl get helmrelease -n gitlab
NAME           AGE   READY   STATUS
gitlab-agent   49s   True    Helm install succeeded for release gitlab/gitlab-agent.v1 with chart gitlab-agent@2.6.2

[cloudshell-user@ip-10-134-18-67 ~]$ kubectl get pods -n gitlab
NAME                              READY   STATUS    RESTARTS   AGE
gitlab-agent-v2-965b4b577-5pjmd   1/1     Running   0          72s
gitlab-agent-v2-965b4b577-lbpr2   1/1     Running   0          72s
[cloudshell-user@ip-10-134-18-67 ~]$ 

GitOpsの動作確認

Flux / GitLab agentのインストールを完了したので、GitLabリポジトリのFlux定義ファイルを配置するディレクトリ (今回は clusters/eks-cluster ) 配下に以下のファイルを配置してみます。なおここで使用するファイルはFluxのドキュメントにあるものを使っています。

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 1m0s
  ref:
    branch: master
  url: https://github.com/stefanprodan/podinfo
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 30m0s
  path: ./kustomize
  prune: true
  retryInterval: 2m0s
  sourceRef:
    kind: GitRepository
    name: podinfo
  targetNamespace: default
  timeout: 3m0s
  wait: true

上記ファイルを配置後にクラスター上のリソースを確認します。

# リソースの確認
[cloudshell-user@ip-10-134-18-67 ~]$ kubectl get gitrepository -A
NAMESPACE     NAME          URL                                       AGE   READY   STATUS
flux-system   flux-system   https://gitlab.com/fy0323/flux-test.git   17m   True    stored artifact for revision 'main@sha1:b307818eb8dcc373aff2bab5823d1aca0d7cbf92'
flux-system   podinfo       https://github.com/stefanprodan/podinfo   3s    True    stored artifact for revision 'master@sha1:08238eada746de8114efa36d36e2aa93bd76cfab'

[cloudshell-user@ip-10-134-18-67 ~]$ kubectl get kustomization -A
NAMESPACE     NAME          AGE   READY   STATUS
flux-system   flux-system   20m   True    Applied revision: main@sha1:63a639a13720e4d9f28bbc43a76f99c2f0795ef5
flux-system   podinfo       38s   True    Applied revision: master@sha1:08238eada746de8114efa36d36e2aa93bd76cfab

[cloudshell-user@ip-10-134-18-67 ~]$ kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
podinfo-5c7645ffd9-jrf8z   1/1     Running   0          40s
podinfo-5c7645ffd9-ssxj4   1/1     Running   0          25s

Kubernetesダッシュボードの作成と確認

最後にKubernetesダッシュボードの作成と操作を行います。今回はGitLabとFluxが連携する機能としてダッシュボード上からFluxの同期状態の確認を行います。

まずダッシュボードを作成するためGitLab Environmentの作成を行います。この時Kubernetes Namepaceの項目に flux-system を指定します。Kubernetes Namespaceを指定するとその下に Fluxリソースを選択 というオプションが表示されます。

このオプションはEnvironment作成時に存在する Kustomization HelmRelease を選択し、それらとの同期状態を表示できます。ここでは podinfo というKustomizationを選択します。

この設定でEnvironmentを作成すると、ダッシュボードには flux-system Namespace上のリソースが表示されます。また画面右上には Flux Sync という項目があり、ここが 照合済み (Reconciled) となっています。これはFluxとクラスター上のリソースが同期されていることを示すメッセージです。

ここで 照合済み というメッセージを選択すると、Environment作成時に指定したKustomizationの情報が表示されます。

なお表示した画面には Trigger reconciliation というボタンがあり、これは手動でFlux reconciliationを起動するものです。

検証時はこちらのボタンを選択しても、以下のようにエラーメッセージが表示されてしまいました。残念ながらエラーの原因は今のところ分かっていません。