Настройка
Kubernetes:
tips and tricks
Михаил Прокопчук, Avito
Avito
Сайт №1 объявлений в России
35 миллионов пользователей ежедневно
300+ серверов
15000rps к бэкенду
Kubernetes в Avito
Больше года: c 3-х нод до 2-х кластеров
Все новые сервисы в k8s
Kubernetes в Avito
Провели workshop'ы/meetup'ы
Написали шаблоны сервисов
Kubernetes в Avito
Сервисов внезапно стало много
Производительность стала критичной
Нужно что-то делать!11
План доклада
Как работает Kubernetes
Настройки, проблемы и решения
Немного про мониторинг
Как работает Kubernetes
Со стороны разработчика:
Код
+
Kubernetes-спецификации:
deployments
services
ingresses
Облако
Как работает Kubernetes
На самом деле:
Kubernetes –
операционная система
для кластера
И эту операционную
систему можно и нужно
настроить
На что обратить внимание
Ноды: CPU, Network, RAM
Инфраструктура: apiserver, etcd, scheduler
Проблема
"Нехватка" ресурсов
kube-scheduler
Планирует размещение pod'ов, учитывая
spec.containers[].resources.requests
(deployment)
вне зависимости от фактического потребления
Типичная ситуация
Решениe
Предвалидация и установка requests
в зависимости от окружения:
prod/dev/staging
Как сделать
Заставить писать requests :(
Выделять и ограничивать namespace'ы
Использовать LimitRange
Написать свой linter!11
Проблема
Высокий и "рваный" latency
Latency сервиса (http)
1.5s
0s
Решение
cpu governor mode: perfomance
Как сделать
# cat 
/sys/devices/system/cpu/cpu0/cpufreq/
scaling_governor
ondemand
# echo 
performance 
> /sys/devices/system/cpu/cpu0/cpufreq/
scaling_governor
Latency сервиса (http)
500ms
0ms
CPU worker nodes
40%
0%
Проблема
Сетевые потери: под удар попадает dns
/etc/resolv.conf
search 
default.svc.cluster.local 
svc.cluster.local 
cluster.local
nameserver 192.168.0.1
options ndots:5
Как выглядит resolv: 6 обращений
AAAA? kubernetes.default.
A? kubernetes.default.
NXDomain 0/0/0 ...
AAAA? kubernetes.default.default.svc.
A? kubernetes.default.default.svc.
NXDomain 0/1/0 ...
AAAA? kubernetes.default.svc.cluster.local
0/0/0 ...
A? kubernetes.default.svc.cluster.local
1/0/0 A 192.168.0.1
Решение
стандартные сетевые оптимизации
Как сделать
Распределить прерывания NIC по ядрам
Настроить NIC coalesce
(агрегирование прерываний)
Настроить network sysctls
Проблема
Больше 100 pod'ов на хосте – деградация
Под удар попадает dev/staging:
множество релизов с разных веток etc.
Как выглядит
# kubectl get pods
...
STATUS
ContainerCreating
Как выглядит
Error syncing pod, skipping
...
operation timeout: context deadline
exceeded
Решение
"Разбивать" хосты:
запуск vms как k8s worker nodes
Мы запустили kvm-машины
Мониторинг
kube-apiserver
Рейт запросов с разбивкой по операциям
Перцентили
Рейт ошибок с разбивкой по операциям
kube-dns
kube-dns: основной процесс
dnsmasq: кэш перед kube-dns:


# ps uxa
...
dnsmasq --cache-size=5000 ...
kube-dns
kube-dns: cpu usage
dnsmasq: cache efficiency
kubelet
Рейт запросов с разбивкой по операциям
Перцентили
Рейт ошибок с разбивкой по операциям
dockerd
Рейт запросов с разбивкой по операциям
Перцентили
Рейт ошибок с разбивкой по операциям
Как мониторить?
prometheus
Prometheus
Все инфраструктурные компоненты
Kubernetes отдают location /metrics
Prometheus
Доступны метрики по контейнерам/pod'ам
Prometheus
Avito dev-cluster
Prometheus version: 2.0.0-beta.5
Prometheus
Avito dev-cluster:
90 worker nodes
1200 deployments
2300 pods
CPU usage
200%
0%
Time-series total
990K
976K
Virtual memory
27.1Gb
26.8Gb
Выводы
Kubernetes – операционная
система для кластера
Настройка всех компонент
по всему стеку
вплоть до железа
Мониторинг
Спасибо за внимание!
Вопросы?
mike.prokopchuk@gmail.com
github.com/theairkit

Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)