k8s中应用容器随redis集群自动重启

背景:

业务系统需要使用redis集群做缓存,但是redis集群不稳定会出现宕机问题,宕机后redis自动重启,但是业务系统不能自动重连redis。

改进方案:

当redis集群故障服务不能使用时,业务系统也要随redis一起重启。在业务系统的容器中添加redis服务探查程序。更好的方式是业务系统支持redis的服务的自动重连

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: business-app-with-monitor
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: business-app
    spec:
      initContainers:
      - name: redis-preflight-check
        image: busybox:1.35
        command: 
        - /bin/sh
        - -c
        - |
          # 简化的启动前检查
          echo "执行 Redis 集群启动前检查..."
          for i in 0 1 2; do
            if ! nc -z -w 5 redis-$i.redis-headless 6379; then
              echo "❌ redis-$i 不可用"
              exit 1
            fi
            echo "✅ redis-$i 连接成功"
          done
          echo "所有 Redis 节点就绪"
      
      containers:
      # 主业务容器
      - name: business-app
        image: your-business-app:latest
        ports:
        - containerPort: 8080
        env:
        - name: REDIS_CLUSTER_NODES
          value: "redis-0.redis-headless:6379,redis-1.redis-headless:6379,redis-2.redis-headless:6379"
        livenessProbe:
          exec:
            command:
            - /bin/sh
            - -c
            - |
              # 检查应用是否健康,同时检查 Redis 连接
              if ! curl -f http://localhost:8080/health; then
                exit 1
              fi
              
              # 检查 Redis 集群状态
              if ! echo "CLUSTER INFO" | nc -w 3 redis-0.redis-headless 6379 | grep -q "cluster_state:ok"; then
                echo "Redis 集群异常,触发重启"
                exit 1
              fi
          initialDelaySeconds: 30
          periodSeconds: 15
          timeoutSeconds: 10
          failureThreshold: 2
      
      # Redis 监控 Sidecar
      - name: redis-monitor
        image: busybox:1.35
        command:
        - /bin/sh
        - -c
        - |
          echo "启动 Redis 集群监控..."
          
          while true; do
            echo "$(date): 检查 Redis 集群状态..."
            
            # 检查集群健康状态
            cluster_healthy=false
            for node in redis-0.redis-headless:6379 redis-1.redis-headless:6379 redis-2.redis-headless:6379; do
              host=${node%:*}
              port=${node#*:}
              
              if echo "CLUSTER INFO" | nc -w 5 $host $port 2>/dev/null | grep -q "cluster_state:ok"; then
                cluster_healthy=true
                break
              fi
            done
            
            if [ "$cluster_healthy" = "false" ]; then
              echo "❌ $(date): Redis 集群状态异常,触发业务容器重启"
              # 向业务容器发送 SIGTERM 信号,触发重启
              kill -TERM 1
              sleep 10
            else
              echo "✅ $(date): Redis 集群状态正常"
            fi
            
            sleep 30
          done
        resources:
          requests:
            memory: "32Mi"
            cpu: "10m"
相关推荐
某林2127 小时前
Isaac Sim 5.1.0 无头服务器部署与 RTX 显存段错误排障全记录
运维·服务器·docker·容器·isaac
m0_738120727 小时前
Docker 环境下 Vulfocus 靶场搭建全流程(附镜像源问题解决方案)
运维·服务器·网络·安全·docker·容器
JAVA面经实录9177 小时前
Redis 知识体系(完整版)
java·redis·nosql数据库·nosql
Plastic garden8 小时前
K8s知识(3) Pod亲和性,调度
云原生·容器·kubernetes
ManageEngine卓豪8 小时前
数据库可观测性:MySQL与Redis监控核心监控指标与全栈运维解决方案
数据库·redis·mysql·数据库性能·数据库监控
真实的菜9 小时前
Redis 从入门到精通(十四):Redis 7.x 新特性全解 —— 系列收官之作
数据库·redis·缓存
木雷坞9 小时前
Playwright MCP Docker 部署:mcr 镜像、浏览器工具和权限配置
运维·docker·容器·mcp
暮云星影9 小时前
个人总结 docker搭建私人照片云相册Immich
docker·容器·arm
张忠琳9 小时前
【client-go v0.36.1】(store Part 1)Store 超深度分析 — 模块定位、接口层次、类结构、KeyFunc体系、构造初始化
云原生·kubernetes·informer·store·client-go