如何实现redis-sentinel Pod在Kubernetes不同节点上分散部署?
问题根因
当前配置使用的是preferredDuringSchedulingIgnoredDuringExecution软反亲和规则,且权重仅为1,这类规则仅作为调度器的参考偏好,不做强制约束。当节点剩余资源满足Pod运行要求时,调度器会综合资源余量、镜像缓存等其他打分项做决策,完全可能将多个同标签Pod调度到同一节点,这就是3个Pod堆积在单节点的直接原因。
调整方案
你的集群有10个节点,远大于4个副本的规模,直接将软反亲和替换为强制硬反亲和规则即可保证每个Redis Pod分散到不同节点,不需要修改Chart模板,直接在你的自定义Helm Chart的values.yaml中给Bitnami Redis依赖传入如下覆盖配置即可:
# 以下配置项对应Bitnami Redis 15.7.0版本的参数,key名与你声明依赖时的alias保持一致,默认alias为redis redis: replicaCount: 4 # 保持原有副本数配置 sentinel: enabled: true # 保持原有sentinel启用配置 # 替换原有亲和性配置为强制Pod反亲和 affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app.kubernetes.io/component: node app.kubernetes.io/instance: myapp app.kubernetes.io/name: redis namespaces: - test topologyKey: kubernetes.io/hostname
操作注意事项
- 配置修改后执行
helm upgrade生效即可。由于Redis节点是StatefulSet部署,为避免升级时自动滚动重启触发主从切换影响业务,可追加--strategy=OnDelete参数,升级后手动逐个删除旧Pod,等待新Pod调度到独立节点、集群状态同步完成后再删除下一个旧Pod。 - 若你担心后续集群节点故障、可用节点数不足时硬反亲和会导致Pod一直处于Pending状态,也可以保留软反亲和模式,但需要将权重调整到最大值100,不过该模式仅能尽可能提升分散调度的概率,无法100%保证Pod不落在同一节点,对数据可靠性要求高的场景优先使用硬反亲和。
- 反亲和是Pod级别的调度规则,你当前每个Pod内同时运行Redis、Sentinel两个容器属于同Pod内容器,不会被反亲和规则拦截,不需要额外调整容器相关配置。
内容的提问来源于stack exchange,提问作者Martín C.
相关产品推荐
相关产品推荐

