Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Local ephemeral-storage のメトリクスを取得するのに kube-summary-exporter がべんり / kube-summary-exporter is useful to get the metrics of local ephemeral-storage

9f9df80ab6551776b49c4ad9432ba1b7?s=47 Kazuki Suda
November 25, 2021

Local ephemeral-storage のメトリクスを取得するのに kube-summary-exporter がべんり / kube-summary-exporter is useful to get the metrics of local ephemeral-storage

A Lightning talk at Kubernetes Meetup Tokyo #47 (2021/11/25)
https://k8sjp.connpass.com/event/229659/

9f9df80ab6551776b49c4ad9432ba1b7?s=128

Kazuki Suda

November 25, 2021
Tweet

Transcript

  1. Lightning Talk at Kubernetes Meetup Tokyo #47(2021/11/25) SUDA Kazuki, Preferred

    Networks, Inc. @superbrothers Local ephemeral-storage の 
 メトリクスを取得するのに kube-summary-exporter がべんり
  2. @superbrothers SUDA Kazuki / @superbrothers ▶ Preferred Networks, Inc. /

    エンジニア ▶ Kubernetes Meetup Tokyo, Prometheus Meetup Tokyo ほか、共同主催者 ▶ Cloud Native Ambassador (CNCF) ▶ 「Kubernetes実践⼊⾨」、「みんなのDocker/Kubernetes」共著書 ▶ 「⼊⾨ Prometheus」、「Kubernetes で実践するクラウドネイティブ DevOps」監訳書 2
  3. @superbrothers なんかいろんなノードで次々に Pod が evict されてる😱 1. ある Pod が

    Local ephemeral-storage をめっちゃ使う 2. ノードのローカルストレージが圧迫される 3. ノードが DiskPressure condition になる 4. 問題の Pod を含むそのノードで実⾏されている Pods が追い出される(evict) 5. 問題の Pod が他のノードにスケジュールされ、1 に戻る 3
  4. @superbrothers Local ephemeral storage ってなんだっけ Pod が使う次のストレージ領域のこと。 ▶ emptyDir ボリューム

    ▶ ログ出⼒ ▶ コンテナの書き込み可能レイヤ ▶ /etc/hosts Pod がログを吐いたり(stdout/stderr)、emptyDir やローカルにファイルを作成すると 
 ノードのローカルストレージを消費する。 4
  5. @superbrothers ノードのローカルストレージが消費されまくると困る ノードのストレージがめっちゃ消費されるとコンテナを実⾏したり、イメージを取得するのに 
 必要な容量が⾜りなくなるし、そもそもホスト OS も困る。 なので、ノードは、ストレージ容量が少なくなってきたら(DiskPressure)すでに終了しているコンテ ナや使ってないイメージを削除したりして容量を空けようとする。それでも⼗分に空かない場合に、 


    実⾏中の Pod を追い出し(evict)にかかる。 どの Pod が原因なのかを特定するために、各 Pods がどのくらい Local ephemeral storage を 
 使⽤しているのかを可視化したい。 5
  6. @superbrothers Local ephemeral-storage のメトリクスはどこにある ▶ Kubernetes でメトリクスといえば metrics-server と kube-state-metrics

    だけど、どちらも 
 Local ephemeral-storage に関するメトリクスを提供してくれてない😣 ▶ Kubernetes は、ノードが DiskPressure になると、追い出す Pod を選ぶ際に 
 各 Pod がどのくらい Local ephemeral-storage を使⽤しているかの情報を使っているので、 
 どこぞから Local ephemeral-storage のメトリクスが取得できるはず Kubelet Summary API 6 !"#$%&'()*+,*-./0(+12345678 &&9:&;!<=>?$!&?!@>!<%<&A3BCDEFGHIJKL) &&M:&N=O&P?#=?#%Q&HRL &&S:&3BCDEFGHTL
  7. @superbrothers Kubelet Summary API Kubelet Summary API は、Kubelet が公開する監視のためのエンドポイント 7

    $ kubectl get --raw /api/v1/nodes/kind-control-plane/proxy/stats/summary | jq -r '.pods[0]["ephemeral-storage"]' { "time": "2021-11-22T07:13:49Z", "availableBytes": 217031008256, "capacityBytes": 421682126848, "usedBytes": 65536, "inodesFree": 22430078, "inodes": 26214400, "inodesUsed": 21 } UVW5XYCZ[\]^_`*&aNbX123XcdefCgh*1e3gDHij(KL)klXm 0(n+&o=O!p!qP=?%!?&rstu4v()*4wsxAELjyz{|
  8. @superbrothers ⚠ Kubelet Summary API / ephemeral-storage の注意点 ephemeral storage

    の availableBytes, capacityBytes, inodesFree は、v1.22.4 時点で rootfs の値が⼊って いて、imagefs が考慮されていない。imagefs を使っている場合は、ここの値はあてにならない。 8 func calcEphemeralStorage(containers []statsapi.ContainerStats, volumes []statsapi.VolumeStats, rootFsInfo *cadvisorapiv2.FsIn podLogStats *statsapi.FsStats, etcHostsStats *statsapi.FsStats, isCRIStatsProvider bool) *statsapi.FsStats { result := &statsapi.FsStats{ Time: metav1.NewTime(rootFsInfo.Timestamp), AvailableBytes: &rootFsInfo.Available, CapacityBytes: &rootFsInfo.Capacity, InodesFree: rootFsInfo.InodesFree, Inodes: rootFsInfo.Inodes, } .... https://github.com/kubernetes/kubernetes/blob/v1.22.4/pkg/kubelet/stats/helper.go#L374-L382 \]^_}1C~•€•‚ƒ„…†}‡W &&?==%&ˆ‰}Š‹D^Œ•ŽAEsKL)••
  9. @superbrothers kube-summary-exporter ▶ Kubelet Summary API を公開してくれる Prometheus exporter を探すと

    
 utilitywarehouse/kube-summary-exporter が⾒つかったが、Local ephemeral-storage を 
 含んでなかったので、PR を作成してマージしてもらった💪 ▶ あまりメンテされておらず、マージされた PR を含むリリースもまだないので、 
 使うには⾃分でビルドが必要だったり😓 9 # HELP kube_summary_pod_ephemeral_storage_used_bytes Number of bytes of Ephemeral storage that are consumed by the pod # TYPE kube_summary_pod_ephemeral_storage_used_bytes gauge kube_summary_pod_ephemeral_storage_used_bytes{namespace="kube-system",pod="coredns-56558f9fc7-l8jcl"} 2.2913024e+07 kube_summary_pod_ephemeral_storage_used_bytes{namespace="kube-system",pod="coredns-56558f9fc7-wdlgv"} 2.1692416e+07 kube_summary_pod_ephemeral_storage_used_bytes{namespace="kube-system",pod="node-problem-detector-92jqg"} 7.8163968e+07 kube_summary_pod_ephemeral_storage_used_bytes{namespace="logging",pod="fluent-bit-gscbq"} 77824 kube_summary_pod_ephemeral_storage_used_bytes{namespace="monitoring",pod="node-exporter-ffcmv"} 126976
  10. @superbrothers kube-summary-exporter をつかってみる Kubernetes 側の設定 kube-summary-exporter が Kubelet Summary API

    にアクセスできる必要があるので、 
 RBAC で node/proxy サブリソースを許可してあげる必要がある 10 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: kube-summary-exporter rules: - apiGroups: [""] resources: ["nodes/proxy"] verbs: ["get"]
  11. @superbrothers kube-summary-exporter をつかってみる Prometheus 側の設定 kube-summary-exporter は、/node/{node} で指定のノードのメトリクスを公開するので、 
 下記の感じでリラベルしてあげる。

    11 - job_name: kube-summary-exporter kubernetes_sd_configs: - role: node relabel_configs: - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /node/${1} - target_label: __address__ replacement: kube-summary-exporter:9779
  12. @superbrothers 実は Kubelet Summary API は廃⽌予定になっているんだけど... 代替⼿段がなく、廃⽌されることが決まっているだけの状態。 > Kubelet Summary

    API, is currently only planned for deprecation, this hasn't yet happened as noone proposed a working alternative. When it will happen it will be clearly announced and it will take at least 3 releases before it is removed. Meaning you will have around a year to adapt. https://github.com/kubernetes/kubernetes/issues/106080 動向が気になる⽅は下記イシューを購読 https://github.com/kubernetes/kubernetes/issues/68522 12
  13. @superbrothers Appendix ▶ Managing Resources for Containers | Kubernetes ▶

    Node-pressure Eviction | Kubernetes ▶ ローカルストレージの stats は cAdvisor、CRI Image service から取得 + https://github.com/kubernetes/kubernetes/blob/v1.22.4/pkg/kubelet/kubelet.go#L709-L728 ▶ Local ephemeral-storage の使⽤量を求める部分 + https://github.com/kubernetes/kubernetes/blob/v1.22.4/pkg/kubelet/stats/helper.go#L374-L402 ▶ DiskPressure になった際の挙動が nodefs (rootfs) に加えて imagefs を使っているかどうかによって 変わる + https://github.com/kubernetes/kubernetes/blob/v1.22.4/pkg/kubelet/eviction/helpers.go#L978- L998 ▶ DiskPressure による Pod の追い出し(evict)でどの Pod が選択されるのか + https://github.com/kubernetes/kubernetes/blob/v1.22.4/pkg/kubelet/eviction/helpers.go#L947- L971 13