Raspberry PiによるKubernetesクラスターに、Kubernetes Dashboardをインストールする

3台のRaspberry Pi 4で構築したKubernetesクラスターに、アプリやリソースをGUI上で管理できるKubernetes Dashboardをインストールしました。

Kubernetes Dashboardでクラスターの状態を一括管理


Kubernetes Dashboardは、KubernetesをGUIで管理できるWebアプリです。動作中のアプリやリソースの状態を確認したり、新しいアプリをデプロイしたりすることができます。
今回は、 Raspberry Pi 4で構築したKubernetesクラスター にインストールしてみました。

作業手順

次のような手順で作業を進めます。

  1. Kubernetes Dashboardをインストール
  2. Kubernetes Metrics Serverをインストール
  3. ログイン用トークンを作成
  4. https通信のための証明書を作成し、設定

Kubernetes Dashboardをインストール

Kubernetes Dashboardのデプロイ用マニフェストをダウンロードします。

1
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

前回、L2ロードバランサーであるMetalLBをインストールしました。Kubernetes DashboardをMetalLB経由でアクセスするように、マニフェストに type: LoadBalancer を追加します。

1
$ vi recommended.yaml

下記の先頭が + で始まっている行を追加します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 kind: Service 
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
+ type: LoadBalancer

修正しましたら、デプロイします。

1
$ kubectl apply -f recommended.yaml

Kubernetes Metrics Serverをインストール

Kubernetes Metrics Serverのデプロイ用マニフェストをダウンロードし、修正を行います。

1
2
$ wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml
$ vi components.yaml

修正は2箇所です。

  • コンテナの実行時オプションの追加
    • --kubelet-insecure-tls
    • --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname
  • コンテナイメージのアーキテクチャの変更
    • amd64arm64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
       containers:
- name: metrics-server
image: k8s.gcr.io/metrics-server/metrics-server:v0.3.7
imagePullPolicy: IfNotPresent
args:
- --cert-dir=/tmp
- --secure-port=4443
+ - --kubelet-insecure-tls
+ - --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname
ports:
- name: main-port
containerPort: 4443
protocol: TCP
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- name: tmp-dir
mountPath: /tmp
nodeSelector:
kubernetes.io/os: linux
- kubernetes.io/arch: "amd64"
+ kubernetes.io/arch: "arm64"

修正しましたら、デプロイします。

1
$ kubectl apply -f components.yaml

ログイン用トークンを作成

Kubernetes Dashboardにログインするときに使う、admin-userのトークンを作成します。
以下のようなマニフェストを作成して、適用します。

1
$ vi admin-user.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
1
$ kubectl apply -f admin-user.yaml

作成したトークンを表示するには、次のコマンドを実行します。

1
$ kubectl describe secret -n kubernetes-dashboard $(kubectl get secret -n kubernetes-dashboard | grep admin-user | awk '{print $1}') | grep ^token:

ログインする際に token: 以降に表示される、ランダムな文字列が必要になりますので、控えておきます。

https通信のための証明書については、別の記事にまとめます。
いったん、ここまでで接続を確認してみましょう。

Kubernetes Dashboardの CLUSTER-IP を調べます。

1
2
3
4
$ kubectl get service -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.105.200.164 <none> 8000/TCP 7d
kubernetes-dashboard LoadBalancer 10.110.37.54 192.168.1.250 443:31581/TCP 7d

上記の場合なら https://192.168.1.250/ にアクセスします。
証明書が適切に設定されていないため、次のような表示になります。

証明書に関する警告が表示されます

「詳細設定」をクリックして、アクセスすると、ログイン画面が表示されます。

ログイン画面が表示されます

先に控えたトークンを入力すると、Kubernetes Dashboardが表示されます。
最上部のフィルター画面で「すべてのネームスペース」を選ぶと、全リソースが表示されます。

Kubernetes Dashboardが表示されます

以上です。