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