在kubernetes集群中,在一个节点上调度几个statefulset-pods,在另一个节点中调度其余的



我有一个由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,但这取决于节点的标签。

最新更新