Kubernetes Pod四种常见调度策略详解
在 Kubernetes 中,Pod 的调度策略决定了 Pod 如何被分配到集群中的节点上。Kubernetes 提供了多种调度策略,以下是四种常见的调度策略及其详解:
1. 节点选择器(NodeSelector)
NodeSelector
是一种简单的调度策略,允许用户通过标签(Label)选择特定的节点来运行 Pod。
使用方法
-
给节点打标签:
kubectl label nodes <node-name> <label-key>=<label-value>
例如:
kubectl label nodes node-1 disktype=ssd
-
在 Pod 的 YAML 文件中指定
nodeSelector
:apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mycontainer image: nginx nodeSelector: disktype: ssd
这样,Pod 只会调度到带有
disktype=ssd
标签的节点上。
适用场景
- 需要将 Pod 调度到特定硬件或配置的节点上。
- 简单场景下的节点选择。
2. 节点亲和性(Node Affinity)
Node Affinity
是 NodeSelector
的增强版,支持更复杂的调度规则。它允许用户定义更灵活的节点选择条件。
使用方法
- 在 Pod 的 YAML 文件中定义
affinity
:
上述配置表示 Pod 必须调度到带有apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mycontainer image: nginx affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disktype operator: In values: - ssd - hdd
disktype=ssd
或disktype=hdd
标签的节点上。
核心概念
requiredDuringSchedulingIgnoredDuringExecution
:调度时必须满足的条件,运行时不会检查。preferredDuringSchedulingIgnoredDuringExecution
:调度时优先满足的条件,但不强制。operator
:支持In
、NotIn
、Exists
、DoesNotExist
、Gt
、Lt
等操作符。
适用场景
- 需要更复杂的节点选择逻辑。
- 支持软性调度(优先但不强制)。
3. Pod 亲和性与反亲和性(Pod Affinity/Anti-Affinity)
Pod Affinity
和 Pod Anti-Affinity
用于控制 Pod 之间的调度关系,决定 Pod 是否可以调度到同一节点或不同节点。
使用方法
-
Pod Affinity(亲和性):
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mycontainer image: nginx affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - web topologyKey: kubernetes.io/hostname
上述配置表示 Pod 必须调度到运行了
app=web
标签的 Pod 所在的节点。 -
Pod Anti-Affinity(反亲和性):
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mycontainer image: nginx affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - web topologyKey: kubernetes.io/hostname
上述配置表示 Pod 不能调度到运行了
app=web
标签的 Pod 所在的节点。
适用场景
- Pod Affinity:适用于需要将某些 Pod 调度到同一节点的情况,例如提高通信效率。
- Pod Anti-Affinity:适用于需要将 Pod 分散到不同节点的情况,例如提高高可用性。
4. 污点和容忍度(Taints and Tolerations)
Taints
和 Tolerations
用于控制哪些 Pod 可以调度到哪些节点。Taints
是节点的属性,用于排斥 Pod,而 Tolerations
是 Pod 的属性,用于容忍节点的污点。
使用方法
-
给节点添加污点:
kubectl taint nodes <node-name> <key>=<value>:<effect>
例如:
kubectl taint nodes node-1 gpu=true:NoSchedule
-
在 Pod 的 YAML 文件中定义
tolerations
:apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mycontainer image: nginx tolerations: - key: "gpu" operator: "Equal" value: "true" effect: "NoSchedule"
上述配置表示 Pod 可以容忍带有
gpu=true:NoSchedule
污点的节点。
污点的效果(Effect)
NoSchedule
:Pod 不会被调度到该节点(已运行的 Pod 不受影响)。PreferNoSchedule
:尽量不调度 Pod 到该节点。NoExecute
:Pod 不会被调度到该节点,且已运行的 Pod 会被驱逐。
适用场景
- 专用节点(如 GPU 节点)的调度。
- 节点维护或故障时限制 Pod 调度。
总结
调度策略 | 特点 | 适用场景 |
---|---|---|
NodeSelector | 简单,基于节点标签选择节点。 | 简单场景下的节点选择。 |
Node Affinity | 灵活,支持复杂条件。 | 需要复杂节点选择逻辑的场景。 |
Pod Affinity | 控制 Pod 之间的调度关系(亲和性)。 | 需要 Pod 在同一节点运行的场景。 |
Pod Anti-Affinity | 控制 Pod 之间的调度关系(反亲和性)。 | 需要 Pod 分散到不同节点的场景。 |
Taints/Tolerations | 通过污点和容忍度控制 Pod 调度。 | 专用节点或节点维护场景。 |
根据实际需求选择合适的调度策略,可以有效优化 Kubernetes 集群的资源利用率和稳定性。
本文来自博客园,作者:dashery,转载请注明原文链接:https://www.cnblogs.com/ydswin/p/18403319
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步