GKE で kubedash を使ってみた

# はじめに

Kubernetes のパフォーマンス解析 UI として kubedash があります。kubedash は、直近 1 時間のリソース利用率などを閲覧できます。今回は kubedash を GKE 上で使用する方法を紹介します。

![cluster](https://qiita-image-store.s3.amazonaws.com/0/19335/72b2c5da-a8ce-f2b0-2cc7-6b9c8721286b.png)

# 環境

現時点でのバージョンは GKE (Kubernetes) v1.1 および kubedash 0.2.1 です。

# kubedash

kubedash は Kubernetes Organization で開発されています。https://github.com/kubernetes/kubedash

## How to install

kubedash の Docker Image は GCR にアップロードされています。また RC と Service の Spec ファイルが用意されています。まずは Spec ファイルをダウンロードします。https://github.com/kubernetes/kubedash/blob/master/deploy/kube-config.yaml 

```shell-session
$ curl -O https://raw.githubusercontent.com/kubernetes/kubedash/master/deploy/kube-config.yaml
$ cat ./kube-config.yaml
---
  apiVersion: "v1"
  kind: "ReplicationController"
  metadata:
    labels:
      name: "kubedash"
    name: "kubedash"
    namespace: "kube-system"
  spec:
    replicas: 1
    selector:
      name: "kubedash"
    template:
      metadata:
        labels:
          name: "kubedash"
      spec:
        containers:
          -
            image: "gcr.io/google_containers/kubedash:v0.2.1"
            name: "kubedash"
            command:
              - "/kubedash"
            resources:
              limits:
                cpu: 50m
                memory: 100Mi
            volumeMounts:
              -
                name: "ssl-certs"
                mountPath: "/etc/ssl/certs"
                readOnly: true
        volumes:
          -
            name: "ssl-certs"
            hostPath:
              path: "/etc/ssl/certs"

---
  apiVersion: "v1"
  kind: "Service"
  metadata:
    labels:
      name: "kubedash"
    name: "kubedash"
    namespace: "kube-system"
  spec:
    type: "LoadBalancer"
    ports:
      -
        port: 80
        targetPort: 8289
    selector:
      name: "kubedash"
```

実際に `kubectl` で Spec ファイルを指定して RC と Service を作成します。

```shell-session
$ kubectl create -f ./kube-config.yaml
replicationcontroller "kubedash" created
service "kubedash" created
```

作成された RC と Service を確認します。kubedash は `kube-system` ネームスペースに作成されるため `--namespace=kube-system` オプションが必要となります。

```shell-session
$ kubectl --namespace=kube-system get rc
CONTROLLER         CONTAINER(S)           IMAGE(S)                                             SELECTOR                       REPLICAS   AGE
heapster-v10       heapster               gcr.io/google_containers/heapster:v0.18.2            k8s-app=heapster,version=v10   1          4d
kube-dns-v9        etcd                   gcr.io/google_containers/etcd:2.0.9                  k8s-app=kube-dns,version=v9    1          4d
                   kube2sky               gcr.io/google_containers/kube2sky:1.11
                   skydns                 gcr.io/google_containers/skydns:2015-10-13-8c72f8c
                   healthz                gcr.io/google_containers/exechealthz:1.0
kube-ui-v4         kube-ui                gcr.io/google_containers/kube-ui:v4                  k8s-app=kube-ui,version=v4     1         4d
kubedash           kubedash               gcr.io/google_containers/kubedash:v0.2.1             name=kubedash                  1         28s
l7-lb-controller   default-http-backend   gcr.io/google_containers/defaultbackend:1.0          k8s-app=glbc,version=v0.5.1    1         4d
                   l7-lb-controller       gcr.io/google_containers/glbc:0.5.1

$ kubectl --namespace=kube-system get service
NAME                   CLUSTER_IP       EXTERNAL_IP       PORT(S)         SELECTOR           AGE
default-http-backend   10.107.241.11    nodes             80/TCP          k8s-app=glbc       4d
heapster               10.107.245.65    <none>            80/TCP          k8s-app=heapster   4d
kube-dns               10.107.240.10    <none>            53/UDP,53/TCP   k8s-app=kube-dns   4d
kube-ui                10.107.249.194   <none>            80/TCP          k8s-app=kube-ui    4d
kubedash               10.107.254.5     yyy.yyy.yyy.yyy   80/TCP          name=kubedash      4m
```

## How to use

kubedash は Kubernetes Dashboard (kube-ui) と同等に Basic 認証が必要となります。まずは GKE Cluster の情報 (下記は一部のセキュリティ情報を伏字にしています) を取得します。

```shell-session
$ gcloud container clusters describe ennis-as-nginx-a
clusterIpv4Cidr: 10.104.0.0/14
createTime: '2016-01-20T16:20:56+00:00'
currentMasterVersion: 1.1.4
currentNodeCount: 3
currentNodeVersion: 1.1.4
endpoint: xxx.xxx.xxx.xxx
initialClusterVersion: 1.1.4
initialNodeCount: 3
instanceGroupUrls:
- https://www.googleapis.com/replicapool/v1beta2/projects/xxxxx/zones/asia-east1-b/instanceGroupManagers/gke-ennis-as-nginx-a-f7387859-group
loggingService: logging.googleapis.com
masterAuth:
  clientCertificate: xxxxx
  clientKey: xxxxx
  clusterCaCertificate: xxxxx
  password: boh7eeTh2eeM8phe
  username: admin
monitoringService: monitoring.googleapis.com
name: ennis-as-nginx-a
network: default
nodeConfig:
  diskSizeGb: 100
  machineType: n1-highcpu-2
  oauthScopes:
  - https://www.googleapis.com/auth/bigquery
  - https://www.googleapis.com/auth/compute
  - https://www.googleapis.com/auth/devstorage.read_only
  - https://www.googleapis.com/auth/logging.write
  - https://www.googleapis.com/auth/monitoring
nodeIpv4CidrSize: 24
selfLink: https://container.googleapis.com/v1/projects/xxxxx/zones/asia-east1-b/clusters/ennis-as-nginx-a
servicesIpv4Cidr: 10.107.240.0/20
status: RUNNING
zone: asia-east1-b
```

上記から endpoint は `xxx.xxx.xxx.xxx` で Basic 認証は `admin/boh7eeTh2eeM8phe` とわかります。Kubernetes Dashboard (kube-ui) は https://admin:boh7eeTh2eeM8phe@xxx.xxx.xxx.xxx/api/v1/proxy/namespaces/kube-system/services/kube-ui/ で接続できます。同じように kubedash は https://admin:boh7eeTh2eeM8phe@xxx.xxx.xxx.xxx/api/v1/proxy/namespaces/kube-system/services/kubedash/ で接続できます。

## Features

Kubernetes Dashboard (kube-ui) は GKE Cluster を構成する各 Node の CPU, Memory, Filesystem リソースを確認できます。また、Cluster 上で、どのような Pod, RC, Service が 稼働しているかを閲覧できます。kubedash は Cluster 全体のパフォーマンスや、細かい単位でのリソース使用率を確認できます。

### Cluster 

Cluster タブでは Cluster 全体のパフォーマンスを確認できます。直近 1 日までの CPU および Memory の利用率サマリーと、直近 1 時間までの利用率グラフが表示されます。

![cluster](https://qiita-image-store.s3.amazonaws.com/0/19335/72b2c5da-a8ce-f2b0-2cc7-6b9c8721286b.png)

### Nodes

Nodes タブでは Cluster を構成する Node 毎のリソース使用率を確認できます。

![node list](https://qiita-image-store.s3.amazonaws.com/0/19335/c4dd1615-c757-31a8-83fe-a7610d4a789e.png)

Node を選択すると、直近 1 日までの CPU および Memory の利用率サマリーと、直近 1 時間までの利用率グラフが表示されます。また、選択した Node 上で「どの Pod が動作しているか」や「選択した Pod のリソース使用率」を追うことができます。

![node detail](https://qiita-image-store.s3.amazonaws.com/0/19335/49fc75c3-045f-b62e-eac6-70590df1ad1b.png)

### Namespaces

Namespaces タブでは Cluster に存在する Namespace 毎のリソース使用率を確認できます。

![namespace list](https://qiita-image-store.s3.amazonaws.com/0/19335/cea760cb-c597-1c6b-3f2f-382498a1a134.png)

Namespace を選択すると、直近 1 日までの CPU および Memory の利用率サマリーと、直近 1 時間までの利用率グラフが表示されます。また、選択した Namespace 上で「どの Pod が動作しているか」や「選択した Pod のリソース使用率」を追うことができます。

![namespace detail](https://qiita-image-store.s3.amazonaws.com/0/19335/189a468d-68b6-ccc2-4267-40227b82f474.png)

## Security

ダウンロードした Spec ファイルの Service 定義を見ると `type: "LoadBalancer"` となっています。つまり GKE 上でこの Service を作成すると、通信を許可する Firewall が作成され External IP (Global IP) が割り当てられます。また External IP 経由のリクエストは認証なしでアクセスできます。

手順通りに進めている場合は kubedash Service の External IP を確認して http://yyy.yyy.yyy.yyy:80/ で開ける状況になっていると思います。~~無線カメラを `admin/admin` で公開している状況と同じですね。~~ ... さすがに内部情報全公開は良くないため対策しましょう。まずは以前作成した kubedash の RC と Service を削除します。

```
$ kubectl --namespace=kube-system delete rc kubedash
replicationcontroller "kubedash" deleted

$ kubectl --namespace=kube-system delete service kubedash
service "kubedash" deleted
```

次に kubedash の Spec ファイルを変更します。具体的には Service の type を `ClusterIP` に変更します。これによって、kubedash へのアクセスを Kubernetes API 経由に限定できるため Kubernetes Dashboard (kube-ui) と同等に Basic 認証をかけることができます。

```
$ cp ./kube-config.yaml ./kube-config-fixed.yaml
$ gsed -i 's/LoadBalancer/ClusterIP/g' ./kube-config-fixed.yaml
$ diff ./kube-config.yaml ./kube-config-fixed.yaml
48c48
<     type: "LoadBalancer"
---
>     type: "ClusterIP"

$ kubectl create -f ./kube-config-fixed.yaml
replicationcontroller "kubedash" created
service "kubedash" created
```

作成された RC と Service を確認します。kubedash Service の External IP が `<none>` となっていれば OK です。

```
$ kubectl --namespace=kube-system get rc
CONTROLLER         CONTAINER(S)           IMAGE(S)                                             SELECTOR                       REPLICAS   AGE
heapster-v10       heapster               gcr.io/google_containers/heapster:v0.18.2            k8s-app=heapster,version=v10   1          4d
kube-dns-v9        etcd                   gcr.io/google_containers/etcd:2.0.9                  k8s-app=kube-dns,version=v9    1          4d
                   kube2sky               gcr.io/google_containers/kube2sky:1.11
                   skydns                 gcr.io/google_containers/skydns:2015-10-13-8c72f8c
                   healthz                gcr.io/google_containers/exechealthz:1.0
kube-ui-v4         kube-ui                gcr.io/google_containers/kube-ui:v4                  k8s-app=kube-ui,version=v4     1         4d
kubedash           kubedash               gcr.io/google_containers/kubedash:v0.2.1             name=kubedash                  1         3m
l7-lb-controller   default-http-backend   gcr.io/google_containers/defaultbackend:1.0          k8s-app=glbc,version=v0.5.1    1         4d
                   l7-lb-controller       gcr.io/google_containers/glbc:0.5.1

$ kubectl --namespace=kube-system get service
NAME                   CLUSTER_IP       EXTERNAL_IP   PORT(S)         SELECTOR           AGE
default-http-backend   10.107.241.11    nodes         80/TCP          k8s-app=glbc       4d
heapster               10.107.245.65    <none>        80/TCP          k8s-app=heapster   4d
kube-dns               10.107.240.10    <none>        53/UDP,53/TCP   k8s-app=kube-dns   4d
kube-ui                10.107.249.194   <none>        80/TCP          k8s-app=kube-ui    4d
kubedash               10.107.249.68    <none>        80/TCP          name=kubedash      3m
```

# まとめ

今回はパフォーマンス解析 UI の kubedash を GKE 上で使用する方法を紹介しました。

GKE のリソースモニタリングツールとしては Kubernetes Dashboard あるいは Google Cloud Monitoring (StackDriver) を使うことが多いと思います。しかしながら Kubernetes Dashboard は機能的に不足していて、Cloud Monitoring は高機能ですが動作が重たいと感じています。

kubedash はその中間に当たるようなツールとして活用しており、直近 1 時間に限られますが、各 Pod のリソース使用率も追うことができて、とても軽いので手放せないツールになってきました。

# おわりに


この内容を gcp ja night #31 で軽く触れましたが、補足版として GKE 上で使用する方法を書いてみました。発表資料も併せてご覧ください！

http://gcpja.connpass.com/event/23874/
http://www.slideshare.net/katsutoshinagaoka/gke-57322091