5. Запуск множества копий приложений, чтобы, если одна вышла из строя, другие продолжали работать. Отслеживание и контроль тысяч приложений
Представь себе большой сад, где растут разные растения: помидоры, огурцы, клубника и много других. Чтобы все эти растения хорошо росли, им нужны вода, солнце, удобрения и другие условия. Но каждое растение требует разного ухода: помидорам нужно больше воды, а огурцам – меньше солнца.
Теперь представим, что вместо растений у нас программы, которые работают на компьютерах. За этими программами нужно следить, обновлять и восстанавливать в случае поломок. Также эти программы требуют разных условий для работы: одни нуждаются в большом количестве памяти, другим важно быстро получать данные от пользователей.
Вот тут-то и приходит на помощь Kubernetes. Это такой умный садовник, который следит за тем, чтобы каждая программа получала всё необходимое и работала максимально эффективно. Он распределяет программы по разным компьютерам так, чтобы всем хватало места и ресурсов. А ещё он помогает восстанавливаться программам, если вдруг что-то пошло не так: например, если один компьютер сломался, Kubernetes перенесёт программу на другой компьютер, чтобы она продолжала работать без перебоев.
Kubernetes помогает DevOps-инженерам решать множество задач, связанных с управлением приложениями и инфраструктурой. Вот несколько ключевых аспектов:
- Автоматизация развертывания - С Kubernetes DevOps-команды могут значительно упростить процесс развертывания приложений. Вместо того чтобы вручную настраивать каждый сервер и отслеживать состояние каждого приложения, Kubernetes предлагает описание всей конфигурации в виде файлов YAML или JSON. После этого Kubernetes берет на себя заботу о запуске и корректной работе приложения.
- Масштабирование - Kubernetes делает масштабирование приложений простым и эффективным. Когда нагрузка на приложение возрастает, Kubernetes автоматически создает новые экземпляры приложения, известные как «реплики», и распределяет нагрузку между ними. Это особенно полезно при работе с облачными сервисами, где ресурсы можно динамически увеличивать или уменьшать в зависимости от потребностей.
- Обеспечение отказоустойчивости - В случае сбоя одного из узлов или контейнеров, Kubernetes автоматически перезапускает их на других узлах, обеспечивая непрерывную доступность сервиса. Это снижает риск простоев и повышает надежность системы.
- Управление ресурсами - Kubernetes позволяет контролировать использование ресурсов, таких как процессор, память и дисковое пространство, каждым контейнером. Это помогает избежать ситуаций, когда одно приложение потребляет слишком много ресурсов и мешает работе других.
- Контейнеризация - Kubernetes тесно интегрирован с системами контейнеризации. Контейнеры позволяют упаковывать приложения вместе со всеми зависимостями, что делает их переносимыми и легко развертываемыми (запускаемыми) на любой платформе.
- Оркестрация микросервисов - При использовании микросервисной архитектуры Kubernetes помогает управлять большим количеством сервисов, обеспечивая их взаимодействие и мониторинг. Это значительно упрощает управление сложными распределенными системами.
- Мониторинг и логирование - Для мониторинга состояния кластера и отдельных приложений Kubernetes предоставляет встроенные инструменты. Он также поддерживает интеграцию с внешними системами мониторинга и логирования, такими как Prometheus и Loki.
- CI/CD - Kubernetes прекрасно интегрируется с инструментами CI/CD (непрерывная сборка, тестирование и деплой), что позволяет автоматизировать процессы сборки, тестирования и развертывания приложений. Например, GitHub Actions или GitLab CI/CD могут использовать Kubernetes для запуска тестов и автоматического обновления приложений.
Пройти курс https://learn.microsoft.com/ru-ru/training/modules/intro-to-kubernetes/ в конце которого будет практическое задание
Теоретические вопросы
- В чем преимущества Kubernetes перед Docker Compose?
- Что такое kubectl, пример основных команд?
- Как подключиться к кластеру Kubernetes с помощью kubectl?
- Что такое node, pod простыми словами?
- Как диагностировать проблему с подом, который в статусе
CrashLoopBackOff
?
- Зачем нужны namespace и несколько вариантов, как они используются и работают?
- Какие компоненты входят в состав master node?
- Сколько может быть master node? Возможно ли иметь два или четыре? Почему так?
- Какие компоненты присутствуют на worker node?
- Как запустить pod на конкретной node и зачем такое может пригодиться?
- Сколько контейнеров может быть запущено в одном pod?
- Как приложению из одного pod обратиться с запросом к приложению в другом pod?
- Как приложению из одного контейнера в pod обратиться с запросом к приложению, запущенному в том же pod, но в другом контейнере?
- Что такое и в чем разница между Statfulset, Deployment и DaemonSet?
- Как подключить Secret или ConfigMap к pod и зачем они нужны?
- Можно ли в DaemonSet задать количество реплик?
- Как подключить диск к pod в Statfulset?
- Каковы различия между CronJob и Job и зачем нужна каждая из них?
- Как Deployment создает и обновляет наборы pod?
- Как Statfulset создает и обновляет наборы pod?
- Для чего нужны и чем отличаются requests и limits для pod?
- Как обеспечить высокую доступность приложения в Kubernetes?
- Чем отличаются labels от annotations и какую роль они играют?
- Какие существуют пробы и у pod, в каком порядке они срабатывают и зачем нужны?
- Каким образом Service распределяет трафик между pod?
- В чем разница между egress и ingress?
- Gateway API заменит ingress, почему? Чем он лучше?
- Какой путь трафика от пользователя до приложения в контейнере, если мы говорим про Kubernetes кластер?
- Какие есть варианты масштабирования pod в Kubernetes с примерами?
- Какие основные принципы RBAC, зачем это нужно?
- Как с помощью RBAC разрешить разработчику управлять только Deployment и Pods в неймспейсе dev, но запретить доступ к Secrets и другим неймспейсам?
Первое задание. Развертывание и масштабирование веб-приложения с мониторингом
Цель: Продемонстрировать умение работать с базовыми ресурсами Kubernetes (Deployment, Service, Ingress), настраивать пробы, автомасштабирование и диагностировать проблемы.
Шаги:
- Развертывание приложения:
- Создайте Deployment для веб-приложения (например, Nginx или пользовательского образа), указав
requests/limits
для CPU и памяти.
- Добавьте readiness- и liveness-пробы по HTTP-запросу к
/healthz
.
- Создайте Service типа ClusterIP для доступа к подам.
- Настройте Ingress для внешнего доступа (можно использовать Minikube с дополнением ingress или облачный провайдер).
- Горизонтальное автомасштабирование (HPA):
- Настройте HPA для автоматического масштабирования Deployment при нагрузке на CPU ≥ 50%.
- Проверьте работу HPA, создав нагрузку (например, через
kubectl run --generator=run-pod/v1 -it --rm load-generator --image=busybox -- sh -c "while true; do wget -q -O- http://<сервис>:<порт>; done"
).
- Диагностика:
- Сымитируйте ошибку в readiness-пробе (например, измените путь на несуществующий) и проверьте, как Kubernetes обрабатывает недоступные поды.
- Используйте
kubectl describe
, kubectl logs
и kubectl exec
для анализа состояния подов.
Проверка:
- Приложение доступно через Ingress.
- HPA увеличивает количество реплик при нагрузке.
- При некорректной пробе поды переходят в статус
NotReady
, но не перезапускаются (только readiness).
Второе задание. StatefulSet для базы данных с PersistentVolume и RBAC
Цель: Показать навыки работы с StatefulSet, PersistentVolume, Headless Service и настройкой прав доступа через RBAC.
Шаги:
- StatefulSet и PersistentVolume:
- Разверните StatefulSet для MongoDB или Redis с репликацией (3 реплики).
- Настройте PersistentVolume (можно использовать
storageClassName: standard
в Minikube или облачном провайдере).
- Создайте Headless Service для управления сетевым взаимодействием между репликами.
- Безопасность через RBAC:
- Создайте ServiceAccount с ограниченными правами (например, разрешить только
get
и list
для Pods в определенном неймспейсе).
- Настройте Role и RoleBinding для этого ServiceAccount.
- Проверьте ограничения, запустив под с этим ServiceAccount и попытавшись выполнить запрещенные действия (например, удалить Pod).
- Тестирование отказоустойчивости:
- Удалите одну из реплик StatefulSet и убедитесь, что Kubernetes автоматически воссоздает её с тем же сетевым идентификатором и томом.
- Проверьте сохранность данных после перезапуска пода.
Проверка:
- Реплики StatefulSet имеют уникальные идентификаторы (pod-0, pod-1 и т.д.) и постоянные тома.
- ServiceAccount не может выполнять запрещенные действия.
- Данные сохраняются после удаления и пересоздания пода.