[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年了。