Обзор возможностей Kubernetes, зачем он нужен, кому и когда, а также немного хороших практик по развертыванию и разработке Kubernetes-powered приложений.
2. whoami
• Виталий Фокин
• Python-, Java-, Javascript-, Whatever-developer
• 8 лет коммерческого продакшена
• https://www.linkedin.com/in/vitalifokin/
• https://www.facebook.com/quozd
3. Но сначала..
• Kubernetes и оркестрация приложений - очень сложная и большая
тема, поэтому смотреть будем свысока и опустим некоторые детали
• Смотрим со стороны разработчика приложений, администрирование
Kubernetes - отдельная вселенная со своей магией
• Все примеры для Kubernetes 1.8
5. Open-source system for automating deployment, scaling, and
management of containerized applications
6.
7. Контейнеризация
• Виртуализация на уровне операционной системы — метод
виртуализации, при котором ядро операционной системы
поддерживает несколько изолированных экземпляров пространства
пользователя, вместо одного. Эти экземпляры (часто называемые
контейнерами или зонами) с точки зрения пользователя полностью
идентичны реальному серверу. Ядро обеспечивает полную
изолированность контейнеров, поэтому программы из разных
контейнеров не могут воздействовать друг на друга. (Педивикия)
8. И зачем это всё?
• Меньше overhead по сравнению с виртуальными машинами
• Не требует поддержки железа
• Все еще хорошая изоляция
• Проще в использовании
• НО меньше возможностей (shared ядро, нельзя запустить другую ОС
и т.д.)
• LXC, FreeBSD Jails, Docker, rkt, etc..
9. Docker
• Система userspace контейнеризации
• Преимущественно для Linux
• Использует LXC linux namespaces и
cgroups
• Позволяет «упаковать» приложение со
всем его окружением и зависимостями в
контейнер
10. • Воспроизводимость: больше нет "Работает на моем компе"
• Атомарность: все зависимости носим с собой и не зависим от хоста
• Легковестность: масштабирование и восстановление после сбоя в 1
клик
• Изолированность: контейнеры не влияют друг на друга и на хост (не
совсем)
• Управление ресурсами хоста
25. • Автоматическое распределение ресурсов
• Горизонтальное масштабирование
• Автоматическое развертывание и откат
• Управление системой хранения
• Автоматическое восстановление при сбоях
• Балансировка и service discovery
• Управление секретами и конфигурациями
• Одноразовые задачи
37. StatefulSets
• Русская языка очень сложная
• Stable, unique network identifiers.
• Stable, persistent storage.
• Ordered, graceful deployment and scaling.
• Ordered, graceful deletion and termination.
• Ordered, automated rolling updates.
38. DaemonSets
• Запускает pods на каждой ноде кластера (или выбранных нодах)
• Автоматически появится на новых нодах
• Удобно использовать для различных сервисов мониторинга
(prometheus, collectd), коллекторов логов (logstash, fluentd) и т.п.
39. Jobs
• Одноразово запускает поды и ждет их завершения
• Можно применять для внеплановых бекапов баз, работ по
восстановлению из бекапов, сбора информации по системе,
наполнения системы начальными данными, запуска тестов в CI и др.
43. Ограничение ресурсов
• CPU лимиты измеряются в юнитах-"миллиядрах"
• 1CPU = 1000m
• requests.cpu конвертируется в --cpu-shares флаг контейнера
• limits.cpu конвертируется в CPU time на каждые 100ms
• Превышение лимита приведет к тротлингу, но контейнер не умрет
44. Ограничение ресурсов
• Memory лимиты измеряются в байтах
• Превышение limit может привести к рестарту (если можно) или к
удалению контейнера
• Превышение requests приведет к удалению контейнера, если на ноде
заканчивается память
55. Tips (контейнеры)
• Контейнеры должны быть stateless
• Не раздувайте контейнеры
• Не запускайте процессы от root
• Один контейнер - один процесс
• Не надо делать авторестарт внутри контейнера, лучше завершиться
• Сканируйте на уязвимости и обновляйте базовый образ
56. Tips (deployments)
• Используйте --record при деплое, поможет с роллбеком
• Больше лейблов богу лейблов
• Используйте initContainers для бутстрапа
• Никогда не используйте latest тэг контейнера
• Readness & liveness probes - маст хэв
• Не забывайте про лимиты
• ExternalService поможет с внешними зависимостями
57. Tips (всего понемножку)
• Ingress - это хорошо
• Используйте Helm
• Не переборщите с Micro в микросервисах
• Используйте Namespaces для разделения кластера
• ChaosMonkey укажет на косяки
• Не ходите на ноды по SSH, используйте kubectl exec
• Мониторинг, логи