Академический Документы
Профессиональный Документы
Культура Документы
Женя Дехтярёв
Про команду
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
10
Почему мы хотим stateful в k8s?
11
Платформа k8s — это окружение,
которое позволяет экономить
время на операционку
12
Экономия
Мониторинг
Мониторинг
Логирование
Мониторинг
Логирование
Маршрутизация
Мониторинг
Логирование
Маршрутизация
Масштабирование
Масштабирование в 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
24
Локальные Volume. Пример
Elasticsearch, Cassandra
25
Локальные Volume. Пример
Elasticsearch, Cassandra
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
42
Сетевые Volume
СХД
PVC
Operator
СХД
POD PV
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
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-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
16 Gb
17 Gb
81
Limits.memory, stateful & iowait
Elasticsearch. JAVA
16 Gb
17 Gb
18 Gb
POD
82
Limits.memory, stateful & iowait
Elasticsearch. JAVA
16 Gb
17 Gb
18 Gb
POD 64 Gb
K8s Node
83
Limits.memory, stateful & iowait
Elasticsearch. JAVA
16 Gb
17 Gb
18 Gb
POD 64 Gb
K8s Node
Проблема
● Активная работа с диском
● Сильный IOwait >15%
84
Limits.memory, stateful & iowait
Elasticsearch. JAVA
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
98
Плавный переход к результатам
99
Итоги: какие PV у нас используются
Список storageClass с которыми мы работаем:
100
Итоги: какие PV у нас используются
Список storageClass с которыми мы работаем:
101
Итоги: какие PV у нас используются
Список storageClass с которыми мы работаем:
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