我有一个关于pod跨节点分布的问题。我喜欢的是给定一个3节点群集,我想部署一个具有2个副本的pod,同时确保这些副本部署在不同的节点上,以实现高可用性。除了使用nodeAffinity之外,还有哪些选项?
zfycwa2u1#
首先,节点关联允许您根据节点上的标签来约束可以在哪些节点上调度Pod。因此,它不能保证每个副本都部署在不同的节点上,也不能保证这些节点均匀分布在所有节点上。但是,有效的解决方案是使用Pod拓扑扩散约束。Pod拓扑扩散约束依赖于节点标签来标识每个节点所在的拓扑域,然后使用这些标签来匹配具有相同标签的Pod。可以定义一个或多个topologySpreadConstraint,以指示kube调度程序如何相对于集群中的现有Pod放置每个传入Pod。
topologySpreadConstraint
kind: Pod apiVersion: v1 metadata: name: mypod labels: node: node1 spec: topologySpreadConstraints: - maxSkew: 1 topologyKey: zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: node: node1 containers: - name: myapp image: image_name
maxSkew: 1描述了Pods可能分布不均的程度,必须大于零,语义根据whenUnsatisfable的取值不同而不同。topologyKey: zone意味着均匀分布将仅应用于存在标签对“zone:“的节点。whenUnsatisfiable: DoNotSchedule告诉调度程序,如果传入Pod不能满足约束,则让它保持挂起状态。labelSelector用于查找匹配的Pod,对匹配此标签选择器的Pod进行计数,以确定其对应拓扑域中的Pod数量。有关Pod拓扑扩散约束的详细信息,请参阅本文档:https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/
maxSkew: 1
topologyKey: zone
whenUnsatisfiable: DoNotSchedule
labelSelector
h5qlskok2#
如果你需要保证无论发生什么,它们都不会在同一个节点上结束,你就必须使用AntiAffinity。另一方面,如果您需要更灵活的解决方案,可以使用spread constraints,甚至将其与AntiAffinity结合使用。
2条答案
按热度按时间zfycwa2u1#
首先,节点关联允许您根据节点上的标签来约束可以在哪些节点上调度Pod。因此,它不能保证每个副本都部署在不同的节点上,也不能保证这些节点均匀分布在所有节点上。但是,有效的解决方案是使用Pod拓扑扩散约束。
Pod拓扑扩散约束依赖于节点标签来标识每个节点所在的拓扑域,然后使用这些标签来匹配具有相同标签的Pod。可以定义一个或多个
topologySpreadConstraint
,以指示kube调度程序如何相对于集群中的现有Pod放置每个传入Pod。maxSkew: 1
描述了Pods可能分布不均的程度,必须大于零,语义根据whenUnsatisfable的取值不同而不同。topologyKey: zone
意味着均匀分布将仅应用于存在标签对“zone:“的节点。whenUnsatisfiable: DoNotSchedule
告诉调度程序,如果传入Pod不能满足约束,则让它保持挂起状态。labelSelector
用于查找匹配的Pod,对匹配此标签选择器的Pod进行计数,以确定其对应拓扑域中的Pod数量。有关Pod拓扑扩散约束的详细信息,请参阅本文档:https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/
h5qlskok2#
如果你需要保证无论发生什么,它们都不会在同一个节点上结束,你就必须使用AntiAffinity。
另一方面,如果您需要更灵活的解决方案,可以使用spread constraints,甚至将其与AntiAffinity结合使用。