与 Node 的亲缘性

Pod 支持通过配置 Node 亲缘性来 强制或非强制 将该 Pod 调度至某个 Node 子集中:

  • 强制:与 pod.spec.nodeSelector 效果一致,强制将 Pod 调度至某个 Node 子集中;

  • 非强制:即该 Pod 更倾向于调度至某些 Node 上,若没法实现的话,将会被调度至其他 Node 中;

Pod 的 Node 亲缘性规则同样是通过 标签 来实现的,通过在配置规则中指定亲缘的标签,Pod 会被优先调度至包含该标签的 Node 中。

🍓 Pod 的 Node 亲缘性规则在 pods.spec.affinity.nodeAffinity 中进行配置,该配置中需要指定亲缘属性,目前共包含下面两种属性:

  • preferredDuringSchedulingIgnoredDuringExecution: 从 preferredDuringScheduling 可以看出是非强制的;

  • requiredDuringSchedulingIgnoredDuringExecution:从 requiredDuringScheduling 可以看出是强制的;

IgnoredDuringExecution 表示当前的亲缘性规则只会当该 Pod 被调度时生效,不会令已经在运行的 Pod 被剔除重新调度

强制性 Node 亲缘性

pod.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution 中指定强制性 Node 亲缘性规则。

下面展示一个具体案例,创建的 Pod 被强制调度至带有 gpu=true 的 Node 上:

apiVersion: v1
kind: Pod
metadata:
  name: kubia-gpu
spec:
  affinity:
    nodeAffinity:    # 配置 Node 亲缘性规则
      requiredDuringSchedulingIgnoredDuringExecution:    # 强制性规则
        nodeSelectorTerms:
        - matchExpressions:    # 使用扩展语法匹配
          # 匹配带有 gpu=true 标签的 Node
          - key: gpu
            operator: In
            values:
            - "true"
  containers:
  - image: luksa/kubia
    name: kubia

非强制性 Node 亲缘性

pod.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution.preference 中指定非强制性规则。

下面展示一个具体案例,创建的 Pod 优先调度至带有 availability-zone=zone1share-type=dedicated 标签的 Node 中,并且第一个优先级规则更重要,权重设置为 80,第二个优先级规则相对次要,权重设为 20

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pref
spec:
  selector:
    matchLabels:
      app: pref
  replicas: 5
  template:
    metadata:
      labels:
        app: pref
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:    # 非强制性亲缘性规则
          # 优先将 Pod 调度至带有 availability-zone=zone1 标签的 Node 中;否则调度至带有 share-type=dedicated 标签的 Node 中;否则调度至其他 Node 中
          - weight: 80    # 指定该类型 Node 的权重
            preference:
              # 匹配带有 availability-zone=zone1 标签的 Node
              matchExpressions:
              - key: availability-zone
                operator: In
                values:
                - zone1
          - weight: 20    # 权重
            preference:
              # 匹配带有 share-type=dedicated 标签的 Node
              matchExpressions:
              - key: share-type
                operator: In
                values:
                - dedicated
      containers:
      - args:
        - sleep
        - "99999"
        image: busybox
        name: main

根据案例中的亲缘性规则,可以将 Node 分为四类,优先级从高到低排序如下:

  1. 同时包含 availability-zone=zone1share-type=dedicated 标签的 Node;

  2. 仅包含 availability-zone=zone1 标签的 Node;

  3. 仅包含 share-type=dedicated 标签的 Node;

  4. 其他 Node;

Kubernetes 调度 Pod 需要经过 过滤称重 两个过程,由于此处是 非强制 亲缘性规则,因此最终 Node 还会受其他优先级函数的影响。例如有 SpreadPriority 函数,用于将 Pod 分散部署在不同的 Node 中,因此可能会导致有少部分 Pod 并没有被分配至亲缘性最高的 Node 中。

Last updated

Was this helpful?