Open1
PodAffinityの現状の仕様とその制限。そしてUpstreamでは改善策にFeedBack/Usecaseを求めているよ、という話
disclaimer: この記事というかスクラップはKubernetes v1.26時点での状態をもとに議論をおこなっています。
こんにちは。@sanposhihoといいます。皆さん年末いかがお過ごしでしょうか。
KubernetesにはPod Affinityという「このPodとこのPodを同じNode/Region/Zoneに置きたい/置きたくない」みたいなことを指定できる機能があります。
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にそれほど詳しくない人が見たら以下の二通りの解釈が生まれるでしょう。どちらが正解か分かりますか?
- 「
storage
というラベルkeyにmysql-for-hoge-pod
という値を持っているPod」と「security
というラベルkeyにS1
という値を持っているPod」は別のPodでも良い - 「
storage
というラベルkeyにmysql-for-hoge-pod
という値を持っているPod」と「security
というラベルkeyにS1
という値を持っているPod」は同じである必要がある
正解は2です。
そして、1もサポートした方が良くね?と言うIssueが立っています。それも、なんと2018年から。
そして、Issueの議論を見ていただければ分かるのですが「このIssue、長いことopenだけど、盛り上がってなくない? ほんまにこれ実装する価値あるんか?(= これを欲してる人おるんけ?)」と言う話に現在落ち着いています。
と言うことで、欲しい人はIssueにコメントを入れてください。と言う記事でした。