资讯动态

kubeasz 中 Redis 高可用部署指南:基于 redis-ha Helm Chart 的主从哨兵与 HAProxy 架构

发布时间:2026/9/15 17:23:09 来源:尧图企业网站定制
kubeasz 中 Redis 高可用部署指南基于 redis-ha Helm Chart 的主从哨兵与 HAProxy 架构【免费下载链接】kubeasz使用Ansible脚本安装K8S集群介绍组件交互原理方便直接不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeaszkubeasz 仓库在 manifests/deprecated/redis-cluster 目录下内置了一套经过裁剪的 Redis 高可用 Helm Chartredis-ha版本 4.4.4用于在 Kubernetes 集群中一键部署由 Redis 主从复制、Sentinel 哨兵与可选 HAProxy 负载均衡组成的生产级高可用架构。本文以该 Chart 的官方 README 为核心骨架结合仓库内的模板源码与实战配置values.yaml、redis-ha-statefulset.yaml 等完整讲解安装、配置、故障转移原理、鉴权、持久化、监控与排障方法帮助读者在 kubeasz 部署的集群上直接落地一套可复制、可运行、可持续观测的 Redis HA 方案。适用前提该 Chart 位于仓库manifests/deprecated目录属于**已弃用Deprecated**组件——它源自 Helm 官方 Chart 库的stable/redis-ha因 Helm 官方仓库退役而被标记弃用。功能完整可用适合在私有集群中作为参考模板或离线资源使用生产选型时可优先考虑仍在活跃维护的同类方案。架构总览一个 StatefulSet 承载 Redis Sentinel默认安装replicas: 3会创建 3 个 Pod每个 Pod 内同时运行两个主容器redis 容器监听6379三个副本中一个为 master、两个为 slavesentinel 容器监听26379每个 Pod 都运行哨兵共同对mymaster主从组进行监控与自动故障转移可选redis-exporter 边车容器暴露 Prometheus 指标默认端口9121。这一每 Pod 内 redis 与 sentinel 同生共死的设计是 redis-ha-statefulset.yaml 的核心思想StatefulSet 保证 Pod 有稳定网络标识release-server-0/1/2与稳定存储Sentinel 就近监控本 Pod 的 Redis 实例哨兵集群天然与 Redis 副本集群共置避免单点。集群对外暴露两层服务Service 类型名称作用Headless Servicerelease-server如redis-ha-server无头服务clusterIP: None供 StatefulSet 网络标识与哨兵get-master-addr-by-name查询使用见 redis-ha-service.yamlAnnounce Servicerelease-announce-0/1/2每个副本一个 ClusterIP 服务用publishNotReadyAddresses: true在 Pod 未就绪时也发布地址用于向集群内外通告各副本的稳定 IP见 redis-ha-announce-service.yaml其中 Announce Service 的 selector 使用statefulset.kubernetes.io/pod-name: release-server-i见 redis-ha-announce-service.yaml精确绑定单个 PodpublishNotReadyAddresses: true保证在 Pod 未 Ready 时也能解析到地址——这是整个高可用方案的关键哨兵需要知道每个副本的真实 IPHAProxy 也需要在初始化阶段逐个解析这些地址。快速开始安装、验证与卸载前置条件Kubernetes 1.8启用 Beta API该 Chart 较老新版集群通常向下兼容底层基础设施具备 PV 供给能力PersistentVolumeprovisioner或改用 hostPath / emptyDir 存储已安装 HelmChart 采用engine: gotpl旧式模板语法。安装# 方式一直接安装默认配置3 副本PV 存储 $ helm install stable/redis-ha # 方式二用 --set 覆盖单个参数 $ helm install \ --set imageredis \ --set tag5.0.5-alpine \ stable/redis-ha # 方式三使用自定义 values 文件 $ helm install -f values.yaml stable/redis-hakubeasz 仓库还提供了开箱即用的部署脚本 start.sh将 Chart 安装到独立的dependency命名空间#!/bin/sh helm install redis \ --create-namespace \ --namespace dependency \ -f ./values.yaml \ ./redis-ha配套的部署 valuesmanifests/deprecated/redis-cluster/values.yaml给出了一份贴近实战的配置replicas: 2、sentinel.quorum: 1、redis.maxmemory: 4g、maxmemory-policy: allkeys-lru、关闭 PV 改用 hostPath/data/mcs-redis/release存储。清单验证$ helm list # 列出所有 release $ helm test release # 运行 Chart 内置 smoke test内置测试用例test-redis-ha-pod.yaml会启动一个一次性 Pod执行redis-cli -h release-server -p 6379 info server验证无头服务名可解析且 Redis 可访问。卸载$ helm delete chart-name该命令会移除与 Chart 关联的全部 Kubernetes 组件并删除 release。核心配置参数全解以下是 Chart README 中的完整参数表并补充了仓库内 values.yaml 的实际默认值与字段含义Redis 与 Sentinel 基础参数ParameterDescriptionDefaultimage/tagRedis 镜像仓库与标签redis/5.0.6-alpineimagePullSecrets拉取 Redis 镜像使用的 Secret 引用[]replicasRedis master/slave 副本总数3serviceAccount.create是否创建 ServiceAccounttrueserviceAccount.nameServiceAccount 名称由redis-ha.fullname模板生成rbac.create是否创建 RBAC 资源trueredis.portRedis 服务端口6379redis.masterGroupName主从组名称须匹配^[\w\-\.]$可模板化mymasterredis.config追加到每个 redis 实例的配置项键值对见 values.yamlredis.customConfig完全自定义 redis.conf设置后redis.config被忽略redis.resourcesRedis 容器 CPU/内存 requests/limits{}sentinel.portSentinel 端口26379sentinel.quorum维持法定人数所需的最少哨兵数2sentinel.config追加到每个哨兵的配置项见 values.yamlsentinel.customConfig完全自定义 sentinel.conf设置后sentinel.config被忽略sentinel.resourcesSentinel 容器资源限制{}init.resourcesinit 容器资源限制{}鉴权AUTH参数ParameterDescriptionDefaultauth启用 Redis AUTH需要同时设置redisPasswordfalseredisPassword密码写入requirepass与masterauthauthKey已有 Secret 中存放密码的 keyauthexistingSecret复用已有 Secret含authKey键不可与redisPassword同时使用启用后模板会同时生成三类鉴权机制从 redis-auth-secret.yaml 可见默认生成 Opaque Secretbase64 编码密码_configs.tpl 在 redis.conf 写入requirepass与masterauth、在 sentinel.conf 写入sentinel auth-passinit 脚本与各容器通过secretKeyRef注入AUTH环境变量见 redis-ha-statefulset.yaml。调度与亲和性参数ParameterDescriptionDefaultnodeSelectorPod 调度的节点标签{}tolerationsPod 容忍的污点[]hardAntiAffinity是否强制 Redis Pod 分布在不同节点trueadditionalAffinities追加到 Redis Pod 的额外亲和性规则{}affinity用字符串完全覆盖全部亲和性设置securityContextRedis Pod 的安全上下文{runAsUser: 1000, fsGroup: 1000, runAsNonRoot: true}priorityClassNameRedis StatefulSet 的优先级类未设置schedulerName自定义调度器名称nil从 redis-ha-statefulset.yaml 可以看到当affinity为空时默认注入两条规则hardAntiAffinity: true时使用requiredDuringSchedulingIgnoredDuringExecution强制每个 Pod 落在不同kubernetes.io/hostname节点上始终追加一条preferredDuringSchedulingIgnoredDuringExecution软规则按failure-domain.beta.kubernetes.io/zone拓扑尽量分散到不同可用区。存储参数ParameterDescriptionDefaultpersistentVolume.size数据卷大小10GipersistentVolume.annotations卷注解{}persistentVolume.reclaimPolicy卷回收策略Delete或RetainpersistentVolume.storageClass存储类-表示禁用动态供给未设置使用默认 provisioneremptyDiremptyDir 配置PV 关闭且无 hostPath 时使用{}hostPath.path宿主数据目录路径可模板化未设置hostPath.chown是否以 root 运行 init 容器修正 hostPath 属主true存储选择逻辑在 redis-ha-statefulset.yaml 中体现为三选一persistentVolume.enabled: true通过volumeClaimTemplates动态创建 PV每副本独立 PVC且写入storageClassName-时置空字符串禁用动态供给否则若设置hostPath.path使用宿主目录挂载data卷并可选hostpath-chowninit 容器root 权限执行chown runAsUser /data修正属主否则使用emptyDir。注意hostPath 会直接复用宿主目录可能覆盖宿主上已有的同名目录使用前务必确认路径安全。指标导出与 Prometheus 集成参数ParameterDescriptionDefaultexporter.enabled启用 redis-exporter 边车falseexporter.image/exporter.tagExporter 镜像oliver006/redis_exporter/v1.3.2README 表为v0.31.0以仓库 values.yaml 为准exporter.portExporter 端口9121exporter.annotationsPrometheus scrape 注解{prometheus.io/path: /metrics, prometheus.io/port: 9121, prometheus.io/scrape: true}exporter.extraArgsExporter 附加参数{}exporter.script自定义 Lua 采集脚本生成 ConfigMap注入REDIS_EXPORTER_SCRIPT环境变量未设置exporter.serviceMonitor.enabled是否创建 Prometheus Operator ServiceMonitorfalseexporter.serviceMonitor.namespace / interval / telemetryPath / labels / timeoutServiceMonitor 的命名空间、采集间隔、指标路径、标签与超时default/nil//metrics/{}/nil从 redis-ha-statefulset.yaml 可见启用 exporter 后每个 Pod 会额外注入redis-exporter边车通过REDIS_ADDRredis://localhost:6379连接本 Pod 的 RedisREDIS_PASSWORD从 Secret 注入启用 auth 时并配置 livenessProbeHTTP GET/metrics:9121。边车模板还包括完整的 ServiceMonitor 渲染逻辑redis-ha-servicemonitor.yaml可直接对接 Prometheus Operator。Pod 中断预算PDBpodDisruptionBudget: maxUnavailable: 1 # minAvailable: 1配置后redis-ha-pdb.yaml 会创建PodDisruptionBudget保证节点维护等自愿中断场景下集群始终可用。自定义 Redis 与 Sentinel 配置Chart 支持把绝大多数 redis / sentinel 配置项以键值对形式传入values.yaml的redis.config与sentinel.config段落。以repl-timeout 60为例redis: config: repl-timeout: 60Sentinel 配置必须符合sentinel option master-group-name value语义因此配置键只写选项名主从组名与取值由模板自动补全。例如sentinel down-after-milliseconds 30000写作sentinel: config: down-after-milliseconds: 30000模板渲染逻辑位于 _configs.tpl除maxclients外所有sentinel.config键值都会渲染为sentinel key masterGroupName value行maxclients作为特例按普通配置输出。版本差异注意部分配置项在不同 Redis 版本中命名不同需按实际镜像版本选择# Redis 5.x min-replicas-to-write: 1 min-replicas-max-lag: 5 # Redis 4.x / 3.x min-slaves-to-write 1 min-slaves-max-lag 5仓库 redis-ha/values.yaml 默认配置了以下推荐项含中文注释便于理解redis: config: min-replicas-to-write: 1 # 至少 1 个从节点在线才允许主节点写入 min-replicas-max-lag: 5 # 从节点最大复制延迟秒 maxmemory: 0 # 单实例最大内存0 表示不限制 maxmemory-policy: volatile-lru # 内存淘汰策略 save: 900 1 # 触发 RDB 快照的条件 repl-diskless-sync: yes # 启用无盘复制RDB 直接经网络发给从节点 rdbcompression: yes rdbchecksum: yes sentinel: config: down-after-milliseconds: 10000 # 哨兵判定主节点主观下线的时间毫秒 failover-timeout: 180000 # 故障转移超时毫秒 parallel-syncs: 5 # 故障转移后同时同步新主节点的从节点数 maxclients: 10000完全自定义配置文件若需要更细粒度的控制可分别定义redis.customConfig与sentinel.customConfig此时对应段落的config键值对将被整体忽略redis-ha-configmap.yaml 中可见该优先级逻辑。例如自定义 sentinel.conf 时sentinel.config不再生效。故障转移原理init 脚本如何选举 MasterChart 的精华在于 init 容器执行的 config-init.sh 启动编排脚本。它挂在只读 ConfigMap 上每次 Pod 启动时执行核心流程如下解析身份从hostname提取 Pod 序号INDEXStatefulSet 序号并用getent hosts release-announce-INDEX解析本 Pod 的 Announce Service 地址为ANNOUNCE_IP询问哨兵redis-cli -h release-server -p 26379 sentinel get-master-addr-by-name mymaster查询当前主节点有主则跟随若哨兵返回可 PING 通的主节点执行sentinel_update与redis_update写入正确的主从关系若 PING 不通则触发sentinel failover强制故障转移失败NOGOODSLAVE时回退到默认初始化无主则选举INDEX0的 Pod 直接把自己设为主slaveof指向自身并清除该行其余 Pod 解析-announce-0地址作为默认主节点跟随注入哨兵身份每个哨兵通过SENTINEL_ID_INDEX环境变量由redis-ha.name release index做 SHA1 生成写入sentinel myid保证哨兵 ID 在 Pod 重启后保持稳定写入通告地址向 sentinel.conf 追加sentinel announce-ip、announce-port向 redis.conf 追加slave-announce-ip、slave-announce-port使集群内外的客户端都能正确连接注入密码若启用 AUTH将 Secret 中的密码经sed转义后替换配置文件里的replace-default-auth占位符。该脚本同时负责把 ConfigMap 中渲染好的redis.conf/sentinel.conf复制到/data/conf/下最终 redis 容器以redis-server /data/conf/redis.conf启动、sentinel 容器以redis-sentinel /data/conf/sentinel.conf启动见 redis-ha-statefulset.yaml。因为配置写入/data持久卷即使容器重启节点身份与主从角色也能保持。HAProxy对外统一的读写入口外部客户端直接连接哨兵或主节点并不方便——主从切换后连接目标会变化。Chart 可选启用 HAProxy 作为统一入口redis-haproxy-deployment.yaml自动代理到 Redis 主节点ParameterDescriptionDefaulthaproxy.enabled启用 HAProxyfalsehaproxy.replicasHAProxy 实例数3haproxy.image.repository/tagHAProxy 镜像haproxy/2.0.4README 表为2.0.1以仓库 values.yaml 为准haproxy.customConfig完全自定义config-haproxy.cfghaproxy.extraConfig向默认配置追加自定义段落haproxy.resourcesHAProxy 资源限制{}haproxy.service.type服务类型ClusterIP/LoadBalancer/NodePortClusterIPhaproxy.service.nodePortNodePort 端口需配合type: NodePort未设置haproxy.stickyBalancing基于源 IP 的粘性会话balance source 一致性哈希适合长连接场景如 Sentryfalsehaproxy.readOnly.enabled/port为 Redis 从节点开启只读专用端口false/6380haproxy.metrics.enabled/port/portName/scrapePath内嵌 Prometheus 指标端点false/9101/exporter-port//metricshaproxy.timeout.connect / server / client / checkhaproxy.cfg 超时设置4s/30s/30s/2shaproxy.hardAntiAffinityHAProxy Pod 是否强制分布不同节点truehaproxy.securityContextHAProxy 安全上下文{runAsUser: 1000, fsGroup: 1000, runAsNonRoot: true}haproxy.priorityClassNameHAProxy Deployment 优先级类未设置haproxy.init.resourcesHAProxy init 容器资源{}haproxy.metrics.serviceMonitor.*HAProxy 指标的 ServiceMonitor 配置默认关闭HAProxy 的健康检查与动态主节点识别由 _configs.tpl 生成的 haproxy.cfg 内置了一套精巧的 TCP 健康检查逻辑对每个副本定义backend check_if_redis_is_master_i通过tcp-check依次发送AUTH可选、PING、SENTINEL get-master-addr-by-name mymaster并与 init 阶段注入的REPLACE_ANNOUNCEi通告地址比对判断该副本是否被哨兵选为主主节点后端bk_redis_mastertcp-check发送info replication并期望返回role:master只有真正的主节点才进入可用池use-server指令进一步要求对应哨兵后端至少有 2 个哨兵认可避免脑裂期误路由启用haproxy.readOnly.enabled时生成bk_redis_slave后端期望role:slave通过6380只读端口分流读流量实现读写分离启用haproxy.metrics.enabled时新增frontend metrics利用 HAProxy 内嵌的prometheus-exporter服务输出指标替代了 4.x 之前独立的 exporter 边车。对外服务由 redis-haproxy-service.yaml 定义port: 6379指向 HAProxy 的 redis 端口可选追加只读端口与 metrics 端口。HAProxy 启动时序与风险HAProxy 的 init 容器config-haproxy_init.sh在启动前会逐个解析每个-announce-i服务的地址并把实际 IP 替换进 haproxy.cfg 的REPLACE_ANNOUNCEi占位符。若某个 announce-service 的 IP 在10 秒内每服务最多重试 10 次、每次间隔 1 秒未能解析init 容器将失败退出。此类失败通常发生在编排器尚未完成 Pod 提名时。由于 announce-service 使用了publishNotReadyAddresses: true风险有限——即使 init 失败HAProxy Pod 也会被编排器重新调度重试不会造成永久性故障。主机内核参数调优sysctlImageRedis 在部分场景需要调整宿主机内核参数重点是提高somaxconn值与关闭透明大页THP。Chart 提供特权 init 容器完成此操作sysctlImage: enabled: true mountHostSys: true command: - /bin/sh - -xc - |- sysctl -w net.core.somaxconn10000 echo never /host-sys/kernel/mm/transparent_hugepage/enabled相关参数registry/repository/tag/pullPolicy/mountHostSys/resources默认值见 redis-ha/values.yaml。模板中的init-sysctl容器以privileged: true、runAsUser: 0运行redis-ha-statefulset.yamlmountHostSys: true时将宿主/sys挂载到/host-sys使echo never ...能直接作用于宿主机 THP 开关。该 init 容器只在sysctlImage.enabled: true时注入。升级注意事项3.x 相对 2.x 的重大变更3.x 版本简化了 Redis 管理策略更好的故障转移与选举改而直接使用官方 redis 镜像不再需要特殊的 RBAC 或 ServiceAccount 角色。因此从2.0.1升级到3.0.0时旧版本创建的Role、RoleBinding、ServiceAccount资源需要手动删除。3.x 升级到 4.x4.x 起HAProxy 独立的 Prometheus exporter 边车被移除改为使用 HAProxy 内嵌的 metrics 端点。升级到 4.x 时需删除配置中的haproxy.exporter段并按需配置haproxy.metrics端口、端口名、采集路径等。常见问题与排障现象排查方向helm test失败redis-cli info server无响应确认 headless service 是否创建、Pod 是否 Ready检查 Redis 容器日志kubectl logs pod -c redis哨兵报告 master 频繁切换检查sentinel.config的down-after-milliseconds是否过小、网络抖动确认hardAntiAffinity部署下节点资源是否充足HAProxy init 容器反复失败检查各-announce-iService 的 Endpoints 是否发布确认 StatefulSet 的podManagementPolicy: OrderedReady下启动顺序符合预期启用 AUTH 后主从同步失败确认redisPassword与existingSecret未同时设置检查 Secret 中authKey键是否存在确认masterauth已注入数据未持久化检查persistentVolume.enabled若用 hostPath确认路径安全且hostPath.chown的 chown 已成功执行多副本分布在同一节点hardAntiAffinity: true依赖节点数 ≥ 副本数节点不足时强制反亲和将导致 Pod 无法调度结语kubeasz 仓库内置的redis-haChart 是一套结构清晰、可直接落地的 Redis 高可用方案StatefulSet 提供稳定身份与存储同 Pod 共置的 Sentinel 保证故障转移-announce-服务解决集群内外地址通告HAProxy 提供对客户端透明的统一读写入口与自动主节点感知。结合仓库中的 values.yaml 实战配置与 start.sh 一键安装脚本读者可以在 kubeasz 集群上快速复现这套架构若需深入定制可直接研读 templates 下的模板源码理解每个参数如何最终落成 Pod、Service 与配置文件。温馨提示该组件位于manifests/deprecated目录Redis 镜像默认5.0.6-alpineChart 版本 4.4.4用于私有环境或学习参考没有问题若追求长期维护建议关注仍在演进中的 Redis 高可用方案并注意将 AUTH 密码妥善保管在 Kubernetes Secret 中。【免费下载链接】kubeasz使用Ansible脚本安装K8S集群介绍组件交互原理方便直接不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价