Kubernetes 1.10 Dashboard設定

# はじめに

GitHub に Kubernetes の Dashboard を設定する Repository が公開されています。
今回は、試験的に設定するため、HTTP で公開する手順で設定を進めます。
本番利用の時には、HTTPS で公開するのが推奨ですので注意してください。



#Kubernetes 1.10 Dashboard設定

## YAMLのマニフェストファイルをダウンロードする

GitHub に公開されている YAML のマニフェストファイルをダウンロードします。

```
cd /root/kube_yaml/dashboard/
wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml
```

yaml ファイルの中味を確認します。複数の リソース を定義しています。

一部、変更が必要な箇所があります。

### Service Account の定義

kube-system の Namespace 上に、 Service Account 「kubernetes-dashboard」を作成します。
Service Accout は、Kubernetes は様々な認証方式が有る中の一つのようです。
Dashboard を利用する際に、システム上で使用されるアカウントのようです。

```
# ------------------- Dashboard Service Account ------------------- #

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system

```

なお、作成前の Service Account の一覧は以下のようになっています

```
[root@sugi-kubernetes110-master01 dashboard(default kubernetes-admin)]# kubectl get serviceaccount --all-namespaces
NAMESPACE     NAME                                 SECRETS   AGE
bar           default                              1         33d
default       default                              1         36d
kube-public   default                              1         36d
kube-system   attachdetach-controller              1         36d
kube-system   bootstrap-signer                     1         36d
kube-system   certificate-controller               1         36d
kube-system   clusterrole-aggregation-controller   1         36d
kube-system   cronjob-controller                   1         36d
kube-system   daemon-set-controller                1         36d
kube-system   default                              1         36d
kube-system   deployment-controller                1         36d
kube-system   disruption-controller                1         36d
kube-system   endpoint-controller                  1         36d
kube-system   flannel                              1         36d
kube-system   generic-garbage-collector            1         36d
kube-system   horizontal-pod-autoscaler            1         36d
kube-system   job-controller                       1         36d
kube-system   kube-dns                             1         36d
kube-system   kube-proxy                           1         36d
kube-system   namespace-controller                 1         36d
kube-system   node-controller                      1         36d
kube-system   persistent-volume-binder             1         36d
kube-system   pod-garbage-collector                1         36d
kube-system   pv-protection-controller             1         36d
kube-system   pvc-protection-controller            1         36d
kube-system   replicaset-controller                1         36d
kube-system   replication-controller               1         36d
kube-system   resourcequota-controller             1         36d
kube-system   service-account-controller           1         36d
kube-system   service-controller                   1         36d
kube-system   statefulset-controller               1         36d
kube-system   token-cleaner                        1         36d
kube-system   ttl-controller                       1         36d
quux          default                              1         33d
test          default                              1         34d
```

### Role と RoleBinding の定義

Role を作成し、先ほどの Service Account「kubernetes-dashboard」と紐づけ(Binding)を行っています

```
# ------------------- Dashboard Role & Role Binding ------------------- #

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kubernetes-dashboard-minimal
  namespace: kube-system
rules:
  # Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret.
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["create"]
  # Allow Dashboard to create 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
  resources: ["configmaps"]
  verbs: ["create"]
  # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
- apiGroups: [""]
  resources: ["secrets"]
  resourceNames: ["kubernetes-dashboard-key-holder"]
  verbs: ["get", "update", "delete"]
  # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
  resources: ["configmaps"]
  resourceNames: ["kubernetes-dashboard-settings"]
  verbs: ["get", "update"]
  # Allow Dashboard to get metrics from heapster.
- apiGroups: [""]
  resources: ["services"]
  resourceNames: ["heapster"]
  verbs: ["proxy"]
- apiGroups: [""]
  resources: ["services/proxy"]
  resourceNames: ["heapster", "http:heapster:", "https:heapster:"]
  verbs: ["get"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-dashboard-minimal
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard-minimal
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system
```

なお、設定前のRole は以下のようになっています

```
[root@sugi-kubernetes110-master01 dashboard(default kubernetes-admin)]# kubectl get role --all-namespaces
NAMESPACE     NAME                                             AGE
kube-public   kubeadm:bootstrap-signer-clusterinfo             36d
kube-public   system:controller:bootstrap-signer               36d
kube-system   extension-apiserver-authentication-reader        36d
kube-system   system::leader-locking-kube-controller-manager   36d
kube-system   system::leader-locking-kube-scheduler            36d
kube-system   system:controller:bootstrap-signer               36d
kube-system   system:controller:cloud-provider                 36d
kube-system   system:controller:token-cleaner                  36d

[root@sugi-kubernetes110-master01 dashboard(default kubernetes-admin)]# kubectl get rolebinding --all-namespaces
NAMESPACE     NAME                                             AGE
kube-public   kubeadm:bootstrap-signer-clusterinfo             36d
kube-public   system:controller:bootstrap-signer               36d
kube-system   system::leader-locking-kube-controller-manager   36d
kube-system   system::leader-locking-kube-scheduler            36d
kube-system   system:controller:bootstrap-signer               36d
kube-system   system:controller:cloud-provider                 36d
kube-system   system:controller:token-cleaner                  36d
```

### Deployment の定義

以下のようにDeployment が定義されています

「kubernetes-dashboard-amd64:v1.8.3」という名前の コンテナイメージを使用して、PodをDeployする内容となっています

```
kind: Deployment
apiVersion: apps/v1beta2
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      containers:
      - name: kubernetes-dashboard
        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
        ports:
        - containerPort: 9090
          protocol: TCP
        args:
          # Uncomment the following line to manually specify Kubernetes API server Host
          # If not specified, Dashboard will attempt to auto discover the API server and connect
          # to it. Uncomment only if the default does not work.
          # - --apiserver-host=http://my-address:port
        volumeMounts:
          # Create on-disk volume to store exec logs
        - mountPath: /tmp
          name: tmp-volume
        livenessProbe:
          httpGet:
            path: /
            port: 9090
          initialDelaySeconds: 30
          timeoutSeconds: 30
      volumes:
      - name: tmp-volume
        emptyDir: {}
      serviceAccountName: kubernetes-dashboard
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
```

### Service の定義

type を指定していないので、ClusterIPとなります。
今回は、外部公開をしたいので、NodePort として定義を変更します。

```
# ------------------- Dashboard Service ------------------- #

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: NodePort     <------ ここを追加
  ports:
  - port: 80
    targetPort: 9090
    nodePort: 32002     <------ ここを追加
  selector:
    k8s-app: kubernetes-dashboard
```

## 作成

```
[root@sugi-kubernetes110-master01 dashboard(default kubernetes-admin)]# kubectl create -f /root/kube_yaml/dashboard/kubernetes-dashboard.yaml 
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
```



## Dashboard Service Accountに管理権限を与える

kubernetes-dashboard に 管理者権限を与えないと Dashboard を表示することが出来なかったため、管理者権限を与えます。
本番利用時には、適切な権限に絞って適用させてあげる必要があるとおもいます。

```
cat <<'EOF' > /root/kube_yaml/dashboard/role_binding_dashboard.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system
EOF
```

kubectl create で RoleBinding の設定を行います

```
kubectl create -f /root/kube_yaml/dashboard/role_binding_dashboard.yaml
```



## Nodeport の Port 番号を確認して、アクセスします

「kubernetes-dashboard」の Port が 32606 と割り振られていることを確認します。

```
root@sugi-kubernetes110-master01 dashboard(default kubernetes-admin)]# kubectl get svc --all-namespaces
NAMESPACE     NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP        PORT(S)         AGE
bar           foo1                        ClusterIP      10.107.131.250   <none>             6379/TCP        32d
bar           nginx-headless-noselector   ExternalName   <none>           www.google.co.jp   <none>          32d
bar           nginx-service               ClusterIP      None             <none>             15315/TCP       32d
default       kubernetes                  ClusterIP      10.96.0.1        <none>             443/TCP         36d
kube-system   kube-dns                    ClusterIP      10.96.0.10       <none>             53/UDP,53/TCP   36d
kube-system   kubernetes-dashboard        NodePort       10.110.103.225   <none>             80:32606/TCP    8m
```



Kubernetes クラスタに接続出来るマシンから、任意の Node や Master を選び、ブラウザ上からアクセスを行います

```
http://192.168.120.220:32606/
```



以下のように Dashboard 画面 を開くことが出来ます。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/104247/f5216803-09f2-d146-18f8-e7244b86157e.png)








# 参考URL

https://github.com/kubernetes/dashboard/wiki/Installation

https://qiita.com/sheepland/items/0ee17b80fcfb10227a41