在之前的文章 labels控制pod运行位置 提到可以通过 nodeSelector来控制将pod运行到哪台集群节点。

本文中要使用的 nodeAffinity (节点亲和性),其功能与 nodeSelector是类似的,也是根据节点标签来对 pod 进行调度启动

相比 nodeSelectornodeAffinity 更加的灵活,功能多,支持硬策略和软策略

匹配更多的逻辑组合,不只是字符串的完全相等

调度分为软策略和硬策略,而不是硬性要求

  • 硬(required):必须满足(和nodeSelector一致),配置项全称为requiredDuringSchedulingIgnoredDuringExecution
  • 软(preferred):尝试满足,但不是必须。如果节点的标签在运行时发生变更,也可以继续在该节点运行。配置项全称为preferredDuringSchedulingIgnoredDuringExecution

nodeAffinity硬策略示例

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      # 硬策略
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          # 节点标签的key必须为disktype
          - key: disktype
            operator: In
            # 节点标签key的值必须为ssd1或者ssd2
            values:
            - ssd1
            - ssd2
  containers:
  - name: nginx
    image: nginx
    ...

以上文件中的节点亲和性表示,pod 必须被调度在具有标签 kubernetes.io/e2e-az-name=ssd1或者kubernetes.io/e2e-az-name=ssd2 的集群节点上,没有则 Pending 状态

nodeAffinity软策略示例

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      # 软策略
      preferredDuringSchedulingIgnoredDuringExecution:
      # 
      - weight: 1
        preference:
          matchExpressions:
          - key: key
            operator: In
            values:
            - value
  containers:
  - name: nginx
    image: nginx
    ...

以上文件中的节点亲和性表示,如果节点中存在节点标签为 key=value,则优先调度到该节点,如果整个集群中都没有节点中有主要的标签,也会根据其它的调度规则,调度到某一个节点。

weight 字段值的 范围是 1-100。 对于每个符合所有调度要求(资源请求、RequiredDuringScheduling 亲和性表达式等) 的节点,调度器将遍历该字段的元素来计算总和,并且如果节点匹配对应的 MatchExpressions,则添加“权重”到总和。 然后将这个评分与该节点的其他优先级函数的评分进行组合。 总分最高的节点是最优选的。

操作符

在以上的操作中,可以看到除了 keyvalue 有值以外,还有 operator

operator的值被叫做操作符,一共有以下几种

In:label的value在指定key中

Notln:label的value不在指定的key中

Exists:某个label存在

DoesNotExist:某个label不存在

Gt:label的value大于某个值

Lt:label的value小于某个值

如果nodeSelectorTerms下面有多个选项的话,满足任何一个条件就可以了;如果matchExpressions有多个选项的话,则必须同时满足这些条件才能正常调度 POD。

使用事项

两种策略可以同时使用,在满足硬策略的前提,优先选择具有软策略规则的节点进行调度。

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0