使用 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: testscraperNOT 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.**