Вы находитесь на странице: 1из 109

Stateful в k8s, которого мы боимся

Женя Дехтярёв
Про команду

2
Про команду

3
Про команду

4
Про команду

5
Про команду

6
2ГИС — это
160k RPS

68 млн MAU

СУБД до 35 Тб

100+ релизов/день

Лид инфраструктуры

7
О чём поговорим
● Почему Stateful в k8s?
● Локальные и сетевые PV в k8s
● Особенности Stateful для PV
● Интересные случаи использования PV

8
Stateful vs Stateless
● Stateless — не храним данные, всегда чистый лист
○ Пример: REST API

9
Stateful vs Stateless
● Stateless — не храним данные, всегда чистый лист
○ Пример: REST API

● Stateful — храним данные, ответ зависит от данных


○ Пример: СУБД

10
Почему мы хотим stateful в k8s?

11
Платформа k8s — это окружение,
которое позволяет экономить
время на операционку

12
Экономия

Мониторинг

Метрики и алерты сразу из коробки


Экономия

Мониторинг

Логирование

Просто отправь в /dev/stdout


Экономия

Мониторинг

Логирование

Маршрутизация

Только настрой ingress


Экономия

Мониторинг

Логирование

Маршрутизация

Масштабирование

Масштабирование в 1 команду
Stateful-приложения
Локальные диски Сетевые диски

● Cassandra ● PGSQL
○ 5 Тб ○ Dev-окружения (Spilo)
● Kafka ● Redis
○ 15 Тб
● Elasticsearch
○ 35 Тб
● PGSQL
○ Prod
● Clickhouse
● Mongo

17
Stateful-приложения
Локальные диски Сетевые диски

● Cassandra ● PGSQL
○ 5 Тб ○ Dev-окружения (Spilo)
● Kafka ● Redis
○ 15 Тб
● Elasticsearch
○ 35 Тб
● PGSQL
○ Prod
● Clickhouse
● Mongo

18
Локальные Volume

19
Локальные Volume. Когда применять?
● Нужна максимальная производительность(600 нс ответ)

20
Локальные Volume. Когда применять?
● Нужна максимальная производительность(600 нс ответ)
● Нужны большие объёмы(4-8 Тб SSD — это ОК)

21
Локальные Volume. Когда применять?
● Нужна максимальная производительность(600 нс ответ)
● Нужны большие объёмы(4-8 Тб SSD — это ОК)
● Приложение умеет в самостоятельное восстановление
○ Потерять 1 LocalPV — это норма!

22
Локальные Volume. Пример
Elasticsearch, Cassandra

● Минимальные задержки диска

23
Локальные Volume. Пример
Elasticsearch, Cassandra

● Минимальные задержки диска


● Недоступность POD в несколько часов не приведёт ни к чему

24
Локальные Volume. Пример
Elasticsearch, Cassandra

● Минимальные задержки диска


● Недоступность POD в несколько часов не приведёт ни к чему
● Самостоятельное восстановление реплик

25
Локальные Volume. Пример
Elasticsearch, Cassandra

● Минимальные задержки диска


● Недоступность POD в несколько часов не приведёт ни к чему
● Самостоятельное восстановление реплик
● Самостоятельное шардирование

26
T
O
P
O
L
V
M 27
github.com/topolvm/topolvm

PVC

POD

K8s

28
github.com/topolvm/topolvm

TopoLVM Create
PVC
Operator

POD Volume
Volume
LVM
Node

K8s

29
github.com/topolvm/topolvm

TopoLVM Create
PVC
Operator

POD PV Volume
Volume
LVM
Node

K8s

30
github.com/topolvm/topolvm
nodeAffinity:
required:
nodeSelectorTerms:
TopoLVM Create - matchExpressions:
PVC
Operator - key: topology.topolvm.cybozu.com/node
operator: In
values:
- hostName.dc.2gis

POD PV Volume
Volume
LVM
Node

K8s

31
github.com/topolvm/topolvm
● Плюсы
○ Динамический провижининг
■ *в пределах сервера
○ Легкое расширение
○ Метрики
○ Быстрый

32
github.com/topolvm/topolvm
● Плюсы
○ Динамический провижининг
■ *в пределах сервера
○ Легкое расширение
○ Метрики
○ Быстрый

● Минусы
○ Нужен оператор
○ LVM на нодах k8s

33
Сетевые Volume

34
Сетевые Volume. Когда применять?
● Dev/Stage, небольшие объёмы

35
Сетевые Volume. Когда применять?
● Dev/Stage, небольшие объёмы
● Нужна максимальная надёжность данных(Prod)

36
Сетевые Volume. Когда применять?
● Dev/Stage, небольшие объёмы
● Нужна максимальная надёжность данных(Prod)
● Не важно где запуститься, главное запуститься
○ Например CronJob с диском

37
Сетевые Volume. Пример
PGSQL

● 2 реплики (Master-Slave)

38
Сетевые Volume. Пример
PGSQL

● 2 реплики (Master-Slave)
● Перезапуск POD = минимальный простой Slave

39
Сетевые Volume. Пример
PGSQL

● 2 реплики (Master-Slave)
● Перезапуск POD = минимальный простой Slave
● WAL хватает, репликация не разваливалась

40
Сетевые Volume

PVC

POD

K8s

41
Сетевые Volume

СХД
PVC
Operator

СХД
POD

K8s Ceph RBD

42
Сетевые Volume

СХД
PVC
Operator

СХД
POD PV

K8s Ceph RBD

43
Сетевые Volume. RBD Ceph
● Плюсы
○ Динамический провижининг
○ Простое расширение
○ Быстрое восстановление

44
Сетевые Volume. RBD Ceph
● Плюсы
○ Динамический провижининг
○ Простое расширение
○ Быстрое восстановление
● Минусы
○ Скорость зависит от:
■ скорости сети
■ дисков под CEPH
○ Деградация СХД → увеличение времени ответа

45
Особенности Stateful для PV

46
Локальные Volume в коммуналке
● PodAntiAffinity

47
Локальные Volume в коммуналке
● PodAntiAffinity
● PodPriority

48
Локальные Volume в коммуналке
● PodAntiAffinity
● PodPriority
● PodDisruptionBudget

49
Локальные Volume в коммуналке
● PodAntiAffinity
● PodPriority
● PodDisruptionBudget
● 2+ POD на 1 K8s Node — iowait

50
Локальные Volume в коммуналке
● PodAntiAffinity
● PodPriority
● PodDisruptionBudget
● 2+ POD на 1 K8s Node — iowait
● Не квотировать объём PV

51
Локальные Volume в коммуналке
● PodAntiAffinity
● PodPriority
● PodDisruptionBudget
● 2+ POD на 1 K8s Node — iowait
● Не квотировать объём PV
● Stateful, replicas 3+

52
Локальные Volume в коммуналке
● PodAntiAffinity
● PodPriority
● PodDisruptionBudget
● 2+ POD на 1 K8s Node — iowait
● Не квотировать объём PV
● Stateful, replicas 3+
● Бэкап!

53
Сетевые Volume в коммуналке
● PodAntiAffinity
○ *не обязательно

54
Сетевые Volume в коммуналке
● PodAntiAffinity
○ *не обязательно
● PodDisruptionBudget

55
Сетевые Volume в коммуналке
● PodAntiAffinity
○ *не обязательно
● PodDisruptionBudget
● Много операций с данными == iowait;

56
Сетевые Volume в коммуналке
● PodAntiAffinity
○ *не обязательно
● PodDisruptionBudget
● Много операций с данными == iowait;
● Обязательное квотирование и ограничения

57
Сетевые Volume в коммуналке
● PodAntiAffinity
○ *не обязательно
● PodDisruptionBudget
● Много операций с данными == iowait;
● Обязательное квотирование и ограничения
● Stateful, replicas 3+

58
Сетевые Volume в коммуналке
● PodAntiAffinity
○ *не обязательно
● PodDisruptionBudget
● Много операций с данными == iowait;
● Обязательное квотирование и ограничения
● Stateful, replicas 3+
● Бэкап!

59
Разные интересные штуки
с практическими примерами

60
Миграция с одного на другой тип PV

PVC-1
POD-1 PV-1
CEPH

PVC-2
POD-2 PV-2
CEPH

Statefulset

61
Миграция с одного на другой тип PV
kind: StatefulSet

spec:
PVC-1
POD-1 PV-1
CEPH volumeClaimTemplates(PVC):

spec:

storageClassName: ceph-csi-rbd-ssd
PVC-2
POD-2 PV-2
CEPH

Statefulset, ceph-csi-rbd-ssd

62
Миграция с одного на другой тип PV
kind: StatefulSet

spec:
PVC-1
POD-1 PV-1
CEPH volumeClaimTemplates(PVC):

spec:

storageClassName: ceph-csi-rbd-ssd
PVC-2
POD-2 PV-2
CEPH

k8s не даёт изменить volumeClaimTemplates


Statefulset, ceph-csi-rbd-ssd

63
Миграция с одного на другой тип PV
$ kubectl delete sts/name --cascade=orphan

PVC-1
POD-1 PV-1
CEPH

PVC-2
POD-2 PV-2
CEPH

Statefulset, ceph-csi-rbd-ssd

64
Миграция с одного на другой тип PV
$ kubectl delete sts/name --cascade=orphan

PVC-1
POD-1 PV-1
CEPH

PVC-2
POD-2 PV-2
CEPH

65
Миграция с одного на другой тип PV
$ kubectl create -f sts_new_storage

PVC-1 ---
POD-1 PV-1
CEPH kind: StatefulSet

spec:

volumeClaimTemplates(PVC):
PVC-2
POD-2 PV-2 spec:
CEPH
storageClassName: topolvm-ext4

Statefulset, topolvm-ext4

66
Миграция с одного на другой тип PV
$ kubectl delete POD-1

PVC-1 $ kubectl delete PVC-1


POD-1 PV-1
CEPH

PVC-2
POD-2 PV-2
CEPH

Statefulset, topolvm-ext4

67
Миграция с одного на другой тип PV
K8s пересоздаёт PV и POD

PVC-2
POD-2 PV-2
CEPH

Statefulset, topolvm-ext4

68
Миграция с одного на другой тип PV
Повторяем с другими POD..

PVC-1
POD-1 PV-1
TOPOLVM

PVC-2
POD-2 PV-2
CEPH

Statefulset, topolvm-ext4

69
Миграция с одного на другой тип PV
Profit!

PVC-1
POD-1 PV-1
TOPOLVM

PVC-2
POD-2 PV-2
TOPOLVM

Statefulset, topolvm-ext4

70
Sidecar и Volumes

Calculator
Source &
data distribution

Client

71
Sidecar и Volumes

Calculator
Source get source data &
data distribution

Client

72
Sidecar и Volumes

Calculator
Source get source data & get prepared data
data distribution
all day

Client

73
Sidecar и Volumes

Calculator

LocalPV

Nginx

74
Sidecar и Volumes

Calculator

CronJob

LocalPV

RO
Nginx

Deployment

75
Sidecar и Volumes

RW
Calculator

CronJob

LocalPV

RO
Nginx

Deployment

76
Sidecar и Volumes

RW metadata:
Calculator name: calculator

affinity:
CronJob podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
LocalPV matchExpressions:
- key: app.kubernetes.io/instance
operator: In
values:
- nginx
RO topologyKey: kubernetes.io/hostname
Nginx

Deployment

77
Limits.memory, stateful & iowait

HW

Elasticsearch

78
Limits.memory, stateful & iowait

HW POD LocalPV

Elasticsearch Elasticsearch

K8s
79
Limits.memory, stateful & iowait
Elasticsearch. JAVA

JVM Heap

16 Gb

80
Limits.memory, stateful & iowait
Elasticsearch. JAVA

JVM Heap Requests.memory

16 Gb

17 Gb

81
Limits.memory, stateful & iowait
Elasticsearch. JAVA

JVM Heap Requests.memory Limits.memory

16 Gb

17 Gb

18 Gb
POD

82
Limits.memory, stateful & iowait
Elasticsearch. JAVA

JVM Heap Requests.memory Limits.memory RAM Total

16 Gb

17 Gb

18 Gb
POD 64 Gb
K8s Node

83
Limits.memory, stateful & iowait
Elasticsearch. JAVA

JVM Heap Requests.memory Limits.memory RAM Total

16 Gb

17 Gb

18 Gb
POD 64 Gb
K8s Node
Проблема
● Активная работа с диском
● Сильный IOwait >15%
84
Limits.memory, stateful & iowait
Elasticsearch. JAVA

JVM Heap Requests.memory Limits.memory RAM Total

16 Gb

17 Gb

24 Gb
POD 64 Gb
K8s Node
Решение
● Расширяем limits.memory для PageCache!
● IOwait проходит
85
Generic ephemeral volumes
● Сетевое или локальное хранилище
● Хранилище заданного размера
● Kubernetes сам выбирает куда зашедулить
● Типовые операции с томом(snapshot, resize)
● Можно наполнить начальными данными

86
Generic ephemeral volumes
Требования:

● Гарантия наличия места

87
Generic ephemeral volumes
Требования:

● Гарантия наличия места


● Стартовать в любой ситуации

88
Generic ephemeral volumes
Требования:

● Гарантия наличия места


● Стартовать в любой ситуации
● Быстрый диск - значит локальный

89
Generic ephemeral volumes. Пример
● Cronjob/Job
○ Расчётный сервис, большой объём данных

90
Generic ephemeral volumes. Пример
● Cronjob/Job
○ Расчётный сервис, большой объём данных

● Gitlab Runner
○ Кэш сборок

91
Generic ephemeral volumes. Пример
● Cronjob/Job
○ Расчётный сервис, большой объём данных

● Gitlab Runner
○ Кэш сборок

● Deployment
○ Скачать много данных на старте, но можно их терять

92
Ограничения IOPS

IOWAIT

93
Ограничения IOPS. Как у нас?
● Подрывались 1 раз

94
Ограничения IOPS. Как у нас?
● Подрывались 1 раз
○ 2023 - SSD | 2024+ - NVMe

95
Ограничения IOPS. Как у нас?
● Подрывались 1 раз
○ 2023 - SSD | 2024+ - NVMe

● Ничего не делаем,
костыль = 6+ месяцев

96
Ограничения IOPS. А что сообщество?

kubernetes/enhancements
2254

cgroup v2

97
Ограничения IOPS. А что сообщество?

kubernetes/enhancements
2254

cgroup v2

kubernetes/enhancements kubernetes/issue
3008 92287

quality-of-service resources iops limit

98
Плавный переход к результатам

99
Итоги: какие PV у нас используются
Список storageClass с которыми мы работаем:

● topolvm-ext4 —локальное, стандартное, на SSD


● topolvm-hdd-ext4 — локальное, медленное, большое, на HDD

100
Итоги: какие PV у нас используются
Список storageClass с которыми мы работаем:

● topolvm-ext4 —локальное, стандартное, на SSD


● topolvm-hdd-ext4 — локальное, медленное, большое, на HDD
● ceph-csi-rbd — сетевое, медленное, большое
● ceph-csi-rbd-ssd — сетевое, быстрое, маленькое

101
Итоги: какие PV у нас используются
Список storageClass с которыми мы работаем:

● topolvm-ext4 —локальное, стандартное, на SSD


● topolvm-hdd-ext4 — локальное, медленное, большое, на HDD
● ceph-csi-rbd — сетевое, медленное, большое
● ceph-csi-rbd-ssd — сетевое, быстрое, маленькое
● nfs-<namespace> — сетевое, с бэком на Netapp, ReadWriteMany

102
Итоги: правильный stateful
● Думать о кворуме

103
Итоги: правильный stateful
● Думать о кворуме
● Выпадение 1 POD — это норма
○ Настроить защиту!

104
Итоги: правильный stateful
● Думать о кворуме
● Выпадение 1 POD — это норма
○ Настроить защиту!
● Больше типов PV — не насилуем инфраструктуру

105
Итоги: правильный stateful
● Думать о кворуме
● Выпадение 1 POD — это норма
○ Настроить защиту!
● Больше типов PV — не насилуем инфраструктуру
● Можем советовать крутой оператор LocalPV
○ github.com/topolvm/topolvm

106
Итоги: правильный stateful
● Думать о кворуме
● Выпадение 1 POD — это норма
○ Настроить защиту!
● Больше типов PV — не насилуем инфраструктуру
● Можем советовать крутой оператор LocalPV
○ github.com/topolvm/topolvm
● Предоставляем разные типы PV и больше не поднимаем VM для Stateful

107
Итоги: правильный stateful
● Думать о кворуме
● Выпадение 1 POD — это норма
○ Настроить защиту!
● Больше типов PV — не насилуем инфраструктуру
● Можем советовать крутой оператор LocalPV
○ github.com/topolvm/topolvm
● Предоставляем разные типы PV и больше не поднимаем VM для Stateful
● Бэкап!

108
Спасибо!
Вопросы?

Дехтярёв Женя
edekhtyarev
e.dekhtyarev@2gis.ru
github.com/dekhtyarev/devoops-readme

Вам также может понравиться