我有一个由3个工作节点组成的kubernetes集群,我需要在其中部署一个具有6个副本的statefulset
应用程序。我的要求是确保在任何情况下,每个节点都应该从6个副本中获得2个pod。基本上,
node1 - 2 pods of app
node2 - 2 pods of app
node3 - 2 pods of app
========================
Total 6 pods of app
任何帮助都将不胜感激!
您应该使用Pod Anti-Afinity来确保Pod扩散到不同的节点。
由于节点上有多个pod,请使用preferredDuringSchedulingIgnoredDuringExecution
例如,当应用程序具有标签app: mydb
时(使用适合您的情况(:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- mydb
topologyKey: "kubernetes.io/hostname"
每个节点应该从6个副本中获得正好2个pod
尽量不要认为pod被固定到某个节点。Kubernetes工作负载的理念是工作负载独立于底层基础设施(如节点(。我想,你真正想要的是分散pod以提高可用性——例如,如果一个节点出现故障,你的系统应该仍然可用。
如果你在云提供商处运行,你可能应该设计反亲和性,以便将pod调度到不同的可用性区域,而不仅仅是不同的节点,但这要求你的集群部署在一个区域(由多个可用性区域组成(中。
将吊舱分布在可用性区域中
均匀分布后,所有3个节点(分散在三个区域(都将有2个pod。没关系。硬性要求是,如果1个节点(比如节点1(宕机,那么它就是2个pod,不需要在其他节点上再次重新调度。当节点1被恢复时,这2个pod现在将被安排回到它上。所以,我们可以说,所有3对pod都有不同的节点/区域亲和力。对此有什么想法吗?
这可以用PodAffinity
来完成,但更可能使用TopologySpreadConstraints来完成,您可能会使用topologyKey: topology.kubernetes.io/zone
,但这取决于节点的标签。