Kubernetesにダッシュボードをデプロイする

# 環境
ESXi6.7上のVM3台

- vm
  - k8s-master cpu:2 mem:4GB HDD:30GB IP:192.168.123.170
  - k8s-node1  cpu:2 mem:4GB HDD:30GB IP:192.168.123.171
  - k8s-node2  cpu:2 mem:4GB HDD:30GB IP:192.168.123.172

- OS
  - CentOS7.8.2003

- Kubernetes
  - kubeadmで構築
  - バージョン：1.18.6

# はじめに
kubectlコマンド操作だけではちょっと寂しいと思い、「[Kubernetes Dashboard v2.0.0をデプロイする](https://esakat.github.io/esakat-blog/posts/kubernetes-dashboard-v2.0.0/)」を参考にWeb UIを入れました。

# 手順
1. 公式「[Web UI (Dashboard)](https://kubernetes.io/ja/docs/tasks/access-application-cluster/web-ui-dashboard/)」の手順でインストールするとClusterIPになるため、アクセスしにくいためNodePortに変更します。
    - ダッシュボードのマニフェストをDLします

    ```
    yum install wget -y
    wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
    ```
    - 以下のように修正します。

    ```diff
    ---
    
      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
    
      ---
    ```

1. 修正したマニフェストファイルを使用してダッシュボードをデプロイします。

    ```
    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.110.89.193   <none>        8000/TCP        54s
    kubernetes-dashboard        NodePort    10.107.229.73   <none>        443:30843/TCP   54s
    #
    ```

    ノードのIPを確認してダッシュボードにアクセスします。

    ```
    # kubectl get nodes -o wide
    NAME         STATUS   ROLES    AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
    k8s-master   Ready    master   18h   v1.18.6   192.168.123.170   <none>        CentOS Linux 7 (Core)   3.10.0-1127.13.1.el7.x86_64   docker://19.3.12
    k8s-node1    Ready    <none>   17h   v1.18.6   192.168.123.171   <none>        CentOS Linux 7 (Core)   3.10.0-1127.13.1.el7.x86_64   docker://19.3.12
    k8s-node2    Ready    <none>   17h   v1.18.6   192.168.123.172   <none>        CentOS Linux 7 (Core)   3.10.0-1127.13.1.el7.x86_64   docker://19.3.12
    #
    ```

    https://\<k8s-node1 or k8s-node2のINTERNAL-IP>:30843 でブラウザからアクセスします。
    Chromeでは以下のように表示されますが、ここは「詳細設定」をクリックしてダッシュボードにアクセスします。

    ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91405/78aa83a4-b995-41a8-cfde-812bc45d3143.png)

    ダッシュボードにアクセスすると以下のログイン画面が表示されます。
    ![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91405/60bb22c2-e31b-a38f-a821-075a07c86fdb.png)

1. ダッシュボードにログインするためのアカウントの作成
    ダッシュボードの公式サイトにある「[Creating sample user](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md)」を参考にして、ダッシュボードのログインに必要なサービスアカウント、ロールを作成します。
    - 以下のマニフェストファイル(dashbord-adminuser.yaml)を作成します。

    ```mf
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: admin-user
      namespace: kubernetes-dashboard
    ---
    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: kubernetes-dashboard
    ```
    - 以下のコマンドを実行し、admin-user ServiceAccountとadmin-user ClusterRoleBindingを作成します

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

1. ダッシュボードにログインする
    以下のコマンドを実行し、先ほど作成した admin-userのトークンを取得します。

    ```
    kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
    ```

    出力されたtokenをダッシュボードのログイン画面に入力します。
    ダッシュボードにログインが成功すると以下のような画面が表示されます。

    ![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91405/e04f9875-16d4-4109-2c8b-784ddd618eef.png)


#参考URL
[Kubernetes Dashboard v2.0.0をデプロイする](https://esakat.github.io/esakat-blog/posts/kubernetes-dashboard-v2.0.0/)
[Web UI (Dashboard)](https://kubernetes.io/ja/docs/tasks/access-application-cluster/web-ui-dashboard/)