Open6
Node上へのPodのスケジューリング
スケジューリングでラベルを用いる方法は以下2つ。
- Nodeラベル(nodeAffinity)
- Node上で稼働するPodラベル(podAffinity/podAntiAffinity)
設定例。
- アフィニティ:キーが"security"、値が"S1"のラベルが付与されたPodが少なくとも1つは稼働しているNodeが同じゾーンにあれば、PodはそのNodeにスケジュールされる
- アンチアフィニティ
- ホスト:すでにあるNode上で、キーが"security"、値が"S2"であるPodが稼働している場合に、Podを可能な限りそのNode上で稼働させない
- ゾーン;topologyKeyがtopology.kubernetes.io/zoneであった場合、キーが"security"、値が"S2"であるであるPodが稼働しているゾーンと同じゾーン内のNodeにはスケジュールされなくなります
新規作成されたPodをNodeに割り当てるのはスケジューラが担う。デフォルトのスケジューラは kube-scheduler
。スケジューラは2つのステップがある。
- フィルタリング
- スコアリング
フィルタリングは例えば、Podのリソース要求を満たすNodeをフィルタリングする。スコアリングはPodのAffinity/AntiAffinity等を持ってスコアリングされる。kube-schedulerの場合はデフォルトポリシーの設定が適用される。
ユースケース
Podを同じNodeに共存させない場合。
deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
selector:
matchLabels:
app: web-store
replicas: 3
template:
metadata:
labels:
app: web-store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-store
topologyKey: "kubernetes.io/hostname"
containers:
- name: web-app
image: nginx:1.16-alpine
podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution
で、Node上にPodのラベル app:web-store
が存在する場合、そのNodeにはスケジューリングされない。
ただし、podAntiAffinityはスコアリングステップで実行されるため、フィルタリングステップに存在しないNodeは対象外となる。
スケジューラ(kube-scheduler)の各ステップを理解する。(v1.19.11)
参考
デプロイ(ローリングアップデート)では、 maxUnavailable
と maxSurge
の設定も適切なスケジューリングには考慮が必要。