K8S redis 部署

在Kubernetes 1.26.14中部署Redis单实例/集群的步骤如下(结合NFS持久化存储与认证配置):


一、部署Redis单实例(StatefulSet模式)

1. 创建配置文件 redis-statefulset.yaml
yaml 复制代码
# ConfigMap存储Redis配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  redis.conf: |
    bind 0.0.0.0
    port 6379
    requirepass your_secure_password  # 替换为实际密码
    appendonly yes
    dir /data

---
# 密码Secret
apiVersion: v1
kind: Secret
metadata:
  name: redis-secret
type: Opaque
data:
  password: eW91cl9zZWN1cmVfcGFzc3dvcmQ=  # base64编码密码

---
# StatefulSet定义
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis-headless
  replicas: 1  # 单实例
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:7.0.12
        command: ["redis-server", "/etc/redis/redis.conf"]
        ports:
        - containerPort: 6379
        volumeMounts:
        - name: config
          mountPath: /etc/redis
        - name: data
          mountPath: /data
        env:
        - name: REDIS_PASSWORD  # 从Secret注入密码
          valueFrom:
            secretKeyRef:
              name: redis-secret
              key: password
      volumes:
      - name: config
        configMap:
          name: redis-config
  volumeClaimTemplates:  # 动态PVC
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "nfs-redis"  # 需提前创建NFS StorageClass
      resources:
        requests:
          storage: 5Gi

---
# Headless Service(内部DNS)
apiVersion: v1
kind: Service
metadata:
  name: redis-headless
spec:
  clusterIP: None
  selector:
    app: redis
  ports:
  - port: 6379
    name: redis

---
# NodePort Service(外部访问)
apiVersion: v1
kind: Service
metadata:
  name: redis-external
spec:
  type: NodePort
  selector:
    app: redis
  ports:
  - port: 6379
    targetPort: 6379
    nodePort: 31000  # 自定义端口范围30000-32767
2. 部署资源
bash 复制代码
kubectl apply -f redis-statefulset.yaml

二、部署Redis集群(6节点3主3从)

1. 调整StatefulSet配置
yaml 复制代码
# 修改StatefulSet部分
spec:
  replicas: 6  # 6节点
  template:
    spec:
      containers:
      - env:
        - name: REDIS_CLUSTER_ENABLED  # 启用集群模式
          value: "yes"
# 其他部分与单实例相同
2. 初始化集群
bash 复制代码
# 进入任意Redis Pod执行集群初始化
kubectl exec -it redis-0 -- redis-cli -a your_password \
  --cluster create \
  $(kubectl get pods -l app=redis -o jsonpath='{range.items[*]}{.status.podIP}:6379 ') \
  --cluster-replicas 1

三、关键配置说明

  1. 持久化存储

    • 使用NFS动态供给(需提前部署StorageClass)
    • volumeClaimTemplates自动创建PVC,数据目录/data持久化
  2. 安全认证

    • 通过Secret管理密码,避免明文暴露
    • requirepass配置强制认证访问
  3. 服务暴露

    • Headless Service提供内部DNS解析(redis-0.redis-headless)
    • NodePort Service允许外部通过节点IP:31000访问
  4. 集群模式扩展

    • 6节点部署时需手动初始化集群(redis-cli --cluster create)
    • 生产环境建议使用哨兵模式(Sentinel)实现高可用

四、验证部署

bash 复制代码
# 检查资源状态
kubectl get statefulset,pvc,svc -l app=redis

# 测试单实例连接
kubectl exec -it redis-0 -- redis-cli -a your_password ping

# 查看集群状态(集群模式)
kubectl exec -it redis-0 -- redis-cli -a your_password cluster nodes
相关推荐
imDwAaY13 小时前
操作系统如何管理程序运行?从线程、进程到内存隔离与用户态切换:CS162 Note2
android·java·redis
码途行者14 小时前
处理超时未支付订单:两套轻量化方案,附 PHP 极简实现
开发语言·redis·php
ggaofeng15 小时前
k8s中的dns
云原生·容器·kubernetes
草莓熊Lotso18 小时前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
我不会起名字3221 天前
K8s Ingress 返回 502 但后端日志正常:4 类上游断连与排查链
kubernetes·k8s·ingress·502·keepalive
我不会起名字3221 天前
Redis 突然只能读不能写:MISCONF 报错的 3 类触发条件与 4 步恢复
运维·redis·持久化·排查·misconf
我不会起名字3221 天前
Redis 从 0 到 1(九):主库宕机 30 秒自动切主——1 主 2 从 3 哨兵 + Go 客户端
redis·docker·sentinel·高可用·哨兵
我不会起名字3221 天前
Pod 一直 Pending:调度器 5 类失败原因与 kubectl describe 的正确读法
云原生·kubernetes·调度·排查
我不会起名字3221 天前
K8s 服务 DNS 解析偶发 5 秒超时:conntrack 与 ndots 的 3 个坑
kubernetes·k8s·dns·conntrack·coredns
毕业设计7031 天前
(免费领源码)SSM董家湾线上点餐系统04682- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·redis·mysql·tomcat·maven·mybatis·ssm