TECHSTEP

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

Weave GitOpsを試す

今回は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とは使い道が違うことを理解したうえで、採用するか否かを検討するほうがよさそうです。