使用 pod Anti Affinity 强制每个节点只有 1 个 pod
Using pod Anti Affinity to force only 1 pod per node
我正在尝试让我的部署仅将副本部署到不是 运行 rabbitmq(正在运行)并且还没有我正在部署的 pod(未运行)的节点。
我似乎无法让它工作。例如,如果我有 3 个节点(2 个标签为 app.kubernetes.io/part-of=rabbitmq),那么所有 2 个副本都将部署到其余节点。就像部署在确定反亲和性时没有考虑它们自己的 pods 一样。我想要的状态是它只部署 1 个 pod,另一个不应该被安排。
kind: Deployment
metadata:
name: test-scraper
namespace: scrapers
labels:
k8s-app: test-scraper-deployment
spec:
replicas: 2
selector:
matchLabels:
app: testscraper
template:
metadata:
labels:
app: testscraper
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/part-of
operator: In
values:
- rabbitmq
- key: app
operator: In
values:
- testscraper
namespaces: [scrapers, rabbitmq]
topologyKey: "kubernetes.io/hostname"
containers:
- name: test-scraper
image: #######:latest```
我认为那是因为清单的 matchExpressions
部分,它要求 pods 需要同时具有标签 app.kubernetes.io/part-of: rabbitmq
和 app: testscraper
满足反关联规则。
根据您提供的部署 yaml,这些 pods 将只有 app: testscraper
但 NOT pp.kubernetes.io/part-of: rabbitmq
因此两个副本都得到安排在同一节点上
来自文档(要求是 ANDed。):
kubectl explain pod.spec.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution.labelSelector
...
FIELDS:
matchExpressions <[]Object>
matchExpressions is a list of label selector requirements.
**The requirements are ANDed.**
我正在尝试让我的部署仅将副本部署到不是 运行 rabbitmq(正在运行)并且还没有我正在部署的 pod(未运行)的节点。
我似乎无法让它工作。例如,如果我有 3 个节点(2 个标签为 app.kubernetes.io/part-of=rabbitmq),那么所有 2 个副本都将部署到其余节点。就像部署在确定反亲和性时没有考虑它们自己的 pods 一样。我想要的状态是它只部署 1 个 pod,另一个不应该被安排。
kind: Deployment
metadata:
name: test-scraper
namespace: scrapers
labels:
k8s-app: test-scraper-deployment
spec:
replicas: 2
selector:
matchLabels:
app: testscraper
template:
metadata:
labels:
app: testscraper
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/part-of
operator: In
values:
- rabbitmq
- key: app
operator: In
values:
- testscraper
namespaces: [scrapers, rabbitmq]
topologyKey: "kubernetes.io/hostname"
containers:
- name: test-scraper
image: #######:latest```
我认为那是因为清单的 matchExpressions
部分,它要求 pods 需要同时具有标签 app.kubernetes.io/part-of: rabbitmq
和 app: testscraper
满足反关联规则。
根据您提供的部署 yaml,这些 pods 将只有 app: testscraper
但 NOT pp.kubernetes.io/part-of: rabbitmq
因此两个副本都得到安排在同一节点上
来自文档(要求是 ANDed。):
kubectl explain pod.spec.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution.labelSelector
...
FIELDS:
matchExpressions <[]Object>
matchExpressions is a list of label selector requirements.
**The requirements are ANDed.**