Open6

Node上へのPodのスケジューリング

スケジューリングでラベルを用いる方法は以下2つ。

  1. Nodeラベル(nodeAffinity)
  2. Node上で稼働するPodラベル(podAffinity/podAntiAffinity)

https://kubernetes.io/ja/docs/concepts/scheduling-eviction/assign-pod-node/#pod間アフィニティとアンチアフィニティ

設定例。

  • アフィニティ:キーが"security"、値が"S1"のラベルが付与されたPodが少なくとも1つは稼働しているNodeが同じゾーンにあれば、PodはそのNodeにスケジュールされる
  • アンチアフィニティ
    • ホスト:すでにあるNode上で、キーが"security"、値が"S2"であるPodが稼働している場合に、Podを可能な限りそのNode上で稼働させない
    • ゾーン;topologyKeyがtopology.kubernetes.io/zoneであった場合、キーが"security"、値が"S2"であるであるPodが稼働しているゾーンと同じゾーン内のNodeにはスケジュールされなくなります

https://kubernetes.io/ja/docs/concepts/scheduling-eviction/kube-scheduler/

新規作成されたPodをNodeに割り当てるのはスケジューラが担う。デフォルトのスケジューラは kube-scheduler。スケジューラは2つのステップがある。

  1. フィルタリング
  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は対象外となる。

ログインするとコメントできます