負荷対策 #
nodeSelector #
NodeはPodが配置されるVMや物理マシンですが、 配置されるPodの処理内容によって使用されるリソースが大きく変わることがあります。 具体的にはIngress Gatewayはクラスター内外のトラフィックを集中的に処理することが事前にわかっています。 また、Ingress Gatewayがなければアプリケーションにアクセスできないため、必ずリソースが枯渇しない状態にする必要があります。 そのため、Gatewayとしての役割以外を持つPodと別のNodeに配置されるようにすることで、Podが安定して稼働できるリソースの確保を実現します。
KubernetesはNodeに対してラベルを付与し、PodにnodeSelectorを付与することで指定のNodeに対してPodを配置することができます。 Nodeに付与されているlabelは以下のコマンドで確認することができます。
$ kubectl get nodes --show-labels
# 簡単のため表示を省略
gateway01 Ready <none> 1d v1.21.12 node-role=gateway
gateway02 Ready <none> 1d v1.21.12 node-role=gateway
worker01 Ready <none> 1d v1.21.12 node-role=worker
worker02 Ready <none> 1d v1.21.12 node-role=worker
この場合、worker
に対してPodを配置したい場合は次のように記述することができます。
|
|
PodAntiAffinity #
Podのスケジューリングはデフォルトのまま使用すると、Nodeに対する配置は明示的にコントロールされません。 つまり、あるアプリケーションを搭載したPodがNodeに偏らないようにしたいが、偏ってしまう(逆も然り)など発生します。 特にBFFサーバーはステートレスなサーバーであるため、分散配置されている方が望ましいでしょう。
KubernetesではpodAffinity
(podを条件に応じて集約)またはpodAntiAffinity
(podを条件に応じて分散)を指定することでPodのスケジューリングをコントロールすることができます。
例えば、「app.kubernetes.io/name=myapp
というラベルを持つPodが、なるべく同じNodeに配置されない」スケジューリング設定は次のように表現できます。
|
|
preferredDuringSchedulingIgnoredDuringExecution
はpodAffinityTerm
で指定されたlabelSelector
に該当するPodをtopologyKey
ごとにweight
を加算してスコアを算出します。
podAntiAffinity
で利用されるスコアになるため、スコアが高くなるほどPodはスコアの高いNodeに対してなるべく配置されないようになります。
(podAntiAffinity
はスコアの符号がマイナスで、podAffinity
はスコアの符号がプラスと思えばわかりやすい。)
また、ここではlabelSelector
で使うkey
やtopologyKey
はWell-Known Labelsを利用しています。