👏

Weave GitOps Dashboard導入 - おうちでGitOpsシリーズ投稿4/6

2023/06/28に公開

こちらはおうちでGitOpsシリーズの4つ目のポストです。

前回まででGitOps環境も出来上がり、またmetallbも導入して、Kubernetesクラスタ外からもアクセスできるサービスを用意できるようになりました。

今回はflux用のWebインタフェース、Weave GitOps Dashboardを導入していきます。

本シリーズのお約束

  • Kubernetes Cluster on 3 nodes (2 raspberry pi4 - arm64, and 1 amd64 fanless mini PC)
    • flannel for networking
    • flux as a GitOps tool
    • metallb for LoadBalancer service type implementation
  • 1 or more machine running Docker
    • serving GitLab (Used for GitOps central repository)
    • serving Nginx (Reverse proxy to provide access to GitLab and other web services to be created on Kubernetes Cluster)
    • serving Unbound (DNS resolver for machines on LAN)
  • public DNS domain + SSL/TLS certification (for example, Let's Encrypt) recommended
    • they are all mydomain.net in the series
    • replace mydomain.net with your own DNS domain to follow through

More on Docker - Series Top: Dockerで作るおうちLAN遊び場 シリーズ1/7

Interested in getting your own DNS domain?

gitops cliのインストール

https://docs.gitops.weave.works/docs/installation/weave-gitops/

公式ドキュメントを参考に、早速インストールを進めていきます。ドキュメントで触れられているKubernetesクラスタとfluxの用意は済んでいますので、gitops cliのインストールへと進んでいきます。

以下がインストール手順の中で紹介されているコマンドですが、実行するシステムによってはunameあたりの出力がリリースに用意されているファイル名と合致しないかもしれません。その場合はレポジトリのリリースページで実際のファイル名を確認してきて直接指定しましょう。

curl --silent --location "https://github.com/weaveworks/weave-gitops/releases/download/v0.24.0/gitops-$(uname)-$(uname -m).tar.gz" | tar xz -C /tmp
sudo mv /tmp/gitops /usr/local/bin
gitops version

インストールするもののレポジトリはコマンド内のURLの通りです。

https://github.com/weaveworks/weave-gitops

gitops cliでマニフェスト生成

前回flux createコマンドでgit sourceやkustomizationマニフェストを生成しましたが、今回はgitops createでファイルを生成していきます。

例によって"flux-config"レポジトリの/clusters/my-cluster配下に配置しますので、直接出力してしまいましょう。

なお、ダッシュボードにログインする際のユーザ名はadmin、パスワードはここで設定するパスワードとなります。

cd {flux-config directory location}

# password for "admin" user to logon to the web dashboard
PASSWORD="<your password>"

# create YAML manifest file
gitops create dashboard ww-gitops \  
--password=$PASSWORD \  
--export > clusters/my-cluster/weave-gitops-dashboard.yaml

# commit & push
git add -A && git commit -m "Add Weave GitOps Dashboard"
git push

こうして作られたyamlファイルの中身は、HelmRepositoryそしてHelmReleaseのマニフェストとなります。それぞれgitレポジトリとkustomizationのように、ソースと実行レシピのようなイメージで捉えておけばよいと思います。

少し待つと、flux-systemネームスペース上に新たなpodが実行されていることが確認できます。

❯ kubectl get pods -n flux-system
NAME                                       READY   STATUS    RESTARTS      AGE
helm-controller-cbc9bcf8f-7b5sx            1/1     Running   2 (14d ago)   20d
kustomize-controller-69fcfd4f8c-l6tn7      1/1     Running   4 (13d ago)   20d
notification-controller-8469b59fc7-ndlmb   1/1     Running   4 (13d ago)   20d
source-controller-7f47858959-8927x         1/1     Running   2 (14d ago)   20d
ww-gitops-weave-gitops-5685d4fd-5ln79      1/1     Running   0             7d7h

ダッシュボードにアクセスするためのService追加

Weave GitOps公式ドキュメントではこの後、port-forwardという機能でダッシュボードにアクセスできるようにするのですが、このシリーズでは引き続きmetallbを活用していきます。

公式ドキュメントにすぐ答えが書いてありますが、Kubernetesクラスタ上で今実行されているpodで使用しているポート番号を確認すると、9001であることが分かります。またラベルはweave.works/app:weave-gitops-ossなどがセットされていることが分かります。

# check port number
❯ kubectl get pod ww-gitops-weave-gitops-5685d4fd-5ln79 -o=jsonpath='{.spec.containers[0].ports}' -n flux-system
[{"containerPort":9001,"name":"http","protocol":"TCP"}]%

# check labels used
❯ kubectl get pod ww-gitops-weave-gitops-5685d4fd-5ln79 -o=jsonpath='{.metadata.labels}' -n flux-system
{"app.kubernetes.io/instance":"ww-gitops","app.kubernetes.io/name":"weave-gitops","app.kubernetes.io/part-of":"weave-gitops","pod-template-hash":"5685d4fd","weave.works/app":"weave-gitops-oss"}%

それでは/clusters/my-cluster/weave-gitops-svc-lb.yamlといったファイルを用意してレポジトリにpushしましょう。内容は以下の通りです。先程のgitops createですでにダッシュボードのpodができているのですが、それにアクセスするためのLoadBalancerタイプのserviceを作るということで、.spec.selectorで合致するラベルを指定しています。

---
apiVersion: v1
kind: Service
metadata:
  name: weave
  namespace: flux-system
  labels:
    weave.works/app: weave-gitops-oss
    app.kubernetes.io/instance: ww-gitops
    app.kubernetes.io/name: weave-gitops
spec:
  type: LoadBalancer
  selector:
    weave.works/app: weave-gitops-oss
    app.kubernetes.io/instance: ww-gitops
    app.kubernetes.io/name: weave-gitops
  ports:
    - name: http-9001
      protocol: TCP
      port: 9001
      targetPort: 9001

すると、kubectl get svc -n flux-systemで新たに作られた"weave"というサービスが192.168.1.xのExternal-IPを使っていることが分かります。以下のような出力の場合、http://192.168.1.200:9001でダッシュボードにアクセスできるようになっています。

❯ kubectl get svc -n flux-system
NAME                      TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
notification-controller   ClusterIP      10.98.188.167   <none>          80/TCP           33d
source-controller         ClusterIP      10.98.116.158   <none>          80/TCP           33d
weave                     LoadBalancer   10.103.134.70   192.168.1.200   9001:32377/TCP   33d
webhook-receiver          ClusterIP      10.103.219.65   <none>          80/TCP           33d
ww-gitops-weave-gitops    ClusterIP      10.97.101.48    <none>          9001/TCP         33d

Reverse proxyやDNSのセットアップ

Kubernetesクラスタ上に立ち上げたサービスへのアクセスは以上でできましたが、シリーズ冒頭で用意してあるリバースプロキシとDNSも使ってhttpsアクセスできるようにしましょう。

このシリーズの次のポストでhttpsアクセスのセットアップまでスクリプトなどで無理やり自動化する作業を紹介する予定なのですが、今回はひとつひとつ手動でやっていきます。

Nginxの設定

シリーズ1つ目のポストより、DockerでNginxを実行しているマシンには以下のようなディレクトリ・ファイルが残っていると思います。

ここに新たにconf/nginx/weave.confを追加しましょう。

❯ tree
.
 |-docker-compose.yml
 |-conf
 | |-nginx
 | | |-gitlab.conf
 | | |-weave.conf  # NEW
 | |-cert
 | | |-fullchain.pem
 | | |-privkey.pem
 | | |-ssl-base.conf
 | | |-ssl-dhparams.pem
 | | |-ssl-wild.conf
 | |-nginx.conf

内容は以下の通りで、ほぼgitlab.confのコピーです。証明書はワイルドカードですのでサーバ名と流し先を変更するだけで完成です。

  • server_name: weave.mydomain.net
  • upstream: 192.168.1.x (Weaveのserviceで使っているIPアドレス)
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 443 ssl http2;
    server_name weave.mydomain.net;

    # docker resolver - optional for docker nginx upstream/proxy
    resolver 127.0.0.11 valid=30s;

    # upload size
    client_max_body_size 10000M;

    # ssl
    include /etc/nginx/cert/ssl-base.conf;
    include /etc/nginx/cert/ssl-wild.conf;

    location / {
        proxy_http_version 1.1;
        set $upstream_weave 192.168.1.200:9001;
        proxy_pass http://$upstream_weave;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

}

docker compose restart nginxすればもうリバースプロキシの準備は終わりです。

Unbound DNSの設定

DNSについても以下のようなディレクトリ・ファイルが既にあると思います。

❯ tree
.
 |-config
 | |-a-records.conf
 |-docker-compose.yml

config/a-records.confファイルに一行追加しましょう。

local-data: "gitlab.mydomain.net. IN A 192.168.1.55"
local-data: "weave.mydomain.net. IN A 192.168.1.55"

こちらもdocker compose restartで準備完了です。

ダッシュボードへのhttpsアクセス

もうこれだけで完成です!

https://weave.mydomain.netでブラウザはDockerで動かしているNginxへアクセスし、対応するweave.confの内容に従って通信をKubernetesクラスタ上で走っているWeave GitOpsダッシュボードへ流します。

次回は、Kubernetesクラスタ上で実行している各serviceに関してリバースプロキシとDNSの準備も自動で済ませるというセットアップをしていきます。また次回の投稿でもさっと触れますが、今回追加したDNSレコードもNginxのWeave用リバースプロキシサーバ設定もせっかく追加したのですが巻き戻しておきましょう。。。

Discussion