Курс обучения DevOps от Евгения Быкова

Logo

Каждая тема включает в себя теоретические знания, вопросы к ним и практические задания

Вернуться к главной странице, списку всех тем

5. Запуск множества копий приложений, чтобы, если одна вышла из строя, другие продолжали работать. Отслеживание и контроль тысяч приложений

Представь себе большой сад, где растут разные растения: помидоры, огурцы, клубника и много других. Чтобы все эти растения хорошо росли, им нужны вода, солнце, удобрения и другие условия. Но каждое растение требует разного ухода: помидорам нужно больше воды, а огурцам – меньше солнца.

Теперь представим, что вместо растений у нас программы, которые работают на компьютерах. За этими программами нужно следить, обновлять и восстанавливать в случае поломок. Также эти программы требуют разных условий для работы: одни нуждаются в большом количестве памяти, другим важно быстро получать данные от пользователей.

Вот тут-то и приходит на помощь Kubernetes. Это такой умный садовник, который следит за тем, чтобы каждая программа получала всё необходимое и работала максимально эффективно. Он распределяет программы по разным компьютерам так, чтобы всем хватало места и ресурсов. А ещё он помогает восстанавливаться программам, если вдруг что-то пошло не так: например, если один компьютер сломался, Kubernetes перенесёт программу на другой компьютер, чтобы она продолжала работать без перебоев.

Kubernetes помогает DevOps-инженерам решать множество задач, связанных с управлением приложениями и инфраструктурой. Вот несколько ключевых аспектов:

  1. Автоматизация развертывания - С Kubernetes DevOps-команды могут значительно упростить процесс развертывания приложений. Вместо того чтобы вручную настраивать каждый сервер и отслеживать состояние каждого приложения, Kubernetes предлагает описание всей конфигурации в виде файлов YAML или JSON. После этого Kubernetes берет на себя заботу о запуске и корректной работе приложения.
  2. Масштабирование - Kubernetes делает масштабирование приложений простым и эффективным. Когда нагрузка на приложение возрастает, Kubernetes автоматически создает новые экземпляры приложения, известные как «реплики», и распределяет нагрузку между ними. Это особенно полезно при работе с облачными сервисами, где ресурсы можно динамически увеличивать или уменьшать в зависимости от потребностей.
  3. Обеспечение отказоустойчивости - В случае сбоя одного из узлов или контейнеров, Kubernetes автоматически перезапускает их на других узлах, обеспечивая непрерывную доступность сервиса. Это снижает риск простоев и повышает надежность системы.
  4. Управление ресурсами - Kubernetes позволяет контролировать использование ресурсов, таких как процессор, память и дисковое пространство, каждым контейнером. Это помогает избежать ситуаций, когда одно приложение потребляет слишком много ресурсов и мешает работе других.
  5. Контейнеризация - Kubernetes тесно интегрирован с системами контейнеризации. Контейнеры позволяют упаковывать приложения вместе со всеми зависимостями, что делает их переносимыми и легко развертываемыми (запускаемыми) на любой платформе.
  6. Оркестрация микросервисов - При использовании микросервисной архитектуры Kubernetes помогает управлять большим количеством сервисов, обеспечивая их взаимодействие и мониторинг. Это значительно упрощает управление сложными распределенными системами.
  7. Мониторинг и логирование - Для мониторинга состояния кластера и отдельных приложений Kubernetes предоставляет встроенные инструменты. Он также поддерживает интеграцию с внешними системами мониторинга и логирования, такими как Prometheus и Loki.
  8. CI/CD - Kubernetes прекрасно интегрируется с инструментами CI/CD (непрерывная сборка, тестирование и деплой), что позволяет автоматизировать процессы сборки, тестирования и развертывания приложений. Например, GitHub Actions или GitLab CI/CD могут использовать Kubernetes для запуска тестов и автоматического обновления приложений.

Пройти курс https://learn.microsoft.com/ru-ru/training/modules/intro-to-kubernetes/ в конце которого будет практическое задание

Теоретические вопросы

  1. В чем преимущества Kubernetes перед Docker Compose?
  2. Что такое kubectl, пример основных команд?
  3. Как подключиться к кластеру Kubernetes с помощью kubectl?
  4. Что такое node, pod простыми словами?
  5. Как диагностировать проблему с подом, который в статусе CrashLoopBackOff?
  6. Зачем нужны namespace и несколько вариантов, как они используются и работают?
  7. Какие компоненты входят в состав master node?
  8. Сколько может быть master node? Возможно ли иметь два или четыре? Почему так?
  9. Какие компоненты присутствуют на worker node?
  10. Как запустить pod на конкретной node и зачем такое может пригодиться?
  11. Сколько контейнеров может быть запущено в одном pod?
  12. Как приложению из одного pod обратиться с запросом к приложению в другом pod?
  13. Как приложению из одного контейнера в pod обратиться с запросом к приложению, запущенному в том же pod, но в другом контейнере?
  14. Что такое и в чем разница между Statfulset, Deployment и DaemonSet?
  15. Как подключить Secret или ConfigMap к pod и зачем они нужны?
  16. Можно ли в DaemonSet задать количество реплик?
  17. Как подключить диск к pod в Statfulset?
  18. Каковы различия между CronJob и Job и зачем нужна каждая из них?
  19. Как Deployment создает и обновляет наборы pod?
  20. Как Statfulset создает и обновляет наборы pod?
  21. Для чего нужны и чем отличаются requests и limits для pod?
  22. Как обеспечить высокую доступность приложения в Kubernetes?
  23. Чем отличаются labels от annotations и какую роль они играют?
  24. Какие существуют пробы и у pod, в каком порядке они срабатывают и зачем нужны?
  25. Каким образом Service распределяет трафик между pod?
  26. В чем разница между egress и ingress?
  27. Gateway API заменит ingress, почему? Чем он лучше?
  28. Какой путь трафика от пользователя до приложения в контейнере, если мы говорим про Kubernetes кластер?
  29. Какие есть варианты масштабирования pod в Kubernetes с примерами?
  30. Какие основные принципы RBAC, зачем это нужно?
  31. Как с помощью RBAC разрешить разработчику управлять только Deployment и Pods в неймспейсе dev, но запретить доступ к Secrets и другим неймспейсам?

Первое задание. Развертывание и масштабирование веб-приложения с мониторингом

Цель: Продемонстрировать умение работать с базовыми ресурсами Kubernetes (Deployment, Service, Ingress), настраивать пробы, автомасштабирование и диагностировать проблемы.

Шаги:

  1. Развертывание приложения:
    • Создайте Deployment для веб-приложения (например, Nginx или пользовательского образа), указав requests/limits для CPU и памяти.
    • Добавьте readiness- и liveness-пробы по HTTP-запросу к /healthz.
    • Создайте Service типа ClusterIP для доступа к подам.
    • Настройте Ingress для внешнего доступа (можно использовать Minikube с дополнением ingress или облачный провайдер).
  2. Горизонтальное автомасштабирование (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").
  3. Диагностика:
    • Сымитируйте ошибку в readiness-пробе (например, измените путь на несуществующий) и проверьте, как Kubernetes обрабатывает недоступные поды.
    • Используйте kubectl describe, kubectl logs и kubectl exec для анализа состояния подов.

Проверка:

Второе задание. StatefulSet для базы данных с PersistentVolume и RBAC

Цель: Показать навыки работы с StatefulSet, PersistentVolume, Headless Service и настройкой прав доступа через RBAC.

Шаги:

  1. StatefulSet и PersistentVolume:
    • Разверните StatefulSet для MongoDB или Redis с репликацией (3 реплики).
    • Настройте PersistentVolume (можно использовать storageClassName: standard в Minikube или облачном провайдере).
    • Создайте Headless Service для управления сетевым взаимодействием между репликами.
  2. Безопасность через RBAC:
    • Создайте ServiceAccount с ограниченными правами (например, разрешить только get и list для Pods в определенном неймспейсе).
    • Настройте Role и RoleBinding для этого ServiceAccount.
    • Проверьте ограничения, запустив под с этим ServiceAccount и попытавшись выполнить запрещенные действия (например, удалить Pod).
  3. Тестирование отказоустойчивости:
    • Удалите одну из реплик StatefulSet и убедитесь, что Kubernetes автоматически воссоздает её с тем же сетевым идентификатором и томом.
    • Проверьте сохранность данных после перезапуска пода.

Проверка: