うさぎ好きエンジニアの備忘録

うさぎたちに日々癒されているエンジニアが業務で直面したもの & 個人的な学習メモを残していきます。

Kubernetes Dashboardをデプロイしてみる

Version2がいつの間にか出ていたので、試しに使ってみます。

ちなみにv2.0.0からnamespaceもkube-systemからkubernetes-dashboardへ変わったようです。

yamlのダウンロード

以下のコマンドでyamlwgetしておきましょう。

(後々中身を少しだけ修正していきます。)

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

Dashboardのapply

ダウンロードしたyamlを使ってapplyしてみます。

$ kubectl apply -f recommended.yaml

実行してみたところ、以下のようなエラーが発生。

The ClusterRoleBinding "kubernetes-dashboard" is invalid: roleRef: Invalid value: rbac.RoleRef{APIGroup:"rbac.authorization.k8s.io", Kind:"ClusterRole", Name:"kubernetes-dashboard"}: cannot change roleRef

どうやらClusterRoleBindingが既に存在してしまっていることが原因のようなので、以下のコマンドを実行して削除してしまいます。

$ kubectl delete clusterrolebinding kubernetes-dashboard

この状態でもう一度applyしたら問題なく成功しました。

ServiceをNodePortに変更する

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

@@ -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

修正が終わったらもう一度applyを実施。

$ kubectl apply -f recommended.yaml

正常に完了したら、以下のコマンドで指定したポートを使っているかを確認しておきましょう。

$ kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.109.234.247   <none>        8000/TCP        2m50s
kubernetes-dashboard        NodePort    10.108.192.109   <none>        443:30843/TCP   2m50s

Dashboardにアクセスしてみる

Kubernatesクラスタを構成しているNodeの情報を確認。

$ kubectl get nodes -owide
NAME                                         STATUS   ROLES    AGE    VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME
k8s-001.kazono.hogehoge.co.jp   Ready    master   261d   v1.16.0   XXX.YYY.ZZZ.111   <none>        CentOS Linux 7 (Core)   3.10.0-XXX   docker://1.13.1
k8s-002.kazono.hogehoge.co.jp   Ready    node     261d   v1.16.0   XXX.YYY.ZZZ.222    <none>        CentOS Linux 7 (Core)   3.10.0-XXX   docker://1.13.1
k8s-003.kazono.hogehoge.co.jp   Ready    node     261d   v1.16.0   XXX.YYY.ZZZ.333    <none>        CentOS Linux 7 (Core)   3.10.0-XXX   docker://1.13.1

適当にhttps://<kubernetes nodeのFQDN>:30843とかにアクセスしてみると以下のような画面が見れるはずです。

f:id:ponteru:20200115220650p:plain

ログイン用のトークンの準備

アクセスしてみると、kubernetes-dashboardのログインでtokenかkubeconfigが要求されました。

ここではadmin用のtokenを使ってログインしてみます。

以下のように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

applyを実施してadmin-userを作成 & トークンを確認します。

$ kubectl apply -f admin-user.yaml
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user configured

$ kubectl get secret -n kubernetes-dashboard | grep admin
admin-user-token-qfbnj             kubernetes.io/service-account-token   3      45s

$ kubectl describe secret admin-user-token-qfbnj -n kubernetes-dashboard | grep token: | awk '{ print $2 }'
# トークンが表示されるのでそれをコピーしてください。

ラジオボタントークンを選択し、そこにコピーしたトークンをペーストして認証を実施するとUIが確認できました。 f:id:ponteru:20200115220719p:plain