kubesprayで構築したKubernetesクラスタのDashboardに簡単にアクセスする方法

# 環境
ESXi6.7上のVM4台

- vm
  - k8s-master cpu:2 mem:4GB HDD:30GB IP:192.168.123.180
  - k8s-node1  cpu:2 mem:4GB HDD:30GB IP:192.168.123.181
  - k8s-node2  cpu:2 mem:4GB HDD:30GB IP:192.168.123.182
  - k8s-node3  cpu:2 mem:4GB HDD:30GB IP:192.168.123.182

- OS
  - Ubuntu20.04LTS

- Kubernetes
  - kubespray 2.13.3 で構築、ノード名のみ変更、ほかデフォルト
  - バージョン：1.18.4


# はじめに
Kubesprayで構築したKubernetes Dashboardに簡単にアクセスする方法です。
構築する環境によって異なると思いますが自分が勉強のために構築した環境だと公式の方法よりこの方法がアクセスしやすかったです。
ちなみにKubesprayのGetting startedの[Accessing Kubernetes Dashboard](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/getting-started.md#accessing-kubernetes-dashboard)には別の方法が記載されています。

# 手順

## ダッシュボードアクセス用のサービスアカウントの作成

サービスアカウント：admin-userとクラスタロール：cluster-adminを作成し、バインディングします。
今回はデフォルトネームスペースに作成しています。

dashbord-adminuser.yaml

```yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: default
```

以下のコマンドで作成します

```
kubectl apply -f dashbord-adminuser.yaml
```

## ダッシュボードのサービスのTypeをClusterIPからNodePortに変更

```
kubectl patch service kubernetes-dashboard -n kube-system -p '{"spec":{"type":"NodePort"}}'
```

## ブラウザでアクセス

割り当てられたポートを確認します。

```
root@k8s-master:~# kubectl get svc kubernetes-dashboard -n kube-system
NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.233.40.27   <none>        443:31907/TCP   41h
root@k8s-master:~#
```

この場合、ポートは31907です。

トークンを取得します。

```
root@k8s-master:~# kubectl -n default describe secret $(kubectl -n default get secret | grep admin-user | awk '{print $1}')
Name:         admin-user-token-ckplg
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: b7cec2e8-bd6f-4737-9775-d274e8acef08

Type:  kubernetes.io/service-account-token

Data
====
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlZFcF9xLTdGektrS05wS040c29pak1GWVh2TUJ6QkJzTnpQeUN2blVGMU0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImFkbWluLXVzZXItdG9rZW4tY2twbGciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiYWRtaW4tdXNlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImI3Y2VjMmU4LWJkNmYtNDczNy05Nzc1LWQyNzRlOGFjZWYwOCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmFkbWluLXVzZXIifQ.GBN2dwFSKD44qu6cV6w4GwoeEJ9UHpOvVq8wiG7tzptjbaexURJEFuEe-VF15h1VeLW7W5MrFrKh41Cf5pZCHZW6DbDUFZQRDYebKSEnDgr5fD_hEHH047Yg0poMB2WCntu8ImM0eIFArFARyVLa0yCN9Pfmht-BG8dqBw84ctFdLN79vIRHKQBId74VnZMWRC60siEmWGV0u2aHP9HUx3BGmNDfGmafzXwjDtE6bIZpWVJzE4L4ePKalx8WDz6UzZONpzDJBILQ2A6Kcf8KBM7aI_ijkvfTD-m8zauLDaNPZ6YfpYcew9WaJfGpmi3SQipBeG7upNeBq4RZASP7fw
ca.crt:     1025 bytes
namespace:  7 bytes
root@k8s-master:~#
```


以下のURLにアクセスし、トークンを入力すればアクセスできるようになります。

```
https://<WorkerノードのIP>:<割り当てられたポート>/
```

# まとめ
とりあえずアクセスしたいときにはkubectl patchでNodePortに変更してノードのIPからアクセスするのが楽かも。