Exponential HistogramsやMemory QoSの紹介記事など: Neco Weekly (2023-05-12号)
Neco Weekly (2023-05-12号)
サイボウズ Neco チームでは、 Neco Weekly という「最近気になる Kubernetes や Cloud Native 関連のネタを共有する会」を社内で開催しています。
本記事は共有会の中で紹介したネタをまとめたものです。
今回は第31回目の記事となります。
👀 Notable Articles
A Technique To Monitor Kubernetes Controller Latency
Kubernetesのコントローラーは、リクエストがいったんAPI Serverに保存されてそれを複数のコントローラーが取り出して順次処理するというスタイルなので、処理全体のレイテンシーを計測しにくいという問題があります。
そこで、kube-proxyではcontroller-managerが付与したlast-change-trigger-time
アノテーションを使って、実際に処理が完了するまでの時刻を計測しているそうです。
また、この仕組みは分散トレーシングにも応用できるだろうと言及しています。
以前同様の仕組みを使ってコントローラーで分散トレーシングする実験をしたので、よろしければ以下のスクラップもご覧ください。
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)
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)
StatefulSetを消したときや、replicasを減らしたときにPVCを自動で消してくれる機能です。
これまではreplicasを減らしたときに手動でPVCを消す必要があって非常に面倒でしたが、
一方で、現状のStatefulSetにはvolumeTemplate
を書き換えられないという問題があります。
volumeTemplate
が書き換えられないので、PVCのサイズを変更したいときにStatefulSetを消して作り直す必要があります。
そのため、PVCのサイズを変更するためにStatefulSetを消したときに、意図せずPVCが消えてしまうという問題が起きかねません。
このあたりの問題はKEPで検討されているようなので、改善されていくことに期待したいですね。(以下のツイート参照)
Kubernetes 1.28
早くも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
Brendan GreggがeBPFのオブザーバビリティツールをそのままセキュリティ監視に使うなと言っている記事です。
オブザーバビリティツールはオーバーヘッドを重視するためにパケットをドロップしたりするけど、その挙動はセキュリティ監視には適していないとのことです。
More secure private attachments
これまで、GitHubのプライベートリポジトリのIssueにアップロードした画像は、URLが分かれば誰でも分かるようになっていました。
今後はリポジトリにアクセス権のあるユーザーにしか見えないようになるそうです。
なお、過去にアップロードした画像やファイルに遡及して適用されるわけではないそうです。
これまでは画像やファイルをアップロードするときに気を遣う必要があったので、この変更はうれしいですね。
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
controller-tools v0.12.0 がリリースされました。
弊チームメンバーのPRが取り込まれています。
📘 Books
ソフトウェア設計のトレードオフと誤り
コードの重複やエラーハンドリングの話から分散システムの話まで幅広く扱っていて、とても面白そうですね。
🤝 Events
KubeCon + CloudNativeCon Europe 2023
KubeConの動画がYouTubeで公開されました。
私が見た動画については、以下のスクラップにメモを書いてます。
あとがき
弊チームのインターンシップの募集が始まりました。
Kubernetes基板の開発・運用に興味のある学生さんはぜひご参加ください。
Discussion