3.2.6 亲和性&污点容忍
nodeselctor
nodeSelector 是节点选择的最简单推荐形式。可以使用 nodeSelector 字段将pod调度到指定的节点标签的节点上。
亲和性和反亲和性
节点亲和性
有时候需要某一类别的pod根据业务需求部署到指定的节点池或者可用区,或者需要部署到指定标签的节点上,那么就需要使用节点的亲和性
•requiredDuringSchedulingIgnoredDuringExecution: 调度器只有在规则被满足的时候才能执行调度。
•preferredDuringSchedulingIgnoredDuringExecution: 调度器会优先尝试寻找满足对应规则的节点。如果找不到匹配的节点,调度器仍然会调度该 Pod。
•在上述类型中,IgnoredDuringExecution 意味着如果节点标签在 Kubernetes 调度 Pod 时发生了变更,Pod 仍将继续运行。
•同时指定了 nodeSelector 和 nodeAffiffiffinity,两者 必须都要满足, 才能将 Pod 调度到候选节点上。
•指定了多个与 nodeAffiffiffinity 类型关联的 nodeSelectorTerms, 只要其中一个 nodeSelectorTerms 满足的话,Pod 就可以被调度到节点上。
•指定了多个与同一 nodeSelectorTerms 关联的 matchExpressions, 则只有当所有 matchExpressions 都满足时 Pod 才可以被调度到节点上。
pod间亲和性
Pod 间亲和性与反亲和性使你可以基于已经在节点上运行的 Pod 的标签来约束 Pod 可以调度到的节点,而不是基于节点上的标签,比如将两个服务的 Pod 放到同一个云提供商可用区内,因为它们彼此之间通信非常频繁 。
•Pod 间亲和性和反亲和性都需要相当的计算量,因此会在大规模集群中显著降低调度速度。 我们不建议在包含数百个节点的集群中使用这类设置。
•Pod 反亲和性需要节点上存在一致性的标签。
PDB
用户在常见的场景中,比如deployment,replicaset或者statefulset等场景需要保护pod的启停行为,比如不能降低服务能力的10%以上;单实例有状态应用不能在不通知的情况下终止pod;多实例多状态的应用可用数量不能小于仲裁数量;对于job类型,需要确保任务完成等。 minAvailable 或 maxUnavailable 的值可以表示为整数或百分比。 如果将值指定为百分比,则可能无法映射到确切数量的 Pod。 Kubernetes 采用向上取整到最接近的整数的办法,因此在这种情况下,必须有 4 个 Pod。 你可以检查控制此行为的 代码。
注意:
•policy/v1beta1 和 policy/v1 API 中 PodDisruptionBudget 的空选择算符的行为 略有不同。在 policy/v1beta1 中,空的选择算符不会匹配任何 Pods,而 policy/v1 中,空的选择算符会匹配名字空间中所有 Pods。
•PDB并不能真正保证指定数量/百分比的 Pod 一直处于运行状态。PDB只能够针对自发的驱逐提供保护,而不能针对所有 Pod 不可用的诱因。
污点和容忍
有时候由于节点上有重要的业务pod,我们给节点打上污点,需要这个节点不能被别的pod调度或者给业务pod打上容忍和亲和性,让业务pod指定到被打上污点的节点上。
tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule" tolerations: - key: "key1" operator: "Exists" effect: "NoSchedule"
•如果一个容忍度的 key 为空且 operator 为 Exists, 表示这个容忍度与任意的 key 、value 和 effffect 都匹配,即这个容忍度能容忍任意 taint。
�如果 effffect 为空,则可以与所有键名 key1 的效果相匹配。