我有一个由3个工作程序节点组成的kubernetes集群,我需要在其中部署一个具有6个副本的statefulset
应用程序。
我的要求是确保在每种情况下,每个节点都应在6个副本中恰好获得2个容器。基本上,
node1 - 2 pods of app
node2 - 2 pods of app
node3 - 2 pods of app
========================
Total 6 pods of app
任何帮助将不胜感激!
答案 0 :(得分:2)
您应该使用Pod Anti-Affinity来确保Pod已传播到其他节点。
由于节点上将有多个吊舱,因此请使用preferredDuringSchedulingIgnoredDuringExecution
当应用程序带有标签app: mydb
(使用适合您的情况)的示例:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- mydb
topologyKey: "kubernetes.io/hostname"
每个节点应在6个副本中准确地获得2个容器
尽量不要认为Pod已固定到特定节点。 Kubernetes工作负载的想法是该工作负载独立于诸如节点之类的基础架构。我想-您真正想要的是散布豆荚以提高可用性-例如如果一个节点出现故障,您的系统仍将可用。
如果您在云提供商处运行,则可能应该设计反亲和性,以便将Pod安排到不同的可用区,而不仅安排到不同的节点-而且要求您的群集部署在一个Region中(由多个可用区)。
均匀分布后,所有3个节点(分散在三个区域中)将具有2个容器。那没问题。硬性要求是,如果1个节点(说节点1)发生故障,那么它是2个Pod,无需在其他节点上重新安排。恢复节点1后,现在将在其上重新安排这2个Pod。因此,可以说,所有3对Pod具有不同的节点/区域亲和力。有什么想法吗?
此 可以用PodAffinity
完成,但更可能使用TopologySpreadConstraints完成,您可能会使用topologyKey: topology.kubernetes.io/zone
,但这取决于您节点的标签有。