Код-ревью Senior HPA, StatefulSet и тома обновлено

Ревью: StatefulSet и HPA

Вопрос

Найди проблемы в манифестах Redis-кластера и HPA для API.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 3
  selector:
    matchLabels: { app: redis }
  template:
    metadata:
      labels: { app: redis }
    spec:
      containers:
        - name: redis
          image: redis:7.4
          volumeMounts:
            - name: data
              mountPath: /data
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: redis-data
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: api
spec:
  scaleTargetRef: { apiVersion: apps/v1, kind: Deployment, name: api }
  minReplicas: 1
  maxReplicas: 50
  metrics:
    - type: Resource
      resource:
        name: memory
        target: { type: Utilization, averageUtilization: 60 }

Коротко

Исправленный StatefulSet: Плюс headless Service redis с clusterIP: None. HPA для API: minReplicas: 3, метрика CPU с целью 70% или RPS на под.

Что должен найти ревьюер

  1. Ошибкастрока 23
    Все три реплики используют один и тот же PVC redis-data: у реплик не будет своих данных, а RWO-том не подключится к подам на разных узлах. Нужны volumeClaimTemplates.
  2. Ошибкастрока 6
    serviceName: redis должен указывать на headless-сервис (clusterIP: None), иначе не будет стабильных DNS-имён redis-0.redis. Сервис нужно создать.
  3. Производительностьстрока 16
    Нет resources: Redis без лимита памяти может съесть узел, а без requests попадёт куда придётся. Задать requests = limits по памяти и maxmemory в конфиге.
  4. Ошибкастрока 31
    minReplicas: 1: при обновлении или падении единственного пода API недоступен. Минимум 2-3.
  5. Ошибкастрока 36
    Масштабирование по памяти: рантаймы не отдают память после пика, HPA будет только расти. Лучше CPU или своя метрика.
  6. Стиль
    Не видно настройки репликации Redis: три независимых экземпляра не образуют кластер. Нужен оператор или конфигурация репликации и Sentinel.

Разбор

Исправленный StatefulSet:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 3
  selector:
    matchLabels: { app: redis }
  template:
    metadata:
      labels: { app: redis }
    spec:
      containers:
        - name: redis
          image: redis:7.4
          resources:
            requests: { cpu: 200m, memory: 1Gi }
            limits: { memory: 1Gi }
          volumeMounts:
            - name: data
              mountPath: /data
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: [ReadWriteOnce]
        resources:
          requests:
            storage: 10Gi

Плюс headless Service redis с clusterIP: None. HPA для API: minReplicas: 3, метрика CPU с целью 70% или RPS на под.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме