# pod调度

  • 默认情况pod在哪个node运行是由scheduler组件算出来的

# 四种调度方式

  • 自动调度:完全由scheduler决定
  • 定向调度:NodeName NodeSelector
  • 亲和性调度: NodeAffinity、PodAffinity、PodAntiAffinity
  • 污点(容忍)调度: Taints、Toleration
    • pod能够容忍node有缺点

# 定向调度

  • 强制性,如果没有合适的node节点,pod不会成功运行

# NodeName

  • 跳过了scheduler调度逻辑
  • pod和node一对一
spec:
  containers:
    ...
  nodeName: node1 # node节点的名字
1
2
3
4

# NodeSelector

  • 将pod调度到指定标签的node节点
  • k8s的 label-selector机制实现
  • pod创建之前scheduler会使用MatchNodeSelector调度策略进行label匹配
  • 也是强制
spec:
  nodeSelector:
    nodeenv: pro  # 通过标签选择
1
2
3

# 亲和性度调度 优先级

  • nodeAffinity: node亲和性
    • node为目标,解决pod调度到那些node的问题
  • podAffinity: pod亲和性
    • 以pod为目标,解决pod和pod部署在同一个拓扑结构中
  • podAntiAffinity: 反pod亲和性
    • pod为目标,某些pod尽可能不部署在一个拓扑结构

亲和性和反亲和性应用场景

  • 亲和性
    • 两个频繁交互的应用,有必要让两个pod部署的更靠近(比如同一个node上),这样可以减少网络性能消耗

# nodeAffinity

required during scheduling ignored during execution

pod.spec.affinity.nodeAffinity:
  # 必须的,硬的,条件必须满足
  requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
      matchFields: # 按照节点字段
        key: string
        values: string
        operator: string # 关系符 Exists, DoesNotExists, In, NotIn, 
      matchExpressions: # 按照节点标签
        key: string
        values: string
        operator: string # 关系符 Exists, DoesNotExists, In, NotIn, Gt, Lt

  # 首选的,软的, 条件不好可以不满足
  preferredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
      matchFields: # 按照节点字段
        key: string
        values: string
        operator: string # 关系符 Exists, DoesNotExists, In, NotIn, 
      matchExpressions: # 按照节点标签
        key: string
        values: string
        operator: string # 关系符 Exists, DoesNotExists, In, NotIn, Gt, Lt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

matchExpressions使用

- matchExpressions:
  - key: nodeenv
    operator: Exists
  - key: nodeenv
    operator: In
    values: ["a", "b"]
  - key: nodeenv
    operator: Gt  # 大于
    values: "xxx"
1
2
3
4
5
6
7
8
9