Redis 在 Kubernetes 上怎么编排部署,云原生实战一步步带你搞定
- 问答
- 2026-01-25 19:42:30
- 15
根据Kubernetes官方文档和常见的云原生实践,在K8s上编排部署Redis,核心在于处理好有状态应用的数据持久化和稳定网络标识,下面是一步步的实战操作思路和关键点。
第一步:选择正确的工作负载控制器 你不能用Deployment来部署Redis主节点,因为它适合无状态应用,对于Redis这种需要稳定身份和持久化存储的,必须使用StatefulSet,StatefulSet会给每个Pod一个固定的、按顺序的编号(比如redis-0,redis-1),并且这个编号在Pod重启甚至重新调度时都不会变,这就为每个Pod绑定独有的数据提供了基础,这是来自Kubernetes核心概念文档的明确指导。
第二步:准备存储——申请一块“不会消失的磁盘” 在K8s里,Pod自己写的文件默认是临时的,Pod一删,数据就没了,所以你需要为Redis申请持久化存储,这通常通过PersistentVolumeClaim(PVC,持久卷声明)来实现,在你的StatefulSet配置文件中,你需要为每个Pod模板声明一个PVC,这样,当K8s创建redis-0这个Pod时,就会自动绑定一块持久化卷(PV)给这个PVC,这块“磁盘”的生命周期就和Pod解耦了,数据会一直保留,根据云厂商的实践,你可以使用本地SSD、云硬盘等作为后端存储。
第三步:编写StatefulSet的配置文件核心部分 下面是一个简化但关键的部分,展示了配置文件的核心,你通常需要写一个YAML文件。

-
定义Headless Service:这是一个特殊的Service,它没有集群IP,主要用于DNS发现,它会为每个StatefulSet的Pod创建一条DNS记录,格式是
<pod-name>.<service-name>.<namespace>.svc.cluster.local,这样,Redis集群内部就可以通过redis-0.redis-service.default.svc.cluster.local这样的固定域名互相访问了。apiVersion: v1 kind: Service metadata: name: redis-service spec: clusterIP: None # 这就是Headless Service selector: app: redis ports: - port: 6379 -
定义StatefulSet:

apiVersion: apps/v1 kind: StatefulSet metadata: name: redis spec: serviceName: "redis-service" # 必须指向上面的Headless Service replicas: 1 # 单节点示例,生产环境主从需要更多 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:7-alpine ports: - containerPort: 6379 command: ["redis-server"] args: ["--appendonly yes"] # 启用AOF持久化 volumeMounts: - name: redis-data mountPath: /data # Redis数据目录 volumeClaimTemplates: # 关键!存储卷申请模板 - metadata: name: redis-data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi这个
volumeClaimTemplates是StatefulSet的精华,它不是一个现成的PVC,而是一个模板,StatefulSet控制器在创建每个Pod(redis-0,redis-1...)时,都会根据这个模板为每个Pod创建一个独立的PVC和PV,这样,redis-0永远挂载自己那块数据盘,不会混。
第四步:部署与访问
用kubectl apply -f命令部署上面两个YAML文件,之后,你可以在集群内部通过redis-service:6379访问这个Redis,如果你要从集群外部访问,需要再创建一个NodePort或LoadBalancer类型的Service,专门暴露这个StatefulSet。
第五步:日常操作与注意事项
- 扩缩容:你可以用
kubectl scale statefulset redis --replicas=3来扩容,StatefulSet会顺序地创建新的Pod(redis-1,redis-2),每个Pod都会自动创建自己的PVC和挂载存储,缩容时,Pod会被顺序终止,但PVC和PV默认会被保留,以防误删数据,这是StatefulSet的安全策略。 - 数据备份:你不能只备份Pod,你需要备份每个Pod对应的PersistentVolume里的数据,通常做法是使用一个临时的Pod,挂载上需要备份的PVC,把数据拷贝到某个对象存储(如S3)中。
- 高可用方案:上面部署的是单节点,对于生产环境,你需要部署Redis哨兵(Sentinel)模式或者集群(Cluster)模式,这会复杂很多,需要多个StatefulSet(分别用于Redis主从实例和哨兵实例),并通过配置文件和启动命令让它们彼此发现、组成集群,社区有Helm Chart(如bitnami/redis)可以帮助你一键部署高可用架构,但理解其背后的原理至关重要。
总结一下:在Kubernetes上部署Redis,抓住“StatefulSet + Headless Service + volumeClaimTemplates”这个铁三角,你就解决了身份、网络和存储这三个有状态应用的核心问题,剩下的高可用和备份恢复,都是在这个坚实基础上搭建的。
本文由寇乐童于2026-01-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://isnl.haoid.cn/wenda/85899.html