Open5

Raspberry Pi 4 で Microk8s クラスタを作る

satackeysatackey

この記事に従って構築を進めた(Argo CD まで)。
https://www.yukkuriikouze.com/2020/10/26/4026/

2021年6月現在、qemu-binfmt-setup.sh だけで QEMU 5.2 がインストールされる。

$ qemu-x86_64-static --version
qemu-x86_64 version 5.2.0 (Debian 1:5.2+dfsg-9ubuntu3)
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers
satackeysatackey

Traefik の有効化

[https://microk8s.io/docs/addon-traefik](MicroK8s - Add on: Traefik Ingress)

sudo microk8s enable traefik

参考記事は microk8s.subcommand の形だが、公式ドキュメントを見ると現在は microk8s subcommand に変わった模様(microk8s.subcommand も(まだ?)使える)

satackeysatackey

Traefik のポート変更

Add on のデフォルトの設定では Traefik が 8080 / 8443 ポートで立ち上がるので、80 / 443 ポートで立ち上がるように、DaemonSet のマニフェストを書き換える。

  1. まずはマニフェストを適当なファイルに書き出す。
kubectl get daemonset -n traefik traefik-ingress-controller -o yaml > traefik-daemonset.yml
  1. マニフェストを書き換える。

このコンテナは hostNetwork: true なので、hostPortcontainerPort のルーティングはできず、同じポート番号にする必要がある。そのため、コンテナの args も変更しないといけない。

# 117行目付近
# この部分を
          - --entrypoints.web.address=:8080
          - --entrypoints.websecure.address=:8443
# 下記に書き換え
          - --entrypoints.web.address=:80
          - --entrypoints.websecure.address=:443

#(中略)

# 123行目付近
# この部分を
          ports:
          - containerPort: 8080
            hostPort: 8080
            name: http
            protocol: TCP
          - containerPort: 8443
            hostPort: 8443
            name: https
            protocol: TCP
# 下記に書き換え
          ports:
          - containerPort: 80
            hostPort: 80
            name: http
            protocol: TCP
          - containerPort: 443
            hostPort: 443
            name: https
            protocol: TCP
  1. kubectl apply する
kubectl apply -f traefik-daemonset.yml
  1. Container Creating から Runnning になるまで待つ

既存のコンテナは(もちろん)消える。

$ kubectl get pods -n traefik                                                      
NAME                               READY   STATUS              RESTARTS   AGE
traefik-ingress-controller-gkt55   1/1     Running             1          37h
traefik-ingress-controller-9jhsv   1/1     Running             1          37h
traefik-ingress-controller-whxbr   0/1     ContainerCreating   0          1s

$ kubectl get pods -n traefik                                                      
NAME                               READY   STATUS    RESTARTS   AGE
traefik-ingress-controller-whxbr   1/1     Running   0          29m
traefik-ingress-controller-n8xjm   1/1     Running   0          28m
traefik-ingress-controller-lp2qr   1/1     Running   0          28m
  1. 完了

https?://{ノードのIPアドレス}404 page not found が確認できれば完了。

satackeysatackey

Prometheus / Grafana の導入

carlosedp/cluster-monitoring を導入する。

  1. GitHub リポジトリをフォークする。
  2. フォークしたリポジトリをクローンする。
  • vars.jsonnet の 51行目付近、suffixDomain を、{ノードのIP}.nip.io、ないしはカスタムのドメイン名に変える。
    • prometheus.${suffixDomain}grafana.${suffixDomain} で Ingress が追加されるので、カスタムのドメイン名を用いる場合は対応する DNS レコードを追加する。
  • metallbExportertraefikExporterenabled: true にする(25行目、35行目)。
project: default
source:
  repoURL: 'https://github.com/{GitHub のユーザ名}/cluster-monitoring.git'
  path: manifests
  targetRevision: HEAD
  directory:
    recurse: true
    jsonnet: {}
destination:
  server: 'https://kubernetes.default.svc'
  namespace: cluster-monitoring
syncPolicy: {}
  1. マニフェストを生成する。
  • Golang の環境がある場合: make vendor && make
  • Docker の環境がある場合: make docker

終わったら、コミット & プッシュする。

  1. Namespace 作成
kubectl create namespace cluster-monitoring
  1. Argo CD へ Application 登録
  • Argo CD の Web UI にログイン。
  • ApplicationNew App から以下の内容を登録
project: default
source:
  # フォークしたリポジトリの URL
  repoURL: 'https://github.com/satackey/cluster-monitoring.git'
  path: manifests
  targetRevision: HEAD
  directory:
    recurse: true
    jsonnet: {}
destination:
  server: 'https://kubernetes.default.svc'
  namespace: cluster-monitoring
syncPolicy: {}
  • 作成が完了すると下記のようになる。

cluster-monitoring Application が登録され、OutOfSync な図

  1. Sync を押してリポジトリのマニフェストをクラスタにデプロイする。
  • モーダルが出てきたら SYNCHRONIZE を押す。

  • Synced になるまで気長に待つ。

Syncing な図

  • 完了すると、App Health が Healthy に Current Sync Status が Synced になる。途中でリポジトリを更新したりすると MissingOutOfSync になるので、その時はもう一度 Synchronize する。