gcpja
GoogleCloudPlatform
kubernetes
GoogleContainerEngine
kubedash
More than 3 years have passed since last update.


はじめに

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

cluster


環境

現時点でのバージョンは 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

$ 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 を作成します。

$ kubectl create -f ./kube-config.yaml

replicationcontroller "kubedash" created
service "kubedash" created

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

$ 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 の情報 (下記は一部のセキュリティ情報を伏字にしています) を取得します。

$ 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


Nodes

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

node list

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

node detail


Namespaces

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

namespace list

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

namespace detail


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