Open1

PodAffinityの現状の仕様とその制限。そしてUpstreamでは改善策にFeedBack/Usecaseを求めているよ、という話

さんぽしさんぽし

disclaimer: この記事というかスクラップはKubernetes v1.26時点での状態をもとに議論をおこなっています。

こんにちは。@sanposhihoといいます。皆さん年末いかがお過ごしでしょうか。

KubernetesにはPod Affinityという「このPodとこのPodを同じNode/Region/Zoneに置きたい/置きたくない」みたいなことを指定できる機能があります。
https://kubernetes.io/ja/docs/concepts/scheduling-eviction/assign-pod-node/

apiVersion: v1
kind: Pod
metadata:
  name: hoge-pod
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: topology.kubernetes.io/zone

例えば、↑このような感じで指定すると「securityというラベルkeyにS1という値を持っているPodと同じZoneにhoge-podをおこう」という意味になります。

PodAffinityでは複数のAffinityを同じPodに持たせることができます。↓のような感じです。↓では、「storageというラベルkeyにmysql-for-hoge-podという値を持っているPodと同じNodeにhoge-podをおこう」という意味のPodAffinityを追加しています。

apiVersion: v1
kind: Pod
metadata:
  name: hoge-pod
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: storage
            operator: In
            values:
            - mysql-for-hoge-pod
        topologyKey: kubernetes.io/hostname
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: topology.kubernetes.io/zone

このPodAffinity、実際にはどのような振る舞いをするか想像が着きますか?PodAffinityにそれほど詳しくない人が見たら以下の二通りの解釈が生まれるでしょう。どちらが正解か分かりますか?

  1. storageというラベルkeyにmysql-for-hoge-podという値を持っているPod」と「securityというラベルkeyにS1という値を持っているPod」は別のPodでも良い
  2. storageというラベルkeyにmysql-for-hoge-podという値を持っているPod」と「securityというラベルkeyにS1という値を持っているPod」は同じである必要がある

正解は2です。

そして、1もサポートした方が良くね?と言うIssueが立っています。それも、なんと2018年から。

https://github.com/kubernetes/kubernetes/issues/68701

そして、Issueの議論を見ていただければ分かるのですが「このIssue、長いことopenだけど、盛り上がってなくない? ほんまにこれ実装する価値あるんか?(= これを欲してる人おるんけ?)」と言う話に現在落ち着いています。

と言うことで、欲しい人はIssueにコメントを入れてください。と言う記事でした。