えんじにあメモ

試してみた技術とか、たまに家電ネタ

おうちk8sにKubernetes Dashboardを導入する

以前作ったおうちk8s の可視化をしてみるべく、Kubernates Dashboard導入の手順まとめておきます

Kubernates Dashboard

インストール

手順自体は公式に書かれていますが、おうちk8s上からNodePort経由で見られるよう構築します

github.com

まず公式のyamlを取得します

$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml

kubernetes-dashboardのServiceTypeがClusterIPとなっているため、NodePortへの変更とnodePort指定の変更をしておきます
nodePortは今回30843としましたが何でもよい or 固定しなくて良ければ指定しなくてOKです

@@ -37,9 +37,11 @@
   name: kubernetes-dashboard
   namespace: kubernetes-dashboard
 spec:
+  type: NodePort
   ports:
     - port: 443
       targetPort: 8443
+      nodePort: 30843
   selector:
     k8s-app: kubernetes-dashboard

また、この状態でデプロイすると証明書エラーとなり表示することができないため、オレオレ証明書を作成して設定します

$ mkdir -p secret/certs
$ openssl req -nodes -newkey rsa:2048 -keyout secret/certs/dashboard.key -out secret/certs/dashboard.csr -subj "/C=/ST=/L=/O=/OU=/CN=kubernetes-dashboard"
$ openssl x509 -req -sha256 -days 365 -in secret/certs/dashboard.csr -signkey secret/certs/dashboard.key -out secret/certs/dashboard.crt

さらにKubernetes Dashboardのログインに使うためのサービスアカウントと権限設定のためのyamlも作成します
これは 公式のドキュメント に載っているyamlと同じものです
admin-user.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1beta1
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

あとはデプロイだけですが、Secretの設定をbase64かけてrecommended.yamlに追記するのは面倒なのでkustomizeを利用したいと思います

以下の内容を kustomization.yaml として保存します

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: kubernetes-dashboard

resources:
  - recommended.yaml
  - admin-user.yaml

secretGenerator:
  - name: kubernetes-dashboard-certs
    files:
      - secret/certs/dashboard.crt
      - secret/certs/dashboard.csr
      - secret/certs/dashboard.key
generatorOptions:
  disableNameSuffixHash: true

certs用のsecretはkustomizeによって作られるので、recommended.yamlkubernetes-dashboard-certsの項目は削除しておきましょう

 ---

-apiVersion: v1
-kind: Secret
-metadata:
-  labels:
-    k8s-app: kubernetes-dashboard
-  name: kubernetes-dashboard-certs
-  namespace: kubernetes-dashboard
-type: Opaque
-
----
-
 kind: ConfigMap
 apiVersion: v1
 metadata:

設定ファイルが全部揃ったのでkustomizeを使ってデプロイしましょう

今までで用意したファイルの構成は以下の通り

.
├── admin-user.yaml
├── kustomization.yaml
├── recommended.yaml
└── secret
    └── certs
        ├── dashboard.crt
        ├── dashboard.csr
        └── dashboard.key

kubernetes1.14からkustomizeがkubectlに統合されているので別途インストールは不要です

# デプロイされるリソースの確認
$ kubectl kustomize .

デプロイします
$ kubectl apply -k .

動作確認

Kubernetes Dashboardをブラウザで開いてみましょう

$ open https://$(kubectl get nodes --namespace kubernetes-dashboard -o jsonpath="{.items[0].status.addresses[0].address}"):30843

f:id:shosfs:20200307234855p:plain

ログインにはトークンが必要なため、secretの値で確認します

$ kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}') -o jsonpath="{.data.token}" | base64 -D

出力された値をコピーして「トークン」に入力します f:id:shosfs:20200307235158p:plain

サインインができて正しく表示されればOK 🎉 f:id:shosfs:20200308000848p:plain

metrics-server

公式のドキュメント にもありますが metrics-server を入れることでCPUとメモリ使用量をKubernetes Dashboardに追加することができます

自分のおうちk8sはラズパイ上で動いており、公式のyamlはラズパイ用(arm)向けになっていないのでそこを変更してデプロイします

$ git clone https://github.com/kubernetes-sigs/metrics-server.git

変更点は deploy/kubernetes/metrics-server-deployment.yaml の以下部分

@@ -29,7 +29,7 @@ spec:
         emptyDir: {}
       containers:
       - name: metrics-server
-        image: k8s.gcr.io/metrics-server-amd64:v0.3.6
+        image: k8s.gcr.io/metrics-server-arm:v0.3.6
         args:
           - --cert-dir=/tmp
           - --secure-port=4443
@@ -42,9 +42,13 @@ spec:
           runAsNonRoot: true
           runAsUser: 1000
         imagePullPolicy: IfNotPresent
+        command:
+         - /metrics-server
+         - --kubelet-insecure-tls
+         - --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname
         volumeMounts:
         - name: tmp-dir
           mountPath: /tmp
       nodeSelector:
         beta.kubernetes.io/os: linux
-        kubernetes.io/arch: "amd64"
+        kubernetes.io/arch: "arm"

commandの変更は 参考にした記事 のまま同様の変更を行いましたが、最新版も同じ修正が必要かどうかは未調査 🤔

デプロイします

$ kubectl apply -f metrics-server/deploy/kubernetes

無事CPU/メモリ使用量も確認できるようになりました 🎉 f:id:shosfs:20200308003955p:plain

まとめ

可視化したからどうなったわけではないですが、グラフィカルに見えるとなんか嬉しいです

久しぶりにkustomize使ってみたら結構いろんな機能が増えていた(知らなかっただけ?)のと、
GitHubのサンプルだけだと分かりづらいな、と思ってたら 公式のDoc も用意されてて(これも知らなかった)、設定ファイルが簡単に書けるようになりました

また、PrometheusとGrafanaの導入も合わせて書こうと思ってたけど、Kubernetes Dashboardだけで結構なボリュームになってしまったので次回書きます

今回作ったもの

以下に置いておきます

github.com

参考