技术文章大纲:Kubernetes部署Redis实战指南

引言

简要介绍Redis的核心特性(高性能键值存储、缓存、消息队列等)及其在云原生场景中的重要性。
说明Kubernetes部署Redis的优势:弹性扩缩容、高可用性、自动化运维等。

环境准备
  • Kubernetes集群要求:版本兼容性(如v1.19+)、节点资源(CPU/内存)。
  • 工具依赖:kubectlhelm(可选)、Redis客户端测试工具。
部署方案选择
  • 方案1:直接通过Deployment+Service部署
    适用场景:快速测试或单节点Redis实例。
  • 方案2:使用StatefulSet部署有状态Redis
    适用场景:生产环境需持久化数据、支持Pod有序启停。
  • 方案3:Helm Chart部署Redis集群
    适用场景:快速部署高可用集群(如bitnami/redis社区Chart)。
详细部署步骤(以StatefulSet为例)

1. 创建持久化存储
示例PVC配置:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redis-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

2. 编写StatefulSet配置
关键字段:

  • serviceName:定义Headless Service用于Pod DNS解析。
  • volumeClaimTemplates:动态绑定PVC以实现数据持久化。

3. 配置Redis安全性

  • 通过ConfigMap注入redis.conf(如启用密码认证):
    requirepass your_strong_password
    

4. 部署Headless Service
用于内部通信和集群发现,示例:

apiVersion: v1
kind: Service
metadata:
  name: redis-headless
spec:
  clusterIP: None
  ports:
  - port: 6379
  selector:
    app: redis
高可用与集群配置
  • 主从复制:通过redis.conf配置replicaof指令。
  • Redis Cluster模式:使用多个StatefulSet分片,配置cluster-enabled yes
监控与运维
  • 集成Prometheus:通过Redis Exporter暴露指标。
  • 日志收集:配置Fluentd或Filebeat采集Redis容器日志。
常见问题排查
  • 数据持久化失败:检查PVC绑定状态及存储类配置。
  • 网络连通性问题:验证Service DNS解析及网络策略。
性能优化建议
  • 资源限制:为容器设置合理的requests/limits(如4核CPU、8GB内存)。
  • 内核参数调优:调整vm.overcommit_memory避免OOM。
########################################
# 1️⃣ Secret(Redis 密码)
########################################
apiVersion: v1
kind: Secret
metadata:
  name: redis-secret
type: Opaque
stringData:
  REDIS_PASSWORD: StrongPassw0rd!

---
########################################
# 2️⃣ ConfigMap(生产级 Redis 配置)
########################################
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  redis.conf: |
    bind 0.0.0.0
    port 6379
    protected-mode yes

    # 认证
    requirepass ${REDIS_PASSWORD}

    # 数据目录
    dir /data

    ############################
    # 持久化(生产推荐)
    ############################
    appendonly yes
    appendfsync everysec
    no-appendfsync-on-rewrite yes

    save 900 1
    save 300 10
    save 60 10000

    ############################
    # 内存 & 淘汰策略
    ############################
    maxmemory 1gb
    maxmemory-policy allkeys-lru

    ############################
    # 稳定性
    ############################
    timeout 0
    tcp-keepalive 300

    ############################
    # 安全
    ############################
    rename-command FLUSHALL ""
    rename-command FLUSHDB ""
    rename-command KEYS ""

---
########################################
# 3️⃣ Headless Service(StatefulSet 必需)
########################################
apiVersion: v1
kind: Service
metadata:
  name: redis-headless
spec:
  clusterIP: None
  selector:
    app: redis
  ports:
    - port: 6379
      name: redis

---
########################################
# 4️⃣ 对外 Service(如不需要外网可删)
########################################
apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  type: NodePort
  selector:
    app: redis
  ports:
    - port: 6379
      targetPort: 6379
      nodePort: 30637

---
########################################
# 5️⃣ 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:
      terminationGracePeriodSeconds: 30

      containers:
        - name: redis
          image: sealos.hub:5000/repo/redis:7.2
          imagePullPolicy: IfNotPresent

          command:
            - sh
            - -c
            - |
              exec redis-server /etc/redis/redis.conf \
                --requirepass "$REDIS_PASSWORD"

          env:
            - name: REDIS_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: redis-secret
                  key: REDIS_PASSWORD

          ports:
            - containerPort: 6379

          resources:
            requests:
              cpu: "100m"
              memory: "512Mi"
            limits:
              cpu: "1"
              memory: "2Gi"

          volumeMounts:
            - name: redis-data
              mountPath: /data
            - name: redis-config
              mountPath: /etc/redis

          readinessProbe:
            exec:
              command:
                - sh
                - -c
                - |
                  redis-cli -a "$REDIS_PASSWORD" ping | grep -q PONG
            initialDelaySeconds: 10
            periodSeconds: 10

          livenessProbe:
            exec:
              command:
                - sh
                - -c
                - |
                  redis-cli -a "$REDIS_PASSWORD" ping | grep -q PONG
            initialDelaySeconds: 30
            periodSeconds: 20

      volumes:
        - name: redis-config
          configMap:
            name: redis-config

  ########################################
  # 6️⃣ PVC 模板(每个 Pod 一个盘)
  ########################################
  volumeClaimTemplates:
    - metadata:
        name: redis-data
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: local-path   # ❗ 非 NFS(改成你的本地/云盘)
        resources:
          requests:
            storage: 10Gi

这个是官方的部署方式、我没有云盘就只能使用nfs
官方不推荐

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      securityContext:
        fsGroup: 999
      containers:
        - name: redis
          image: sealos.hub:5000/repo/redis:7.2
          command: ["redis-server"]
          args:
            - "/etc/redis/redis.conf"
          ports:
            - containerPort: 6379
          resources:
            requests:
              cpu: "100m"
              memory: "512Mi"
            limits:
              cpu: "1"
              memory: "2Gi"
          volumeMounts:
            - name: redis-data
              mountPath: /data
            - name: redis-config
              mountPath: /etc/redis/redis.conf
              subPath: redis.conf
      volumes:
        - name: redis-config
          configMap:
            name: redis-config

  volumeClaimTemplates:
    - metadata:
        name: redis-data
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: nfs     # ✅ 用你真实存在的
        resources:
          requests:
            storage: 10Gi

一下是redis-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  redis.conf: |
    bind 0.0.0.0
    port 6379
    protected-mode yes

    requirepass StrongPassw0rd!

    appendonly yes
    appendfsync everysec

    dir /data

    maxmemory 1500mb
    maxmemory-policy allkeys-lru

    save 900 1
    save 300 10
    save 60 10000

kubectl apply -f redis-statefulset.yaml
kubectl apply -f redis-config.yaml

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐