ydswin

忘记背后,努力面前的,向着标杆直跑

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

统计

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 AffinityNodeSelector 的增强版,支持更复杂的调度规则。它允许用户定义更灵活的节点选择条件。

使用方法

  • 在 Pod 的 YAML 文件中定义 affinity
    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
    
    上述配置表示 Pod 必须调度到带有 disktype=ssddisktype=hdd 标签的节点上。

核心概念

  • requiredDuringSchedulingIgnoredDuringExecution:调度时必须满足的条件,运行时不会检查。
  • preferredDuringSchedulingIgnoredDuringExecution:调度时优先满足的条件,但不强制。
  • operator:支持 InNotInExistsDoesNotExistGtLt 等操作符。

适用场景

  • 需要更复杂的节点选择逻辑。
  • 支持软性调度(优先但不强制)。

回到顶部

3. Pod 亲和性与反亲和性(Pod Affinity/Anti-Affinity)

Pod AffinityPod 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)

TaintsTolerations 用于控制哪些 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 集群的资源利用率和稳定性。

posted on   dashery  阅读(237)  评论(0编辑  收藏  举报

点击右上角即可分享
微信分享提示