LoginSignup
19
15

More than 5 years have passed since last update.

StackDriverでKubernetes(GKE)の細かいメトリクスが見たかった

Posted at

GKEのモニタリング、アラートにStackDriverがどの程度使いやすいか検証する為に奮闘中のメモ

前提

  • kuberntes: 1.10.2-gke.3
  • GKEクラスタの設定で Stackdriver Monitoring有効 になっている状態

StackDriverでGKEのメトリクスを見る

まずはデフォルトの状態でどのくらい見れるのか見てみます

  • Resources -> Metrics Exploer を開く
  • ResoruceType: GKE Container を選択
  • 選択できるメトリクスを見てみる

https://cloud.google.com/monitoring/api/metrics_gcp#gcp-container
↑ここに書いてあるとおりです。

Metrics_Explorer-1.png

  • CPU usage
  • CPU utilization
  • Disk capacity
  • Disk usage
  • Log bytes
  • Log entries
  • Log-bases metric errors
  • Memory limit
  • Memory usage
  • Page faults
  • Reserved cores

こんな感じですね。

デフォルトのDashboard(Overview?)を見てみる

Kubernetes Engineのnodeやpodの情報を見ることができます

  • Resources -> Kubernetes Engine を選択
  • Inventory から対象のクラスタを選択

SrackDriver-GKE-Overview.png

  • ただ、これ、なぜか他のクラスタにデプロイされてるpodの情報も表示される...
  • カスタマイズできない(Filterはできる)
  • 微妙に使いづらい

うーん :thinking:

普段モニタリングしたいメトリクス

HPAでオートスケールさせているdeploymentがあったりするので
とりあえずライトなところで

  • 各pod毎のCPU使用率
  • deploymentでグルーピングしたCPU使用率
  • オートスケールで変化したpod数の推移
  • availableなpodの数
    • 起動に失敗してpodが立ち上がらないなどの障害をアラートする為

などはモニタリングしたいところです。

カスタムメトリクス

カスタムメトリクスを自分でStackDriverにreportすれば、モニタリングできそうです。

Before you begin
Custom metrics are a paid feature of Monitoring and there could be costs for your custom metrics. For > more information, see Stackdriver Pricing. You can try out this and other Stackdriver premium features free for 30 days, when you create a new Stackdriver account.


あなたが始める前に
カスタムメトリックは監視の有償機能であり、カスタムメトリックにはコストがかかる可能性があります。 詳細については、スタックドライバの価格設定を参照してください。 このStackdriverプレミアム機能は、新しいStackdriverアカウントを作成するときに30日間無料でお試しいただけます。

とのことです。
とりあえず、試用期間があるようなので、UPGRADEしておきます。

kube-state-metricsを使ってみる

自前でメトリクス収集を実装するのはさすがに面倒です...
そこで
https://github.com/kubernetes/kube-state-metrics
を使ってみることにしました。

kube-state-metricsをdeployする

kube-state-metrics.yml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-state-metrics
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1 
# kubernetes versions before 1.8.0 should use rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kube-state-metrics
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kube-state-metrics
  namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: kube-system
  name: kube-state-metrics
  labels:
    app: kube-state-metrics
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube-state-metrics
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      serviceAccountName: kube-state-metrics
      hostNetwork: true
      containers:
      - name: kube-state-metrics
        image: gcr.io/google_containers/kube-state-metrics:v1.3.1
        ports:
          - name: http-metrics
            containerPort: 8080
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5
          timeoutSeconds: 5
        resources:
          requests:
            memory: 200Mi
            cpu: 100m
          limits:
            memory: 300Mi
            cpu: 200m
      - name: prometheus-to-sd
        image: gcr.io/google-containers/prometheus-to-sd:v0.2.6
        ports:
          - name: profiler
            containerPort: 6060
        command:
          - /monitor
          - --stackdriver-prefix=custom.googleapis.com
          - --source=kube-state-metrics:http://localhost:8080
          - --pod-id=$(POD_NAME)
          - --namespace-id=$(POD_NAMESPACE)
        env:
          - name: GOOGLE_APPLICATION_CREDENTIALS
            value: /secrets/credentials.json
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace

  • ServiceAccountを作成
  • ClusterRoleBinding で作成したServiceAccountをClusterRoleに紐付ける
    • 本当はもっと細かく権限設定したClusterRoleを用意すべきかと思いますが、検証環境なのでてっとりばやくcluster-adminを使いました
  • kube-state-metricsのDeploymentを作成
    • 先に作成したServiceAccountをつける
    • StackDriverにメトリクスを送信するcontainerとして、prometeus-to-sd をsidecar containerとして起動しておく
    • kube-state-metrics
    • prometeus-to-sd
  • メトリクス収集なので、 kube-system のnamespaceに入れることにしました

kubectl apply -f kube-state-metrics.yml
でデプロイします。

StackDriverで見てみる

  • Resource -> Metrics Exploler を選択
  • Resource type: GKE Container を選択

Metrics_Explorer-2.png

Metric: custom.googleapis.com/kube-state-metrics/kube_deployment_status_replicas_available
Description: The number of available replicas per deployment.
Resource type: gke_container
Unit: number     Kind: Gauge     Value type: Int64

など、モニタリングできるメトリクスが増えました。

Metrics_Explorer-3.png

試用期間でしばらく運用してみて、使えそうなら本格運用を考えようかと思います。

まとめ

  • StackDriverのデフォルトのメトリクスだと運用には足りない
  • カスタムメトリクスを使ってメトリクスを増やすことができる
    • カスタムメトリクスはAlertにも使える
    • Alert設定は新しいUIが出来て作りやすくなった
  • StackDriverは $8 / host くらいなので、モニタリング系サービスの中では安い方だと思う
19
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
15