如何精细化指定Redis集群primary/secondary Pod的node部署位置?
实现Redis集群的指定节点调度方案
完全可以通过Kubernetes的节点亲和性、Pod反亲和性配置来满足你的调度需求,下面是对应规则的具体实现方式和示例:
规则1:每个Primary Pod部署在独立Node上
先给3台物理Node分别打专属标签,执行以下命令:
kubectl label nodes node-1 redis-role=primary-node-1 kubectl label nodes node-2 redis-role=primary-node-2 kubectl label nodes node-3 redis-role=primary-node-3
然后给每个Primary Pod配置nodeSelector绑定到对应标签的Node,同时加上Pod反亲和性,确保不会有多个Primary Pod挤在同一Node上。
示例Primary Pod的StatefulSet片段(以primary-1为例):
apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-primary-1 spec: replicas: 1 selector: matchLabels: app: redis role: primary instance: primary-1 template: metadata: labels: app: redis role: primary instance: primary-1 spec: # 强制绑定到打了primary-node-1标签的Node nodeSelector: redis-role: primary-node-1 affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: role operator: In values: ["primary"] topologyKey: kubernetes.io/hostname
另外两个Primary Pod(primary-2、primary-3)只需要修改nodeSelector的标签值和instance标签即可。
规则2:Secondary Pod部署在独立Node,且不与对应Primary同Node
针对每个Secondary Pod,需要配置两项约束:一是不能和配对的Primary Pod在同一Node,二是所有Secondary Pod尽量(或强制)分布在不同Node上。
示例Secondary Pod(对应primary-1)的StatefulSet片段:
apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-secondary-1 spec: replicas: 1 selector: matchLabels: app: redis role: secondary instance: secondary-1 paired-primary: primary-1 template: metadata: labels: app: redis role: secondary instance: secondary-1 paired-primary: primary-1 spec: affinity: # 禁止与配对的primary-1 Pod在同一Node podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: instance operator: In values: ["primary-1"] topologyKey: kubernetes.io/hostname # 可选:强制所有Secondary Pod分散在不同Node上 podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: role operator: In values: ["secondary"] topologyKey: kubernetes.io/hostname
同理,secondary-2需要配置禁止和primary-2同Node,secondary-3禁止和primary-3同Node。
额外提示
- 用StatefulSet部署Redis集群更合适,因为它能保证Pod的稳定网络标识和持久化存储卷的绑定关系。
- 如果不需要精准绑定到特定Node,仅要求Primary分散、Secondary不跟对应Primary同Node,可以去掉
nodeSelector,只保留Pod反亲和性规则,K8s会自动调度符合条件的Node。
内容的提问来源于stack exchange,提问作者Ilja
相关产品推荐
相关产品推荐

