はじめに
Kubernetes のパフォーマンス解析 UI として kubedash があります。kubedash は、直近 1 時間のリソース利用率などを閲覧できます。今回は kubedash を GKE 上で使用する方法を紹介します。
環境
現時点でのバージョンは 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 時間までの利用率グラフが表示されます。
Nodes
Nodes タブでは Cluster を構成する Node 毎のリソース使用率を確認できます。
Node を選択すると、直近 1 日までの CPU および Memory の利用率サマリーと、直近 1 時間までの利用率グラフが表示されます。また、選択した Node 上で「どの Pod が動作しているか」や「選択した Pod のリソース使用率」を追うことができます。
Namespaces
Namespaces タブでは Cluster に存在する Namespace 毎のリソース使用率を確認できます。
Namespace を選択すると、直近 1 日までの CPU および Memory の利用率サマリーと、直近 1 時間までの利用率グラフが表示されます。また、選択した Namespace 上で「どの Pod が動作しているか」や「選択した Pod のリソース使用率」を追うことができます。
Security
ダウンロードした Spec ファイルの Service 定義を見ると type: "LoadBalancer"
となっています。つまり GKE 上でこの Service を作成すると、通信を許可する Firewall が作成され External IP (Global IP) が割り当てられます。また External IP 経由のリクエストは認証なしでアクセスできます。
手順通りに進めている場合は kubedash Service の External IP を確認して http://yyy.yyy.yyy.yyy:80/ で開ける状況になっていると思います。無線カメラを ... さすがに内部情報全公開は良くないため対策しましょう。まずは以前作成した kubedash の RC と Service を削除します。admin/admin
で公開している状況と同じですね。
$ 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