Kubernetes Dashboard v2.0.0をデプロイする

Kubernetes Dashboard v2.0.0をデプロイする

November 25, 2019
Kubernetes
kubernetes, kubernetes-dashboard

いつの間にかv2.0.0がリリースされていた(まだベータだけど) https://github.com/kubernetes/dashboard/releases

デプロイした際にそのままマニフェストデプロイだとうまく行かなかったので手順メモ

環境

ソフトバージョン
kubernetesv1.14
OSHypriotOS, Raspbian GNU/Linux 9 (stretch)
kubernetes-dashboardv2.0.0-beta3

マニフェストのダウンロード

リリースページ記載のリンクから一度マニフェストをローカルに落とします。 必要なnamespaceとかも作って欲しいので一度applyしておきます。

$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta3/aio/deploy/recommended.yaml
$ kubectl apply -f recommended.yaml

ServiceをNodePortに変更する

デフォルトだとClusterIPになってますが、これだとクラスタ内からしかアクセスできず不便なので、NodePortに変えておきます.

recommended.yamlを以下のように編集します

---
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
+  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
+      nodePort: 30843
  selector:
    k8s-app: kubernetes-dashboard
---

再びデプロイします。

$ kubectl apply -f recommended.yaml

確認します。 dashboardがNodePortで公開されています (ちなみにv2.0.0からnamespaceもkube-systemからkubernetes-dashboardへ変わったよう)

$ kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.97.146.221   <none>        8000/TCP        24m
kubernetes-dashboard        NodePort    10.100.103.41   <none>        443:30843/TCP   24m

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

NodeのIPを確認します。(以下は環境によって異なると思うので各自の環境に合わせてください)

$ kubectl get no -owide
NAME     STATUS   ROLES    AGE    VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION   CONTAINER-RUNTIME
master   Ready    master   118d   v1.14.1   192.168.13.101   <none>        Raspbian GNU/Linux 9 (stretch)   4.14.98-v7+      docker://18.9.0
node-1   Ready    <none>   118d   v1.14.1   192.168.13.102   <none>        Raspbian GNU/Linux 9 (stretch)   4.14.98-v7+      docker://18.9.0
node-2   Ready    <none>   117d   v1.14.1   192.168.13.103   <none>        Raspbian GNU/Linux 9 (stretch)   4.14.98-v7+      docker://18.9.0

先ほどのNodePortで指定したIPと合わせて、アクセスします。

https://192.168.13.102:30843

が、しかし以下のようなエラーでアクセスできないと思います。

image.png

https://github.com/kubernetes/dashboard/issues/3804 上記issueにあるようにオレオレ証明書を生成すると解決できます。

Certs用のSecretを作成する

オレオレ証明書を作成

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

オレオレ証明書をkubernetesのsecretに登録 Secretをyamlで登録するのは暗号化とかがちょっと面倒なので、一度cliで登録した後にyaml形式を取り出します

// マニフェスト内で定義済みのものがあるので、一度削除する
$ kubectl -n kubernetes-dashboard delete secret kubernetes-dashboard-certs
$ kubectl -n kubernetes-dashboard create secret generic kubernetes-dashboard-certs --from-file=certs

secretのyaml形式を取得

$ kubectl -n kubernetes-dashboard get secret kubernetes-dashboard-certs -oyaml

ここで取得されるmetadataにはcreationTimestampなど不要なものも含まれるので、以下のようにそこは削除します。

マニフェスト内のcertsを新しい方に置き換えます。

- apiVersion: v1
- kind: Secret
- metadata:
-   labels:
-     k8s-app: kubernetes-dashboard
-   name: kubernetes-dashboard-certs
-   namespace: kubernetes-dashboard
- type: Opaque
+ apiVersion: v1
+ data:
+   dashboard.crt: LSdEQ...K
+   dashboard.csr: LS0t...0tLS0tCg==
+   dashboard.key: LS0t...BSSVZBVEUgS0VZLS0tLS0K
+ kind: Secret
+ metadata:
+   name: kubernetes-dashboard-certs
+   namespace: kubernetes-dashboard
+   labels:
+     k8s-app: kubernetes-dashboard
+ type: Opaque

これで再度applyし直します。

$ kubectl delete -f recommended.yaml
$ kubectl apply -f recommended.yaml

再びdashboardにアクセスしてみましょう

unsafeではありますが、dashboardへアクセスできるようになります。

Proceed to IP (unsafe)リンクを押下しましょう

ログイン用のトークン

kubernetes-dashboardのログインではtokenかkubeconfigが要求されます。 ここではadmin用のtokenを使ってログインしてみましょう

下記のマニフェストをapplyします

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

applyすると、admin-userのtokenも作成されるので、それをdescibeで表示します

$ kubectl apply -f admin-user.yaml
$ kubectl get secret -n kubernetes-dashboard | grep admin
admin-user-token-g5vd9                           kubernetes.io/service-account-token   3      5s
$ kubectl describe secret -n kube-system admin-user-token-g5vd9 

表示されたtokenの値をコピーして、ログインページで貼り付けます

image.png

みれました。

おまけ

podのcpu利用率やメモリ利用率をみたい

dashboardの中にmetricserverのメトリクスを回収するpodも内包されているようなので, metricserverをデプロイするだけで簡易的なcpu利用率などが見れるようになります。

$ git clone https://github.com/kubernetes-incubator/metrics-server.git
$ kubectl apply -f metrics-server/deploy/1.8+/

またマニフェストは以下のように修正しています

metrics-server/deploy/1.8+/

-        image: k8s.gcr.io/metrics-server-amd64:v0.3.3
+        image: k8s.gcr.io/metrics-server-arm:v0.3.2
+        command:
+        - /metrics-server
+        - --kubelet-insecure-tls
+        - --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname

imageの変更は元がdebianだったらやらなくても良いです。

コマンドの修正はそのままだと、podなどのメトリクスがfetchできないというエラーが出ていたので https://qiita.com/chataro0/items/28f8744e2781f730a0e6 こちらの対応を参考にさせてもらいました。

これで少し待つと、以下のようにdashboardでpodの簡易的なメトリクスが見れるようになります。

image.png

Nodeに直接アクセスできない場合

きちんとした環境だと、踏み台経由でしかノードへアクセスできないので、NodePort使えないという場合があるかもしれません。 その場合は、ssh-proxyとかを使ってあげれば繋げれるかと思います。