今回はWeave GitOpsというFluxのリソースを可視化するツールを試してみます。
Weave GitOpsとは
Weave GitOpsはWeaveworks社が開発しているGUIツールで、OSSのほかEnterprise用も用意されています。同社が開発元となったFluxはデフォルトではWeb GUI機能を提供しておらず、リソースの管理はflux CLIツールで行う形となっています。Weave GitOpsを使用することで、FluxにWeb GUIの機能を追加し、Fluxのオブジェクト間の関係を把握しやすくなるなどの効果を期待できます。
Weave GitOpsは主に以下のような機能を提供します。
- Application View: クラスター全体のデプロイの状態を表示する。具体的にはFluxの
Kustomization
HelmRelease
リソースの情報を表示する。 - Sources View:
Kustomization
などが管理するリソース (GitRepository
HelmRepository
など) の同期状態などを表示する。 - Flux Runtime View: Flux自身のリソース (
helm-controller
など) の状態を表示する
※参考リンク:
Weave GitOpsを動かす
ここからWeave GitOpsを試してみます。
0. Fluxのインストール
Weave GitOpsを使うため、FluxをインストールしたKubernetesクラスターを用意します。Kubernetesのバージョンは以下の通り、Amazon EKSを使います。
$ kubectl version Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T18:03:20Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"22+", GitVersion:"v1.22.15-eks-fb459a0", GitCommit:"be82fa628e60d024275efaa239bfe53a9119c2d9", GitTreeState:"clean", BuildDate:"2022-10-24T20:33:23Z", GoVersion:"go1.16.15", Compiler:"gc", Platform:"linux/amd64"}
Fluxのインストールは flux CLIで行います。 Weave GitOpsを使うにはFluxのバージョンを 0.32.0
以上にする必要があります。必要に応じて flux CLIのバージョンを更新しておきます。
※参考リンク:
$ flux --version flux version 0.24.1 # flux CLIのバージョンを更新 $ curl -s https://fluxcd.io/install.sh | sudo bash [INFO] Downloading metadata https://api.github.com/repos/fluxcd/flux2/releases/latest [INFO] Using 0.37.0 as release [INFO] Downloading hash https://github.com/fluxcd/flux2/releases/download/v0.37.0/flux_0.37.0_checksums.txt [INFO] Downloading binary https://github.com/fluxcd/flux2/releases/download/v0.37.0/flux_0.37.0_linux_amd64.tar.gz [INFO] Verifying binary download [INFO] Installing flux to /usr/local/bin/flux $ flux --version flux version 0.37.0
Fluxのインストールを行います。
# Fluxをインストールするための前提条件を確認 $ flux check --pre ► checking prerequisites ✔ Kubernetes 1.22.15-eks-fb459a0 >=1.20.6-0 ✔ prerequisites checks passed # Fluxインストール $ flux install ✚ generating manifests ✔ manifests build completed ► installing components in flux-system namespace (一部割愛) ◎ verifying installation ✔ helm-controller: deployment ready ✔ kustomize-controller: deployment ready ✔ notification-controller: deployment ready ✔ source-controller: deployment ready ✔ install finished # インストール後 $ kubectl get pods -n flux-system NAME READY STATUS RESTARTS AGE helm-controller-85b89f8958-55tcf 1/1 Running 0 41s kustomize-controller-59d6498d5-8vzkh 1/1 Running 0 41s notification-controller-7cf6f94f46-75znj 1/1 Running 0 41s source-controller-b8bf68987-xtcjw 1/1 Running 0 41s
1. gitops
CLIのインストール
Weave GitOpsは gitops
というCLIツールを提供しており、インストールなどの管理を行います。まずは gitops
CLIのインストールを行います。
$ curl --silent --location "https://github.com/weaveworks/weave-gitops/releases/download/v0.10.2/gitops-$(uname)-$(uname -m).tar.gz" | tar xz -C /tmp $ sudo mv /tmp/gitops /usr/local/bin # インストール後の確認 $ gitops version Current Version: 0.10.2 GitCommit: 56d11cb9a8d14670eec713e9e3fe105da0e18476 BuildTime: 2022-11-10T15:22:34Z Branch: releases/v0.10.2
Weave GitOpsをインストールするため、今回は gitops
CLIからマニフェストファイルを生成します。
$ mkdir weave-gitops-dashboard-test $ cd weave-gitops-dashboard-test/ # Weave GitOpsへのログイン用パスワードを設定 $ PASSWORD="password1234" # マニフェストファイルを生成 $ gitops create dashboard ww-gitops \ > --password=$PASSWORD \ > --export > ./weave-gitops-dashboard.yaml $
生成されたマニフェストファイルの内容は以下の通りです。
--- apiVersion: source.toolkit.fluxcd.io/v1beta2 kind: HelmRepository metadata: annotations: metadata.weave.works/description: This is the Weave GitOps Dashboard. It provides a simple way to get insights into your GitOps workloads. labels: app.kubernetes.io/component: ui app.kubernetes.io/created-by: weave-gitops-cli app.kubernetes.io/name: weave-gitops-dashboard app.kubernetes.io/part-of: weave-gitops name: ww-gitops namespace: flux-system spec: interval: 1h0m0s type: oci url: oci://ghcr.io/weaveworks/charts --- apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: ww-gitops namespace: flux-system spec: chart: spec: chart: weave-gitops sourceRef: kind: HelmRepository name: ww-gitops interval: 1h0m0s values: adminUser: create: true passwordHash: $2a$10$hHCPY3uBf5p63hZUL1mCe.Y6M8W3/H/G0wa.szdarMYIVUIgLyCOC username: admin
※参考リンク:
2. Weave GitOpsのインストール
上記マニフェストファイルをデプロイし、Weave GitOpsをインストールします。
$ kubectl apply -n flux-system -f weave-gitops-dashboard.yaml helmrepository.source.toolkit.fluxcd.io/ww-gitops created helmrelease.helm.toolkit.fluxcd.io/ww-gitops created # インストール後のリソース $ kubectl get helmrepository -n flux-system NAME URL AGE READY STATUS ww-gitops oci://ghcr.io/weaveworks/charts 3m40s True Helm repository is ready $ kubectl get helmrelease -n flux-system NAME AGE READY STATUS ww-gitops 3m54s True Release reconciliation succeeded $ kubectl get pods -n flux-system NAME READY STATUS RESTARTS AGE helm-controller-85b89f8958-55tcf 1/1 Running 0 9m48s kustomize-controller-59d6498d5-8vzkh 1/1 Running 0 9m48s notification-controller-7cf6f94f46-75znj 1/1 Running 0 9m48s source-controller-b8bf68987-xtcjw 1/1 Running 0 9m48s ww-gitops-weave-gitops-5f6876dd6d-kt7vs 1/1 Running 0 14s $ kubectl get svc -n flux-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE notification-controller ClusterIP 10.100.108.183 <none> 80/TCP 10m source-controller ClusterIP 10.100.175.133 <none> 80/TCP 10m webhook-receiver ClusterIP 10.100.26.54 <none> 80/TCP 10m ww-gitops-weave-gitops ClusterIP 10.100.208.91 <none> 9001/TCP 49s $ kubectl get secret -n flux-system NAME TYPE DATA AGE cluster-user-auth Opaque 2 86s default-token-rp2vz kubernetes.io/service-account-token 3 11m helm-controller-token-sjmld kubernetes.io/service-account-token 3 11m kustomize-controller-token-nxkgf kubernetes.io/service-account-token 3 11m notification-controller-token-s85bq kubernetes.io/service-account-token 3 11m sh.helm.release.v1.ww-gitops.v1 helm.sh/release.v1 1 86s source-controller-token-nhtww kubernetes.io/service-account-token 3 11m ww-gitops-weave-gitops-token-6ntjv kubernetes.io/service-account-token 3 86s $ kubectl get secret -n flux-system cluster-user-auth -oyaml apiVersion: v1 data: password: JDJhJDEwJGhIQ1BZM3VCZjVwNjNoWlVMMW1DZS5ZNk04VzMvSC9HMHdhLnN6ZGFyTVlJVlVJZ0x5Q09D username: YWRtaW4= kind: Secret metadata: annotations: meta.helm.sh/release-name: ww-gitops meta.helm.sh/release-namespace: flux-system creationTimestamp: "2022-12-03T04:52:54Z" labels: app.kubernetes.io/managed-by: Helm helm.toolkit.fluxcd.io/name: ww-gitops helm.toolkit.fluxcd.io/namespace: flux-system name: cluster-user-auth namespace: flux-system resourceVersion: "5178" uid: 15933161-0af9-46db-99e5-8c3bfae2d47b type: Opaque
Web GUIにアクセスするため、port-forwardします。
$ kubectl port-forward svc/ww-gitops-weave-gitops -n flux-system 9001:9001 Forwarding from 127.0.0.1:9001 -> 9001 Forwarding from [::1]:9001 -> 9001
http://localhost:9001
にアクセスすると以下の画面が表示されるので、設定したパスワードでログインします。
※参考リンク:
3. Weave GitOpsを眺める
ここからWeave GitOpsの画面を見てみます。
※参考リンク:
Application View
Applications Viewは、 Kustomization
HelmRelease
のリソースの状態を表示します。この時点では Weave GitOpsを管理する HelmRelease
のみが表示されます。
ww-gitops
を選択すると、このリソース自身の情報や、管理しているリソースの名称と状態が表示されます。
HelmRelease
に対しては、リソースの同期状態を操作することができます。
ここで管理しているリソースを選択すると、そのリソースのマニフェストの情報が表示されます。なお、ここでマニフェストファイルを編集することはできないようです。
EVENTS
タブを開くと、ww-gitops
自体のKubernetesイベントを表示します。
GRAPH
タブを開くと、ww-gitops
の管理するリソース間の関係がグラフで表示されます。
DEPENDENCIES
タブを開くと、Kustomization
HelmRelease
内で定義した依存関係が表示されます。ここでは何も依存関係がないので表示されませんが、後程試してみます。
YAML
タブを開くと、 ww-gitops
自身のマニフェストファイルが表示されます。
Sources View
Sources Viewは、 Kustomization
HelmRelease
の管理するリソースの状態を表示します。
各リソースを選択すると、以下のように Applications Viewと似たような画面が表示され、リソース自体の情報やKubernetesイベント、マニフェストファイルなどが確認できます。
Flux Runtime View
Flux Runtime Viewは、Flux自身のリソースの状態を表示します。
4. 実際にアプリケーションを管理した状態を眺める
ここで、実際にアプリケーションをデプロイしてみます。今回は以下のようにマニフェストファイルを生成し、それを使いました。
# マニフェストファイルの生成 $ flux create source git podinfo \ > --url=https://github.com/stefanprodan/podinfo \ > --branch=master \ > --interval=30s \ > --export > ./podinfo-source.yaml $ flux create kustomization podinfo \ > --target-namespace=default \ > --source=podinfo \ > --path="./kustomize" \ > --prune=true \ > --interval=5m \ > --export > ./podinfo-kustomization.yaml # アプリケーションのデプロイ $ kubectl apply -n flux-system -f podinfo-source.yaml gitrepository.source.toolkit.fluxcd.io/podinfo created $ kubectl apply -n flux-system -f podinfo-kustomization.yaml kustomization.kustomize.toolkit.fluxcd.io/podinfo created
Weave GitOpsから見ると、上記アプリケーションが確認できます。
なお、この時点ではMetrics Serverをクラスターにデプロイしていないため、HPAのリソースの状態は Not Ready
となっています。
DEPENDENCIES
を試す
最後に DEPENDENCIES
がどう表示されるか試してみます。Fluxでは spec.dependsOn
という項目でリソース間の依存関係を定義することができます。今回は以下のようなマニフェストファイルを用意し、先ほど作成した podinfo
リソースと依存関係のある状態を作ります。
--- apiVersion: kustomize.toolkit.fluxcd.io/v1beta2 kind: Kustomization metadata: name: podinfo-2 namespace: flux-system spec: dependsOn: - name: podinfo interval: 5m0s path: ./kustomize prune: true sourceRef: kind: GitRepository name: podinfo targetNamespace: flux-system
上記ファイルを使ってリソースを作成すると、 Weave GitOpsの DEPENDENCIES
配下のように表示されます。
感想
今回はFluxのリソースを可視化するWeave GitOpsを試してみました。これまでGitOpsの可視化といえばArgoCDのUIばかり使っていたのですが、ArgoCDと同じ感覚で使い始めるとかなり勝手が違うので、最初は少し戸惑いました。
Weave GitOpsを触った限り、GUIから管理するリソースを編集したり、管理するPodのログを確認することはできないため、各リソースの詳細な状態確認やトラブル時の暫定対応をすることは難しいと感じました。あくまでWeave GitOpsはFluxの管理するリソースの状態を要約して表示してくれるものであり、Flux自体をサポートするためのもの、ととらえて使ったほうがよさそうに感じました。
ただ、リソース間の依存関係を表す DEPENDENCIES
などは、現状Weave GitOpsにしかない機能であり、複数のリソースを組み合わせてシステムを構築する場合は便利そうだなとも感じました。
そもそも、ArgoCDとFluxではGUIへのアプローチが異なる、という指摘があります。
However, Flux and Argo have a different approach to GUIs, Richardson noted. Flux has an API-led approach that enables multiple GUIs. Platforms such as Weaveworks, AWS, Azure and D2IQ provide GUIs that are integrated with their own security and workflows, he said, adding Weave GitOps is “the main open source GUI.”
※引用元: Argo CD and Flux Are CNCF Grads: But What Now?
なので、ArgoCD UIとは使い道が違うことを理解したうえで、採用するか否かを検討するほうがよさそうです。