📈

Exponential HistogramsやMemory QoSの紹介記事など: Neco Weekly (2023-05-12号)

2023/05/16に公開

Neco Weekly (2023-05-12号)

サイボウズ Neco チームでは、 Neco Weekly という「最近気になる Kubernetes や Cloud Native 関連のネタを共有する会」を社内で開催しています。
本記事は共有会の中で紹介したネタをまとめたものです。

今回は第31回目の記事となります。

👀 Notable Articles

A Technique To Monitor Kubernetes Controller Latency

https://povilasv.me/a-technique-to-monitor-kubernetes-controller-latency/

Kubernetesのコントローラーは、リクエストがいったんAPI Serverに保存されてそれを複数のコントローラーが取り出して順次処理するというスタイルなので、処理全体のレイテンシーを計測しにくいという問題があります。
そこで、kube-proxyではcontroller-managerが付与したlast-change-trigger-timeアノテーションを使って、実際に処理が完了するまでの時刻を計測しているそうです。
また、この仕組みは分散トレーシングにも応用できるだろうと言及しています。

以前同様の仕組みを使ってコントローラーで分散トレーシングする実験をしたので、よろしければ以下のスクラップもご覧ください。
https://zenn.dev/zoetro/scraps/f0a195b2d5ff0c

Exponential Histograms

https://dyladan.me/histograms/2023/05/04/exponential-histograms/

OpenTelemetryのExponential Histogram(PrometheusではNative Histogramと呼ばれている)の紹介記事です。

これまでのヒストグラムでは、バケットの範囲を事前に定義しておく必要がありました。
そのため、実際に得られたデータに対してバケットの範囲が適切でなかった場合、アプリケーションの設定を変更してデプロイし直す必要があるため非常に面倒です。
また、バケットの数に応じて時系列データを保存しなければならないため、データの効率もあまりよくありません。

Exponential Histogramでは、scaleファクターに応じてバケットの範囲が指数関数的な計算で決まります。
このときバケットの分割数をパラメータとして与えれば、実際に得られたデータに応じて最適なscaleを自動的に決めてくれます。
そのため、バケットの幅を変更するためにアプリケーションを再デプロイする必要はなくなります。
またバケットごとに時系列データを保存する必要はなく、カウントした値を配列として保存するため、データの保存効率も良くなります。

バケットの幅が適切ではなく分析するときに役立たないことがたまにあるので、この機能はうれしいですね。
なお、PrometheusではNative Histogramはまだ実験的な機能なのでFeature Gateを有効にする必要があります。
VictoriaMetricsへの導入はまだ検討されていないようです。

Kubernetes 1.27: Quality-of-Service for Memory Resources (alpha)

https://kubernetes.io/blog/2023/05/05/qos-memory-resources/

Memory QoSの詳しい解説です。以前読んだ記事よりもかなり詳しく記述されていました。

これまではPodにlimits.memoryを指定した場合、実際のメモリ使用量がその設定をを超えたらOOM Killerが発動するだけでした。
Memory QoSを有効にすると以下のような挙動になります。

  • requests.memoryがcgroup v2のmemory.minにマッピングされ、最低メモリ使用量が保証される。memory.minを維持できない場合はOOMが発動して他のプロセスを終了させる。
  • limits.memoryは、OOM発動上限のmemory.maxだけでなく、memory.highも設定する。メモリ使用量がmemory.highを超えた場合スロットルされる。(CPUを与えないことで新たにメモリが確保されるのを抑える)

memory.highは以下の計算式で決まります。

memory.high = pod.spec.containers[i].resources.requests[memory] 
  + MemoryThrottlingFactor * {(pod.spec.containers[i].resources.limits[memory] or NodeAllocatableMemory) - pod.spec.containers[i].resources.requests[memory]}

MemoryThrottlingFactorはkubeletのパラメータで設定できます(デフォルト0.9)。
例えばrequests.memoryが5G, limits.memotryが10Gの場合、5+0.9*(10-5)=9.5Gになります。

さらに、memory.highによってスロットルしてほしくないケースもあるので、Pod QoSに応じてmemory.highの設定が変わるようになっているそうです。

  • Guaranteed Pod: memory.highは設定されない
  • Burstable Pod: 上記の式がそのまま適用される
  • BestEffort Pod: MemoryThrottlingFactor * NodeAllocatableMemoryが適用される

Kubernetes 1.27: StatefulSet PVC Auto-Deletion (beta)

https://kubernetes.io/blog/2023/05/04/kubernetes-1-27-statefulset-pvc-auto-deletion-beta/

StatefulSetを消したときや、replicasを減らしたときにPVCを自動で消してくれる機能です。
これまではreplicasを減らしたときに手動でPVCを消す必要があって非常に面倒でしたが、

一方で、現状のStatefulSetにはvolumeTemplateを書き換えられないという問題があります。
volumeTemplateが書き換えられないので、PVCのサイズを変更したいときにStatefulSetを消して作り直す必要があります。
そのため、PVCのサイズを変更するためにStatefulSetを消したときに、意図せずPVCが消えてしまうという問題が起きかねません。

このあたりの問題はKEPで検討されているようなので、改善されていくことに期待したいですね。(以下のツイート参照)

https://twitter.com/satoru_takeuchi/status/1656227186356154373

Kubernetes 1.28

http://lwkd.info/2023/20230503
http://lwkd.info/2023/20230510

早くもKubernetes 1.28の開発が始まりました。
気になるものをいくつかピックアップしてみました。

  • EndpointやConfigMapによるLeader Electionがなくなります。
  • Controlled rollout of CEL libraries and language features では、CEL周りの改良が進んでいるようです。
  • mutatingwebhookconfigurations と validatingwebhookconfigurations の短縮名(mwc, vwc)が使えるようになるそうです。 地味にうれしい。

eBPF Observability Tools Are Not Security Tools

https://www.brendangregg.com/blog/2023-04-28/ebpf-security-issues.html

Brendan GreggがeBPFのオブザーバビリティツールをそのままセキュリティ監視に使うなと言っている記事です。
オブザーバビリティツールはオーバーヘッドを重視するためにパケットをドロップしたりするけど、その挙動はセキュリティ監視には適していないとのことです。

More secure private attachments

https://github.blog/changelog/2023-05-09-more-secure-private-attachments/

これまで、GitHubのプライベートリポジトリのIssueにアップロードした画像は、URLが分かれば誰でも分かるようになっていました。
今後はリポジトリにアクセス権のあるユーザーにしか見えないようになるそうです。
なお、過去にアップロードした画像やファイルに遡及して適用されるわけではないそうです。

これまでは画像やファイルをアップロードするときに気を遣う必要があったので、この変更はうれしいですね。

KSOC Releases the First Kubernetes Bill of Materials (KBOM) Standard

https://ksoc.com/blog/ksoc-releases-the-first-kubernetes-bill-of-materials-kbom-standard

Kubernetes向けのSBOM仕様であるKBOMの紹介記事。
Cluster sizeやCRDsの情報、kubeletのバージョンなどが含まれるそうです。

SBOM周りはまだ過渡期という感じで、なかなか手が出しにくいですね。

🛠️ Tools, Frameworks, Libraries

controller-tools 0.12.0

https://github.com/kubernetes-sigs/controller-tools/releases/tag/v0.12.0

controller-tools v0.12.0 がリリースされました。
弊チームメンバーのPRが取り込まれています。

📘 Books

ソフトウェア設計のトレードオフと誤り

https://www.oreilly.co.jp//books/9784814400317/

コードの重複やエラーハンドリングの話から分散システムの話まで幅広く扱っていて、とても面白そうですね。

🤝 Events

KubeCon + CloudNativeCon Europe 2023

KubeConの動画がYouTubeで公開されました。
https://www.youtube.com/playlist?list=PLj6h78yzYM2PyrvCoOii4rAopBswfz1p7

私が見た動画については、以下のスクラップにメモを書いてます。
https://zenn.dev/zoetro/scraps/958cb66d6fd7ce

あとがき

弊チームのインターンシップの募集が始まりました。
Kubernetes基板の開発・運用に興味のある学生さんはぜひご参加ください。

https://cybozu.co.jp/company/job/recruitment/intern/kubernetes.html

サイボウズ Necoチーム 😺

Discussion