You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精细化指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:30:54