K8s v1.10 on Vagrantのダッシュボードのセットアップ


この投稿は、Vagrantの仮想サーバーで構築したK8sクラスタの3回目で、ダッシュボードのセットアップ方法についてのメモです。
1回目、2回目のリンクを以下にあげておきますので、必要に応じて参照いただければ幸いです。

* [Kubenetes v1.10 クラスタをVagrantで構築したメモ](https://qiita.com/MahoTakara/items/28cd766d0447140b7ae3)
* [K8s Node障害時の振る舞いについての検証記録](https://qiita.com/MahoTakara/items/9b106664492303e1ba01)


Kubernetes Dashboadは、セキュリティや表示機能で開発が続いていますが、これらに関する複数の古いドキュメントも残っていますから、適切な参照先を選ばないと時間を無駄にしてしまいます。 そこで、参考までに、今回参照した資料と役に立たなかった資料を列挙しておきます。GitHubに置かれているドキュメントは、最新の状態になっている様です。

セットアップ時に参照した資料URL: 

* https://github.com/kubernetes/dashboard
* https://github.com/kubernetes/dashboard/wiki/Creating-sample-user


セットアップの参考にならなかった資料のURL:

* https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/
* https://kubernetes-v1-4.github.io/docs/user-guide/ui/




## 仮想サーバ K8s1 ポートフォワード設定

k8sのポッドネットワーク上のIPアドレスでリッスンしているダッシュボードのウェブページを、Vagrant のホストであるMacからアクセスできる様にするために、下記のVagrantfileの16行目の様に、ゲスト（仮想サーバー）の8001番ポートとホスト（Mac)の8001番ポートを対応させます。これによって、Macのブラウザで、https://localhost:8001/ をアクセスすると、仮想サーバーの8001番ポートへフォワードされる様になります。

~~~Vagrantfile
    13	      public_ip = "192.168.1.#{i+90}"
    14	      s.vm.network :public_network, ip: public_ip, bridge: "en0: Ethernet"
    15	      if i == 1 then
    16	        s.vm.network :forwarded_port, host: 8001, guest: 8001
    17	      end
~~~




## ダッシュボードのインストール

次に、`kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml`によって、ダッシュボードをデプロイします。 この操作は、https://github.com/kubernetes/dashboard にガイドされています。

~~~
vagrant@k8s1:/vagrant/yaml$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
secret "kubernetes-dashboard-certs" created
serviceaccount "kubernetes-dashboard" created
role.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created
rolebinding.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created
deployment.apps "kubernetes-dashboard" created
service "kubernetes-dashboard" created
~~~




## 管理ユーザーとロールの作成

ダッシュボードにアクセスする権限を持ったユーザーを作成するために、次の２つのYAMLファイルを適用します。 これらのYAMLファイルは、`https://github.com/kubernetes/dashboard/wiki/Creating-sample-user`にガイドされています。

ダッシュボードユーザーを作るYAML

~~~CreateServiceAccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
~~~

ロール(権限）を与えるYAML

~~~CreateClusterRoleBinding.yaml
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: kube-system
~~~


上記２つのYAMLを マスターノード k8s1 で kubectlを実行して、適用します。

~~~
vagrant@k8s1:/vagrant/yaml$ kubectl create -f CreateServiceAccount.yaml 
serviceaccount "admin-user" created
vagrant@k8s1:/vagrant/yaml$ kubectl create -f CreateClusterRoleBinding.yaml 
clusterrolebinding.rbac.authorization.k8s.io "admin-user" created
~~~



## 管理ユーザーのトークンの表示

次に、前述のYAML適用で生成された管理ユーザーのトークンを表示して、ログイン時にコピペして利用できる様にします。 トークンは、`token:`の次から始まる文字列です。この表示は、メモ帳などに保存しておいて、ダッシュボードにログインする場合に、毎回利用します。

~~~
vagrant@k8s1:/vagrant/yaml$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Name:         admin-user-token-w4w7w
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=admin-user
              kubernetes.io/service-account.uid=1c934b99-4230-11e8-a350-02399910d15e

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXc0dzd3Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxYzkzNGI5OS00MjMwLTExZTgtYTM1MC0wMjM5OTkxMGQxNWUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.cu-yNdS7dFbVm_aJkAU_Q2PIshwlXAlO54Gjm3Vhm5gHZxbN6Kr_JGJ9b0pYmmBIuj1Pml0MfErh_AtceTtQZnrCdjJCR8WJG8I4HtJLk-BYloNU8GJ95gOuKQ0kVMpJ8R4uHGHgjwOkLzI_r9x2mquID6TEtPxfEWDqQSdXzzBq4oPe0RhTUE4p9QKm14W3H9BPUXui880HpuX84aKER5_3MQc2xmFnTrkZUq4QQKc2zgyrjjaEEsyAI1m9oPwzW-IRCiKTMkwqKIN5JJ1f3H1WowAt8LtYydex7-_bQkd-9N1Oe6uLSHAIjyq1DcOVF8Ww7ylMZb6ANEWBHiTrng
vagrant@k8s1:/vagrant/yaml$ 
~~~



## kubectl プロキシの設定

ダッシュボードのポッドは、ポッドネットワーク(10.244.0.0/16)上のIPアドレスで、リッスンしています。 このポッドネットワークをk1s1の8001番ポートに中継（プロキシ）するために、次のコマンドを実行します。 このコマンドは、コントロール-Cで停止するまで、プロキシとして機能します。

~~~
vagrant@k8s1:~$ kubectl proxy --address="0.0.0.0" -p 8001 --accept-hosts='^*$' -n kube-system
Starting to serve on [::]:8001
~~~

コマンドのオプションの説明は、`https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#proxy`にあります。



## ダッシュボードへのログイン

過去のバージョンでは、`http://localhost:8001/ui/`とされていましたが、v1.10では廃止となっており、次のアドレスでアクセスします。

`http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/`


ブラウザでアクセスすると、次のウィンドが表示されます。　Tokenをクリックして、`Enter token`に、先に表示したトークンをコピペして、`SIGN IN`をクリックします。

![スクリーンショット 2018-04-17 21.22.09.png](https://qiita-image-store.s3.amazonaws.com/0/42829/c3b39171-3fe1-2f07-e557-0ea70023ddca.png "スクリーンショット 2018-04-17 21.22.09.png")



## ダッシュボードの表示

ログインに成功すると、次の様なダッシュボードが表示されます。


![スクリーンショット 2018-04-17 21.24.37.png](https://qiita-image-store.s3.amazonaws.com/0/42829/e52cb661-f006-8c99-b650-338af5cfaafe.png "スクリーンショット 2018-04-17 21.24.37.png")

ダッシュボードの利用方法は、説明が無くても、直感的に判る様になっていますが、https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/ を参照すると、助けになると思います。



## ダッシュボードの機能追加

ダッシュボードのスクリーンショットの中には、次の様に、CPU usage, Memory usage が表示されていますが、これまでのセットアップではグラフがありません。 これには、Heapster という名前のメトリックス・コレクターを設定する必要があります。 設定ガイドは、https://github.com/kubernetes/dashboard/wiki/Integrations にあります。

![スクリーンショット 2018-04-17 23.01.41.png](https://qiita-image-store.s3.amazonaws.com/0/42829/c7d15ac5-e9c2-5f1c-c1ad-9ca20ccb8ba9.png "スクリーンショット 2018-04-17 23.01.41.png")



## まとめ

Vagrantの環境で構築したk8sクラスタに、ダッシュボードをデプロイして、ホストのブラウザからアクセスできる事を確認しました。 また、CPUとメモリのグラフを表示するためには、Heapsterの設定が必要な事がわかりました。 そして、設定を進めるにあたり、必要な資料は、Github https://github.com/kubernetes/dashboard にあるものが、最も最新であることも解りました。