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

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/

Kazuki Suda

November 25, 2021
Tweet

More Decks by Kazuki Suda

Other Decks in Technology

Transcript

  1. Lightning Talk at Kubernetes Meetup Tokyo #47(2021/11/25)
    SUDA Kazuki, Preferred Networks, Inc.
    @superbrothers
    Local ephemeral-storage の

    メトリクスを取得するのに
    kube-summary-exporter がべんり

    View Slide

  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

    View Slide

  3. @superbrothers
    なんかいろんなノードで次々に Pod が evict されてる😱
    1. ある Pod が Local ephemeral-storage をめっちゃ使う
    2. ノードのローカルストレージが圧迫される
    3. ノードが DiskPressure condition になる
    4. 問題の Pod を含むそのノードで実⾏されている Pods が追い出される(evict)
    5. 問題の Pod が他のノードにスケジュールされ、1 に戻る
    3

    View Slide

  4. @superbrothers
    Local ephemeral storage ってなんだっけ
    Pod が使う次のストレージ領域のこと。
    ▶ emptyDir ボリューム
    ▶ ログ出⼒
    ▶ コンテナの書き込み可能レイヤ
    ▶ /etc/hosts
    Pod がログを吐いたり(stdout/stderr)、emptyDir やローカルにファイルを作成すると

    ノードのローカルストレージを消費する。
    4

    View Slide

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

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

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

    使⽤しているのかを可視化したい。
    5

    View Slide

  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:&;!<=>?$!&[email protected]>!

    &&M:&N=O&P?#=?#%Q&HRL


    &&S:&3BCDEFGHTL

    View Slide

  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{|

    View Slide

  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)••

    View Slide

  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

    View Slide

  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"]

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide