SlideShare une entreprise Scribd logo
1  sur  13
Télécharger pour lire hors ligne
Lightning Talk at Kubernetes Meetup Tokyo #47(2021/11/25)
SUDA Kazuki, Preferred Networks, Inc.
@superbrothers
Local ephemeral-storage の


メトリクスを取得するのに
kube-summary-exporter がべんり
@superbrothers
!
SUDA Kazuki / @superbrothers
▶ Preferred Networks, Inc. / エンジニア
▶ Kubernetes Meetup Tokyo, Prometheus Meetup Tokyo ほか、共同主催者
▶ Cloud Native Ambassador (CNCF)
▶ 「Kubernetes実践⼊⾨」、「みんなのDocker/Kubernetes」共著書
▶ 「⼊⾨ Prometheus」、「Kubernetes で実践するクラウドネイティブ DevOps」監訳書
2
@superbrothers
!
なんかいろんなノードで次々に Pod が evict されてる😱
1. ある Pod が Local ephemeral-storage をめっちゃ使う
2. ノードのローカルストレージが圧迫される
3. ノードが DiskPressure condition になる
4. 問題の Pod を含むそのノードで実⾏されている Pods が追い出される(evict)
5. 問題の Pod が他のノードにスケジュールされ、1 に戻る
3
@superbrothers
!
Local ephemeral storage ってなんだっけ
Pod が使う次のストレージ領域のこと。
▶ emptyDir ボリューム
▶ ログ出⼒
▶ コンテナの書き込み可能レイヤ
▶ /etc/hosts
Pod がログを吐いたり(stdout/stderr)、emptyDir やローカルにファイルを作成すると


ノードのローカルストレージを消費する。
4
@superbrothers
!
ノードのローカルストレージが消費されまくると困る
ノードのストレージがめっちゃ消費されるとコンテナを実⾏したり、イメージを取得するのに


必要な容量が⾜りなくなるし、そもそもホスト OS も困る。
なので、ノードは、ストレージ容量が少なくなってきたら(DiskPressure)すでに終了しているコンテ
ナや使ってないイメージを削除したりして容量を空けようとする。それでも⼗分に空かない場合に、


実⾏中の Pod を追い出し(evict)にかかる。
どの Pod が原因なのかを特定するために、各 Pods がどのくらい Local ephemeral storage を


使⽤しているのかを可視化したい。
5
@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
@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{|
@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)••
@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
@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"]
@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
@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
@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

Contenu connexe

Plus de Preferred Networks

スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演Preferred Networks
 
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)Preferred Networks
 
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)Preferred Networks
 
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)Preferred Networks
 
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語るKubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語るPreferred Networks
 
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張Preferred Networks
 
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会Preferred Networks
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2Preferred Networks
 
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...Preferred Networks
 
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...Preferred Networks
 
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...Preferred Networks
 
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50Preferred Networks
 
Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50Preferred Networks
 
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...Preferred Networks
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜Preferred Networks
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48Preferred Networks
 
Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太
Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太
Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太Preferred Networks
 
東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太
東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太
東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太Preferred Networks
 
MN-3, MN-Core and HPL - SC21 Green500 BOF
MN-3, MN-Core and HPL - SC21 Green500 BOFMN-3, MN-Core and HPL - SC21 Green500 BOF
MN-3, MN-Core and HPL - SC21 Green500 BOFPreferred Networks
 
KubeCon 2021 NA Recap - Scheduler拡張事例最前線 / Kubernetes Meetup Tokyo #47 / #k8sjp
KubeCon 2021 NA Recap - Scheduler拡張事例最前線 / Kubernetes Meetup Tokyo #47 / #k8sjpKubeCon 2021 NA Recap - Scheduler拡張事例最前線 / Kubernetes Meetup Tokyo #47 / #k8sjp
KubeCon 2021 NA Recap - Scheduler拡張事例最前線 / Kubernetes Meetup Tokyo #47 / #k8sjpPreferred Networks
 

Plus de Preferred Networks (20)

スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
 
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
 
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
 
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
 
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語るKubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
 
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
 
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
 
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
 
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
 
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
 
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
 
Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50
 
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
 
Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太
Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太
Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太
 
東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太
東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太
東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太
 
MN-3, MN-Core and HPL - SC21 Green500 BOF
MN-3, MN-Core and HPL - SC21 Green500 BOFMN-3, MN-Core and HPL - SC21 Green500 BOF
MN-3, MN-Core and HPL - SC21 Green500 BOF
 
KubeCon 2021 NA Recap - Scheduler拡張事例最前線 / Kubernetes Meetup Tokyo #47 / #k8sjp
KubeCon 2021 NA Recap - Scheduler拡張事例最前線 / Kubernetes Meetup Tokyo #47 / #k8sjpKubeCon 2021 NA Recap - Scheduler拡張事例最前線 / Kubernetes Meetup Tokyo #47 / #k8sjp
KubeCon 2021 NA Recap - Scheduler拡張事例最前線 / Kubernetes Meetup Tokyo #47 / #k8sjp
 

Local ephemeral-storage のメトリクスを取得するのに kube-summary-exporter がべんり / Kubernetes Meetup Tokyo #47 / #k8sjp

  • 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