Запуск Redis/Valkey в Kubernetes: StatefulSet и Sentinel

Пошаговое руководство по запуску Redis/Valkey в Kubernetes: от простого StatefulSet до HA-кластера с Sentinel, включая ConfigMap, Service, мониторинг и проверку фейловера.
Опубликовано:

Разберём запуск Redis/Valkey в Kubernetes от простого к сложному: одиночный под, StatefulSet для репликации и HA-кластер через Sentinel.

Одиночный Redis

Самый простой способ — Deployment:

YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: valkey/valkey:8.0
        ports:
        - containerPort: 6379
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"
---
apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  selector:
    app: redis
  ports:
  - port: 6379
Нажмите, чтобы развернуть и увидеть больше

Недостаток: нет persistence. После перезапуска пода данные теряются.

StatefulSet с Persistence

Для производственной среды нужен StatefulSet с PVC:

YAML
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: valkey/valkey:8.0
        args: ["--save", "60", "1000", "--appendonly", "yes"]
        ports:
        - containerPort: 6379
        volumeMounts:
        - name: data
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi
Нажмите, чтобы развернуть и увидеть больше

Ключевые параметры:

Репликация: Master-Replica

Добавим реплику. Конфигурация через ConfigMap:

YAML
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  redis.conf: |
    save 60 1000
    appendonly yes
    replica-read-only yes
    replica-serve-stale-data yes
    min-replicas-to-write 1
    min-replicas-max-lag 10
  replica.conf: |
    replicaof redis-0.redis 6379
Нажмите, чтобы развернуть и увидеть больше

StatefulSet с двумя подами и initContainer для определения роли:

YAML
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 2
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      initContainers:
      - name: config
        image: busybox
        command:
        - sh
        - -c
        - |
          if [ "$(hostname)" = "redis-0" ]; then
            cp /mnt/redis.conf /data/redis.conf
          else
            cp /mnt/replica.conf /data/redis.conf
          fi
        volumeMounts:
        - name: config
          mountPath: /mnt
        - name: data
          mountPath: /data
      containers:
      - name: redis
        image: valkey/valkey:8.0
        command: ["redis-server", "/data/redis.conf"]
        ports:
        - containerPort: 6379
        volumeMounts:
        - name: data
          mountPath: /data
      volumes:
      - name: config
        configMap:
          name: redis-config
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi
Нажмите, чтобы развернуть и увидеть больше

Headless Service для прямого доступа к подам:

YAML
apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  clusterIP: None
  selector:
    app: redis
  ports:
  - port: 6379
Нажмите, чтобы развернуть и увидеть больше

Высокая доступность: Sentinel

Sentinel мониторит Redis-узлы и выполняет автоматический failover. Три инстанса для кворума.

YAML
apiVersion: v1
kind: ConfigMap
metadata:
  name: sentinel-config
data:
  sentinel.conf: |
    port 26379
    sentinel monitor mymaster redis-0.redis 6379 2
    sentinel down-after-milliseconds mymaster 5000
    sentinel failover-timeout mymaster 60000
    sentinel parallel-syncs mymaster 1
Нажмите, чтобы развернуть и увидеть больше

Ключевые параметры Sentinel:

Развернём Sentinel как отдельный StatefulSet:

YAML
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sentinel
spec:
  serviceName: sentinel
  replicas: 3
  selector:
    matchLabels:
      app: sentinel
  template:
    metadata:
      labels:
        app: sentinel
    spec:
      containers:
      - name: sentinel
        image: valkey/valkey:8.0
        command: ["redis-sentinel", "/etc/redis/sentinel.conf"]
        ports:
        - containerPort: 26379
        volumeMounts:
        - name: config
          mountPath: /etc/redis
      volumes:
      - name: config
        configMap:
          name: sentinel-config
Нажмите, чтобы развернуть и увидеть больше

Service для Sentinel:

YAML
apiVersion: v1
kind: Service
metadata:
  name: sentinel
spec:
  selector:
    app: sentinel
  ports:
  - port: 26379
Нажмите, чтобы развернуть и увидеть больше

Проверка фейловера

Симулируем отказ мастера:

SH
kubectl delete pod redis-0
Нажмите, чтобы развернуть и увидеть больше

Sentinel обнаружит отказ в течение 5 секунд (down-after-milliseconds), выберет новый мастер среди реплик и обновит конфигурацию. Redis-клиенты должны использовать Sentinel API для обнаружения нового мастера:

PYTHON
from redis import Sentinel

sentinel = Sentinel([('sentinel', 26379)], socket_timeout=0.1)
master = sentinel.master_for('mymaster')
master.set('key', 'value')
Нажмите, чтобы развернуть и увидеть больше

Использование операторов

Вручную настраивать Sentinel и репликацию — трудоёмко. Существуют операторы, автоматизирующие процесс:

ОператорРепозиторийОсобенности
OT-CONTAINER-KITgithub.com/OT-CONTAINER-KIT/redis-operatorСамый популярный, поддерживает Redis-Cluster и Sentinel, богатая конфигурация
Spotahomegithub.com/spotahome/redis-operatorЛёгкий, только Sentinel, хорош для начала
Opstreegithub.com/ot-container-kit/redis-operatorРазвивается OT-CONTAINER-KIT, поддержка Valkey

Пример установки OT-CONTAINER-KIT оператора:

SH
helm repo add ot-helm https://ot-container-kit.github.io/helm-charts/
helm install redis-operator ot-helm/redis-operator
Нажмите, чтобы развернуть и увидеть больше

Создание HA-кластера через оператор:

YAML
apiVersion: redis.redis.opstreelabs.in/v1beta2
kind: Redis
metadata:
  name: redis-standalone
spec:
  kubernetesConfig:
    image: quay.io/opstree/redis:v8.0
  storage:
    volumeClaimTemplate:
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi
---
apiVersion: redis.redis.opstreelabs.in/v1beta2
kind: RedisSentinel
metadata:
  name: redis-sentinel
spec:
  replicas: 3
  redisSentinelConfig:
    redisReplicationName: redis-standalone
    quorum: 2
Нажмите, чтобы развернуть и увидеть больше

Ключевые выводы

  1. Valkey — полная замена Redis для Kubernetes. Меняется только образ контейнера.
  2. StatefulSet + PVC — минимальная продакшн-конфигурация с persistence.
  3. Sentinel даёт автоматический failover, но усложняет конфигурацию.
  4. Операторы (OT-CONTAINER-KIT) автоматизируют весь жизненный цикл Redis-кластера.
  5. Redis Cluster для шардирования данных — отдельная тема, будет в следующих статьях.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша