我有一个 K8s 部署,其规范中有节点选择器和硬 pod 反亲和性。节点选择器将 Pod 部署限制在一个节点池中,而反亲和性限制没有两个标签为“App: test-pool”的 pod 被安排在一起。
观察
目标节点池有 9 个具有唯一标签值的节点,节点选择器使用该标签值来定位 pod 部署。当我有 9 个部署副本时,所有副本都安排在不同的节点上,我认为这是由于反亲和性。但是,一旦我将副本增加到 10,我看到第 10 个 pod 也成功部署在节点池中的 9 个节点之一上,从而忽略了硬反关联规则。以下是depoyment的片段:
kind: Deployment
metadata:
name: test-app
labels:
App: test-app
spec:
replicas: 10
selector:
matchLabels:
App: test-app
strategy:
rollingUpdate:
maxSurge: 34%
maxUnavailable: 34%
type: RollingUpdate
template:
metadata:
labels:
App: test-app
spec:
nodeSelector:
app: test-pool
tolerations:
- key: "dedicated"
operator: "Equal"
value: "test-pool"
effect: "NoSchedule"
- key: "dedicated"
operator: "Equal"
value: "test-pool"
effect: "NoExecute"
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- test-app
topologyKey: kubernetes.io/hostname
...
...
期待
我期待参考反关联规则的调度失败。有人可以解释为什么在调度过程中忽略了 pod 反关联规则。