Kubernetes 强制将副本分散到各个工作节点

Kubernetes 强制将副本分散到各个工作节点

我有一个本地 Kubernetes 集群,最近它需要物理重启所有工作节点(运行三个工作节点)。当 Pod 恢复时,我注意到所有 Pod 都安排在一个物理工作节点上,而不是均匀分布在三个工作节点上。我假设其他两个工作节点在重启后需要更长时间才能恢复在线,而 Kubernetes 只是将我们所有的应用程序安排在唯一启动的工作节点上。

部署 yaml 中是否有办法指定所有部署副本最终应分布在所有工作节点上?IE 是否阻止 Kubernetes 在单个工作节点上启动所有 pod?

答案1

有这样一种东西叫豆荚间抗亲和性就是这样的。

来自 k8s 文档:

Pod 间亲和性和反亲和性允许您根据节点上已运行的 Pod 上的标签(而不是节点上的标签)来限制您的 Pod 有资格被调度到哪些节点。规则的形式为“如果 X 已运行一个或多个符合规则 Y 的 Pod,则此 Pod 应该(或者,在反亲和性的情况下,不应该)在 X 中运行”。

例子:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  selector:
    matchLabels:
      app: web-store
  replicas: 3
  template:
    metadata:
      labels:
        app: web-store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web-store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: web-app
        image: nginx:1.16-alpine

它将确保同一部署中的任何两个 Pod 都不会被调度到同一个节点上。如果没有更多节点可用于调度 Pod,Pod 将停留在待办的状态(不会被安排)。

相关内容