Kubernetes Dashboardにcluster-admin権限でSign inする

# 前置き

1.7系までは`kubectl proxy`コマンドを実行し、ブラウザで`127.0.0.1:8001/ui`にアクセスすることで簡単にWebUIを利用することができました。

しかし、Kubernetes 1.8系から認証システムが入っており、認証を通さなければWebUIを利用することができなくなりました。
WebUIアクセス時に以下のような認証画面が表示されるようになっています。

![スクリーンショット 2018-03-31 0.35.32.png](https://qiita-image-store.s3.amazonaws.com/0/172314/c9781dd6-9fc7-04ea-72e6-9dd23ebd39e4.png)

権限は細かく分かれており、デフォルトで以下のような種類があります。

```.sh
$ kubectl -n kube-system get secret
NAME                                             TYPE                                  DATA      AGE
attachdetach-controller-token-cdqt4              kubernetes.io/service-account-token   3         45m
certificate-controller-token-7qjc4               kubernetes.io/service-account-token   3         45m
cloud-provider-token-gn4gq                       kubernetes.io/service-account-token   3         45m
clusterrole-aggregation-controller-token-tl2wc   kubernetes.io/service-account-token   3         45m
cronjob-controller-token-prhf8                   kubernetes.io/service-account-token   3         45m
daemon-set-controller-token-rr99v                kubernetes.io/service-account-token   3         45m
default-token-xbqb8                              kubernetes.io/service-account-token   3         45m
deployment-controller-token-76t44                kubernetes.io/service-account-token   3         45m
disruption-controller-token-ttfnq                kubernetes.io/service-account-token   3         45m
endpoint-controller-token-7q884                  kubernetes.io/service-account-token   3         45m
event-exporter-sa-token-6n4c6                    kubernetes.io/service-account-token   3         45m
fluentd-gcp-token-c77bf                          kubernetes.io/service-account-token   3         45m
generic-garbage-collector-token-pk9j7            kubernetes.io/service-account-token   3         45m
heapster-token-kgzhn                             kubernetes.io/service-account-token   3         45m
horizontal-pod-autoscaler-token-cfm5c            kubernetes.io/service-account-token   3         45m
job-controller-token-tmdx5                       kubernetes.io/service-account-token   3         45m
kube-dns-autoscaler-token-m59qq                  kubernetes.io/service-account-token   3         45m
kube-dns-token-g9bb9                             kubernetes.io/service-account-token   3         45m
kubernetes-dashboard-certs                       Opaque                                0         45m
kubernetes-dashboard-key-holder                  Opaque                                2         45m
kubernetes-dashboard-token-kw59t                 kubernetes.io/service-account-token   3         45m
metadata-proxy-token-s8f5v                       kubernetes.io/service-account-token   3         45m
metrics-server-token-w9j4f                       kubernetes.io/service-account-token   3         45m
namespace-controller-token-9qddf                 kubernetes.io/service-account-token   3         45m
node-controller-token-7nf8h                      kubernetes.io/service-account-token   3         45m
persistent-volume-binder-token-gjn6g             kubernetes.io/service-account-token   3         45m
pod-garbage-collector-token-whp67                kubernetes.io/service-account-token   3         45m
replicaset-controller-token-b2tcl                kubernetes.io/service-account-token   3         45m
replication-controller-token-7pl4w               kubernetes.io/service-account-token   3         45m
resourcequota-controller-token-sqqg7             kubernetes.io/service-account-token   3         45m
route-controller-token-894rl                     kubernetes.io/service-account-token   3         45m
service-account-controller-token-5jhjb           kubernetes.io/service-account-token   3         45m
service-controller-token-xgdwx                   kubernetes.io/service-account-token   3         45m
statefulset-controller-token-q47bt               kubernetes.io/service-account-token   3         45m
ttl-controller-token-8rcs5                       kubernetes.io/service-account-token   3         45m
```

例えば、`deployment-controller`権限でログインする方法は、まず以下のようにtokenを取得します。

```.sh
# 上のリストからdeployment-controller-xxxxxとなっているものを指定する
kubectl -n kube-system describe secret deployment-controller-token-76t44
Name:         deployment-controller-token-76t44
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=deployment-controller
              kubernetes.io/service-account.uid=bde9a663-3429-11e8-92ba-42010a92006a

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1115 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZXBsb3ltZW50LWNvbnRyb2xsZXItdG9rZW4tNzZ0NDQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVwbG95bWVudC1jb250cm9sbGVyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYmRlOWE2NjMtMzQyOS0xMWU4LTkyYmEtNDIwMTBhOTIwMDZhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRlcGxveW1lbnQtY29udHJvbGxlciJ9.C-V8qYwHJ1lnDTSjoRFyMSyFMKMTOcNNFFsujOjnQsts7ov54Mt4M8L9_QjyRXTvnI_jSSCjq5IFcXY2W_oLbqY8f5nCO2uwAcYDPF3YRSx0Qf5lk56FQ2kuIyMSmFutwKaHbgrEK0j3XyruCeGyy4Ych_MPmeJUKWvImrwubDsIFxYinvjdzEiWjc3CSByWYTqCyhdV1ovicWXJQIBsaU5PLxCpOi2uK4hSlcGT15OApy8pKVvx45E37qSbVSL5IgplkZ8DOZyOynxlLDFlANIAivs4MrnWMUI4xhUjRlqyWBNLwDchrkbyqjKFORmBjnsMxHL3FqXkXYDHwdqq0w
```

表示されたTokenを入力して`SIGN IN`を選択します。

![スクリーンショット 2018-03-31 0.39.24.png](https://qiita-image-store.s3.amazonaws.com/0/172314/2b29fabb-7b92-d41f-765c-96d48cd4cf7b.png)

すると以下のようにログインができます。

![スクリーンショット 2018-03-31 0.40.36.png](https://qiita-image-store.s3.amazonaws.com/0/172314/ff9707ce-4f30-174f-545a-bb49dfce866f.png)

しかし、警告が画面上部に出ています。
ここには`deployment-controller`権限では閲覧できない内容がある旨が表示されています。

# 警告の解消方法

２つの方法があります。

+ https://github.com/kubernetes/dashboard/wiki/Access-control の`Admin privileges`の箇所に書いてある方法で、ログインをSKIPできるようにしてしまう方法(認証システムを無効化するのでセキュリティリスクあり)
+ 管理者権限を作り、管理者権限のTokenを使ってログインする方法

ここでは後者の方法を説明します。

# サービスアカウントの作成

```service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
---
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
```

上記のファイルを用意し、以下のコマンドでデプロイします。

```
$ kubectl apply -f service-account.yaml
```

そうすると以下のように`admin-user-token-xxxxx`が出現します。

```
$ $ kubectl -n kube-system get secret
NAME                                             TYPE                                  DATA      AGE
admin-user-token-h5t5t                           kubernetes.io/service-account-token   3         40m
attachdetach-controller-token-cdqt4              kubernetes.io/service-account-token   3         56m
certificate-controller-token-7qjc4               kubernetes.io/service-account-token   3         56m
cloud-provider-token-gn4gq                       kubernetes.io/service-account-token   3         56m
clusterrole-aggregation-controller-token-tl2wc   kubernetes.io/service-account-token   3         56m
cronjob-controller-token-prhf8                   kubernetes.io/service-account-token   3         56m
daemon-set-controller-token-rr99v                kubernetes.io/service-account-token   3         56m
default-token-xbqb8                              kubernetes.io/service-account-token   3         56m
deployment-controller-token-76t44                kubernetes.io/service-account-token   3         56m
disruption-controller-token-ttfnq                kubernetes.io/service-account-token   3         56m
endpoint-controller-token-7q884                  kubernetes.io/service-account-token   3         56m
event-exporter-sa-token-6n4c6                    kubernetes.io/service-account-token   3         55m
fluentd-gcp-token-c77bf                          kubernetes.io/service-account-token   3         55m
generic-garbage-collector-token-pk9j7            kubernetes.io/service-account-token   3         56m
heapster-token-kgzhn                             kubernetes.io/service-account-token   3         56m
horizontal-pod-autoscaler-token-cfm5c            kubernetes.io/service-account-token   3         56m
job-controller-token-tmdx5                       kubernetes.io/service-account-token   3         56m
kube-dns-autoscaler-token-m59qq                  kubernetes.io/service-account-token   3         55m
kube-dns-token-g9bb9                             kubernetes.io/service-account-token   3         55m
kubernetes-dashboard-certs                       Opaque                                0         56m
kubernetes-dashboard-key-holder                  Opaque                                2         56m
kubernetes-dashboard-token-kw59t                 kubernetes.io/service-account-token   3         55m
metadata-proxy-token-s8f5v                       kubernetes.io/service-account-token   3         55m
metrics-server-token-w9j4f                       kubernetes.io/service-account-token   3         55m
namespace-controller-token-9qddf                 kubernetes.io/service-account-token   3         56m
node-controller-token-7nf8h                      kubernetes.io/service-account-token   3         56m
persistent-volume-binder-token-gjn6g             kubernetes.io/service-account-token   3         56m
pod-garbage-collector-token-whp67                kubernetes.io/service-account-token   3         56m
replicaset-controller-token-b2tcl                kubernetes.io/service-account-token   3         56m
replication-controller-token-7pl4w               kubernetes.io/service-account-token   3         56m
resourcequota-controller-token-sqqg7             kubernetes.io/service-account-token   3         56m
route-controller-token-894rl                     kubernetes.io/service-account-token   3         56m
service-account-controller-token-5jhjb           kubernetes.io/service-account-token   3         56m
service-controller-token-xgdwx                   kubernetes.io/service-account-token   3         56m
statefulset-controller-token-q47bt               kubernetes.io/service-account-token   3         56m
ttl-controller-token-8rcs5                       kubernetes.io/service-account-token   3         56m
```

あとは`deployment-controller`のときの同じ方法でTokenを取得し、ログインします。

![スクリーンショット 2018-03-31 0.48.56.png](https://qiita-image-store.s3.amazonaws.com/0/172314/5bd5038c-8322-d616-e519-590e6eccb424.png)

無事、警告が解消されました。
これで、どのリソースも閲覧することができるようになります。

お疲れ様でした。