今回はGitLabとFluxを組み合わせる方法を紹介します。
背景
GitLabはGitOpsを実現する方法として、Fluxのインストールを案内しています。FluxはWeaveworks社が管理するGitOspを実現するツールです。Fluxの詳細は過去に紹介したこちらの記事をご覧ください。
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をサポートし続けることをアナウンスしています。
検証
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を指定します。登録方法は前回の記事をご覧ください。
次に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を起動するものです。
検証時はこちらのボタンを選択しても、以下のようにエラーメッセージが表示されてしまいました。残念ながらエラーの原因は今のところ分かっていません。