カスタム指標でKubernetesの指標を収集する
それでは、実際にカスタム指標を使ってKubernetes API Serverの指標をStackdriverで収集してみましょう。構成は下図の通りです。
kube-metricsはKubernetes API Serverの指標を収集して、Stackdriverに送信するPodになります。このPodには以下のコンテナが含まれています。
- kube-state-metrics
- prometheus-to-sd
kube-state-metricsはKubernetes API serverの指標を生成するコンテナで、prometheus-to-sdはkube-state-metricsで生成した指標をStackdriverに送信するコンテナです。
kube-state-metrics
Kubernetes API Serviceをリッスンして、Kubernetesのオブジェクトの状態の指標を生成するシンプルなサービスです。今回は既にDockerコンテナイメージ化されたものがあるのでそれを使います。
kube-state-metricsのGitHubのレポジトリはこちらです。
prometheus-to-sd
さまざまなコンポーネントから取得したprometheusのテキストフォーマットの指標をStackdriverに送るコンポーネントです。今回はkube-state-metricsから指標を取得して、Stackdriverに流すのに使います。
prometheus-to-sdのGitHubのレポジトリはこちらです。
kube-metricsのPodのデプロイ
それでは、この構成でPodをデプロイするためのDeploymentを作成していきましょう。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kube-metrics
spec:
replicas: 1 # (1)
template:
metadata:
labels:
app: kube-metrics
spec:
hostNetwork: true
containers:
- name: kube-state-metrics # (2)
image: gcr.io/google_containers/kube-state-metrics:v1.1.0
ports:
- name: http-metrics
containerPort: 8080 #(2-1)
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5 #(2-2)
timeoutSeconds: 5
resources:
requests:
memory: 200Mi
cpu: 100m
limits:
memory: 300Mi
cpu: 200m
- name: prometheus-to-sd #(3)
image: gcr.io/google-containers/prometheus-to-sd:v0.2.3
ports:
- name: profiler
containerPort: 6060
command:
- /monitor
- --stackdriver-prefix=custom.googleapis.com
- --source=kube-state-metrics:http://localhost:8080 #(3-1)
- --pod-id=$(POD_NAME)
- --namespace-id=$(POD_NAMESPACE)
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
このYAMLはGitHubの「GoogleCloudPlatform/k8s-stackdriverのkubernetes/prometheus-to-sd-kube-state-metrics.yaml」を参考にしています。
YAMLの定義を上から説明します。まずレプリカ数は1を指定(1)します。このPodはひとつ以上動作していれば十分なのでこの値にしています。
次にkube-state-metrics(2)のコンテナについてですが、Google公式のgcr.io/google-containers/kube-state-metricsというイメージのv1.1.0のタグを指定しています。このバージョンは現在指定できる一番新しいバージョンです。ちなみにどのバージョンが使えるかを知りたい方は、以下のGoogle Containersのコンテナレジストリを参照してください。
このコンテナの動作Portは8080(2-1)で、このポートに対して後述するprometheus-to-sdが指標を取得するためにアクセスするようになっています。そのため、prometheus-to-sdのコンテナのcommandオプションの--source=kube-state-metricsで指定するPortと一致する必要があります。
readinessProbe(2-2)のオプションですが、これはコンテナがトラフィックを受けられるかどうかを指定するオプションで、今回はコンテナが起動してから5秒間はkubeletのプローブを待つように設定しています。プローブとはコンテナにリクエストを投げてヘルスチェックすることを指します。
prometheus-to-sd(3)のコンテナについてですが、こちらもGoogle公式のgcr.io/google-containers/prometheus-to-sdというイメージのタグがv.0.2.3を指定しています。こちらも現状使える最新のバージョンを指定しています。
command(3-1)のオプションでは、配下の--stackdriver-prefix=custom.googleapis.comでカスタム指標名の指定やどの指標をソースにするかを指定しています。今回はkube-state-metricsが生成した指標をソースにしたいので、kube-state-metricsが動作しているlocalhost:8080を指定しています。
それでは、実際にデプロイしてみましょう。
$kubectl create -f kube-metrics.yaml
デプロイしたら正常に動作しているかをkubectl get deployで確認してみましょう。
$kubectl get pod NAME READY STATUS RESTARTS AGE kube-metrics-666bf4cd8d-xfh6x 2/2 Running 0 38m
正常に動作していればRunningになっているはずです。これでkube-metricsの指標がStackdriverに送られるようになりました。
kube-metricsの指標の確認
最後に、StackdriverのDashboardで指標を可視化してみましょう。今回は試しにkube_deployment_spec_replicasというDeploymentのレプリカ数を可視化してみましょう。kube-state-metricsには、これ以外にもkubernetesの各リソースの指標が収集されています。そのため、今回はdeploymentの指標を可視化しますが、他にもDaemonSetやNodeの指標も可視化することができます。その他指標に関しては、以下の公式ドキュメントを参照してください。
手順は以下の通りです。
- GCPのコンソールから「Stackdriver Monitoring」にアクセス
- [Dashboard]をクリックし、出てくるメニューから作成したダッシュボード名をクリック
- Dashboardの画面に遷移したら[Add Chart]をクリック
- 下図「Add Chart kube_deployment_spec_replicas」を参考に、Add Chartの「Resource Type」には「Custom Metrics」、「Metric Type」には「kube_deployment_spec_replicas」を指定(注:kube-metricsのPodをデプロイした直後では、「Custom Metrics」がメニューにない場合があります。その場合は少し時間をあけてから試してください)
- [Title]はCusttom Metricsでは分かりづらいので、kube_deployment_spec_replicasに変更
- [Save]をしてChartを保存
以上で、Dashboardにkube_deployment_spec_replicasに指標がChartとして可視化されていることが確認できると思います。
こちらのChartはDeploymentごとに、レプリカ数がグラフになっています。同じレプリカ数のDeploymentが重なってしまい少々見づらいので、リスト表示で確認するのがおすすめです。
リストに表示されている名前に関しても非常に長くて見づらいのですが、「gke_container:kube-state-metrics/kube_deployment_spec_replicas:gke_container(」の横にある名前がDeploymentの名前になります。
gke_container:kube-state-metrics/kube_deployment_spec_replicas:gke_container(kube-dns, kube-system,
この例であれば、kube-dnsがDeploymentの名前で、kube-systemはこのDeploymentがデプロイされているネームスペースになります。
最後に
今回はモニタリングツールの導入してStackdriverの導入方法と、カスタム指標について解説しました。必要に応じてカスタム指標を追加するなど、お好みの指標の可視化に挑戦してみてください。
