kubernetes 调度策略

本文介绍了使用taint和label来调度pod至专用节点。

post thumb
Kubernetes
作者 Louis 发表于 2021年4月14日

[TOC]

调度器通过 kubernetes 的监测(Watch)机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。 调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行

taint 和 tolerations

节点亲和性是 Pod 的一种属性,它使 Pod 被吸引到一类特定的节点。 这可能出于一种偏好,也可能是硬性要求。 Taint(污点)则相反,它使节点能够排斥一类特定的 Pod。

容忍度(Tolerations)是应用于 Pod 上的,允许Pod 调度到带有与之匹配的污点的节点上。

污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。

nodeSelector

nodeSelector 是节点选择约束的最简单推荐形式。nodeSelector 是 PodSpec 的一个字段。 它包含键值对的映射。为了使 pod 可以在某个节点上运行,该节点的标签中 必须包含这里的每个键值对(它也可以具有其他标签)。 最常见的用法的是一对键值对。

场景

比如有以下场景。

我有10台主机。 3master,7node。 其中3台用于production环境, 4台用于测试环境。区分策略如下:

# taint
kubectl taint nodes cn-hangzhou.i-bp1my group=non_prod:NoSchedule
kubectl taint nodes cn-hangzhou.i-bp193 group=non_prod:NoSchedule
kubectl taint nodes cn-hangzhou.i-bp151 group=non_prod:NoSchedule
kubectl taint nodes cn-hangzhou.i-bp1bs group=non_prod:NoSchedule
 
# label
kubectl label node cn-hangzhou.i-bp1my env=non_prod
kubectl label node cn-hangzhou.i-bp193 env=non_prod
kubectl label node cn-hangzhou.i-bp151 env=non_prod
kubectl label node cn-hangzhou.i-bp1bs env=non_prod

然后测试节点的deployment里面可以添加tolerations和nodeSelector。 即可保证调度的pod全部到env=non_prod组的node节点里面。

      nodeSelector:
        env: non_prod
      tolerations:
      - effect: NoSchedule
        key: group
        operator: Equal
        value: non_prod

生产标签和taint如下:

kubectl taint nodes cn-hangzhou.i-bp001 group=prod:NoSchedule
kubectl taint nodes cn-hangzhou.i-bp002 group=prod:NoSchedule
kubectl taint nodes cn-hangzhou.i-bp003 group=prod:NoSchedule
kubectl taint nodes cn-hangzhou.i-bp004 group=prod:NoSchedule
 
# label
kubectl label node cn-hangzhou.i-bp001 env=prod
kubectl label node cn-hangzhou.i-bp002 env=prod
kubectl label node cn-hangzhou.i-bp003 env=prod
kubectl label node cn-hangzhou.i-bp004 env=prod

生产环境的deployment添加以下tolerations和nodeselector.

      nodeSelector:
        env: prod
      tolerations:
      - effect: NoSchedule
        key: group
        operator: Equal
        value: prod

简单记录一下。此套已经在生产环境运行2年了。

上一篇
记一次kubernetes升级1.18.8后的helm相关问题及解决。