- Подготовить облачную инфраструктуру на базе облачного провайдера Яндекс.Облако.
- Запустить и сконфигурировать Kubernetes кластер.
- Установить и настроить систему мониторинга.
- Настроить и автоматизировать сборку тестового приложения с использованием Docker-контейнеров.
- Настроить CI для автоматической сборки и тестирования.
- Настроить CD для автоматического развёртывания приложения.
- Репозиторий с конфигурационными файлами Terraform и готовность продемонстрировать создание всех ресурсов с нуля.
- Пример pull request с комментариями созданными atlantis'ом или снимки экрана из Terraform Cloud или вашего CI-CD-terraform pipeline.
- Репозиторий с конфигурацией ansible, если был выбран способ создания Kubernetes кластера при помощи ansible.
- Репозиторий с Dockerfile тестового приложения и ссылка на собранный docker image.
- Репозиторий с конфигурацией Kubernetes кластера.
- Ссылка на тестовое приложение и веб интерфейс Grafana с данными доступа.
- Все репозитории рекомендуется хранить на одном ресурсе (github, gitlab)
- Репозиторий с конфигурационными файлами Terraform: smutosey/devops-diplom-infra
- Prepare - предварительная подготовка облака, выполняется вручную. Создает terraform remote s3 backend и service account с ограниченными правами.
- Production - инфраструктура для дипломного задания, создается автоматически через GitHub Actions. Создает инфраструктуру, кластер k8s через Kubespray и через helm деплоит kube-prometheus-stack
- Создание инфраструктуры и кластера с 0: ссылка
Latest run с изменениями кластера: ссылка - Репозиторий с тестовым приложением: smutosey/devops-diplom-app
- Dockerfile
- Конструктор сайта - Hugo
- Сборка и деплой - Werf + GitHub Actions
- Ссылки на сервисы:
- https://app.smutosey.ru/ - развернутое тестовое приложение
- https://grafana.smutosey.ru - веб-интерфейс Grafana
- https://prometheus.smutosey.ru - веб-интерфейс Prometheus
- https://alertmanager.smutosey.ru - веб-интерфейс Alertmanager
- https://atlantis.smutosey.ru - веб-интерфейс Atlantis (был настроен, но не используется по назначению, legacy)
Задачи этапа:
Для начала необходимо подготовить облачную инфраструктуру в ЯО при помощи Terraform.
Особенности выполнения:
- Бюджет купона ограничен, что следует иметь в виду при проектировании инфраструктуры и использовании ресурсов; Для облачного k8s используйте региональный мастер(неотказоустойчивый). Для self-hosted k8s минимизируйте ресурсы ВМ и долю ЦПУ. В обоих вариантах используйте прерываемые ВМ для worker nodes.
Предварительная подготовка к установке и запуску Kubernetes кластера.
- Создайте сервисный аккаунт, который будет в дальнейшем использоваться Terraform для работы с инфраструктурой с необходимыми и достаточными правами. Не стоит использовать права суперпользователя
- Подготовьте backend для Terraform:
а. Рекомендуемый вариант: S3 bucket в созданном ЯО аккаунте(создание бакета через TF) б. Альтернативный вариант: Terraform Cloud- Создайте VPC с подсетями в разных зонах доступности.
- Убедитесь, что теперь вы можете выполнить команды
terraform destroy
иterraform apply
без дополнительных ручных действий.- В случае использования Terraform Cloud в качестве backend убедитесь, что применение изменений успешно проходит, используя web-интерфейс Terraform cloud.
Ожидаемые результаты:
- Terraform сконфигурирован и создание инфраструктуры посредством Terraform возможно без дополнительных ручных действий.
- Полученная конфигурация инфраструктуры является предварительной, поэтому в ходе дальнейшего выполнения задания возможны изменения.
Репозиторий с конфигурацией: smutosey/devops-diplom-infra
-
Написана конфигурация Terraform для подготовки к созданию инфраструктуры (prepare).
На этом этапе создаем s3 Object Storage, bucket, и обеспечиваем блокировку состояний Terraform через таблицу dynamodb.
Также создаем сервисный аккаунтterraform-sa
с только необходимыми правами, перечень можно найти в prepare/public.auto.tfvars
Этап выполняется вручную, через terraform apply локально. В результате получаем ключи для подключения, которые затем переводим в base64 и складываем в секреты GitHub для следующих этапов.
-
Написана конфигурация Terraform для создания основной инфраструктуры (production).
Создается автоматически через GitHub Actions. Джобы в workflow:- infra - создание инфрастуктуры через Terraform, state храним в s3 remote backend
- k8s-cluster - создание кластера k8s
- Кластер k8s создается в этом же workflow через kubespray. Здесь же деплоится система мониторинга (kube-prometheus-stack) и atlantis через helm (по назначению не используется).
Пример Job-а с полным созданием инфраструктуры: https://github.com/smutosey/devops-diplom-infra/actions/runs/10098033490/job/27941660024 Также есть первый вариант создания инфрастуктуры и k8s-кластера вручную, без CI/CD, в отдельной ветке репозитория
Подробнее про инфраструктуру.
- VPC с подсетями для нод k8s в разных зонах доступности, а также отдельная public-подсеть.
- 3 control-ноды, 3 worker-ноды, и 1 NAT-инстанс, который также является джампером для доступа по 22 порту. Т.е. все ноды кластера K8S не будут иметь публичного IP для безопасности.
- Network load balancer - для балансировки доступа к control-plane нодам кластера.
- Application load balancer - для роутинга по доменам, доступ к приложениям в кластере, а также терминация TLS-соединения с ранее выпущенным сертификатом.
- Создание DNS-записей в зоне доступности.
- Группы безопасности и правила ingress/egress.
- Container Registry и репозиторий в нём для тестового приложения.
- Все параметры инфраструктуры регулируются через переменные и секреты.
- В результате генерируем
inventory.yaml
для дальнейшего запуска Kubespray.
Созданные ресурсы в Yandex Cloud:
Схема Application Load Balancer:
Создание инфраструктуры и кластера с 0: ссылка
Latest run с изменениями кластера: ссылка
Задачи этапа:
На этом этапе необходимо создать Kubernetes кластер на базе предварительно созданной инфраструктуры. Требуется обеспечить доступ к ресурсам из Интернета.
Это можно сделать двумя способами:
- Рекомендуемый вариант: самостоятельная установка Kubernetes кластера.
а. При помощи Terraform подготовить как минимум 3 виртуальных машины Compute Cloud для создания Kubernetes-кластера. Тип виртуальной машины следует выбрать самостоятельно с учётом требований к производительности и стоимости. Если в дальнейшем поймете, что необходимо сменить тип инстанса, используйте Terraform для внесения изменений.
б. Подготовить ansible конфигурации, можно воспользоваться, например Kubespray
в. Задеплоить Kubernetes на подготовленные ранее инстансы, в случае нехватки каких-либо ресурсов вы всегда можете создать их при помощи Terraform.- Альтернативный вариант: воспользуйтесь сервисом Yandex Managed Service for Kubernetes
а. С помощью terraform resource для kubernetes создать региональный мастер kubernetes с размещением нод в разных 3 подсетях
б. С помощью terraform resource для kubernetes node groupОжидаемый результат:
- Работоспособный Kubernetes кластер.
- В файле
~/.kube/config
находятся данные для доступа к кластеру.- Команда
kubectl get pods --all-namespaces
отрабатывает без ошибок.
Установка выполняется с помощью Kubespray. Изначально, когда разворачивание было вручную, запуск kubespray был через terraform одним из ресурсов terraform_data
c local-exec
-провайдером.
После реализации GitHub Actions это происходит в отдельной джобе k8s-cluster
в стандартном workflow.
inventory
генерируется на предыдущем этапе при создании инфраструктуры. Шаблон: production/templates/inventory.yml.tftpl
Параметры для kubespray: production/ansible/group_vars
Пример создания кластера: run
Выполнение kubectl --kubeconfig ./ansible/artifacts/admin.conf get pods -A -o wide
:
При автоматическом развертывании kube config нужно доставать с нод вручную, т.к. в артефакты его класть небезопасно для публичных репозиториев.
Для сборки в репозитории прописаны секреты:
Задачи этапа:
Для перехода к следующему этапу необходимо подготовить тестовое приложение, эмулирующее основное приложение разрабатываемое вашей компанией.
Способ подготовки:
- Рекомендуемый вариант:
а. Создайте отдельный git репозиторий с простым nginx конфигом, который будет отдавать статические данные.
б. Подготовьте Dockerfile для создания образа приложения.- Альтернативный вариант:
а. Используйте любой другой код, главное, чтобы был самостоятельно создан Dockerfile.Ожидаемый результат:
- Git репозиторий с тестовым приложением и Dockerfile.
- Регистри с собранным docker image. В качестве регистри может быть DockerHub или Yandex Container Registry, созданный также с помощью terraform.
Репозиторий с тестовым приложением: smutosey/devops-diplom-app
Представляет собой статический сайт, генерируемый при сборке через конструктор Hugo, параметры: smutosey.ru/hugo.yaml
Приложение собирается в образ, smutosey.ru/Dockerfile на основе nginx.
Сборка и деплой осуществляется с помощью Werf + GitHub Actions. Собранный образ размещается в YC registry:
Задачи этапа:
Уже должны быть готовы конфигурации для автоматического создания облачной инфраструктуры и поднятия Kubernetes кластера.
Теперь необходимо подготовить конфигурационные файлы для настройки нашего Kubernetes кластера.Цель:
- Задеплоить в кластер prometheus, grafana, alertmanager, экспортер основных метрик Kubernetes.
- Задеплоить тестовое приложение, например, nginx сервер отдающий статическую страницу.
Способ выполнения:
- Воспользоваться пакетом kube-prometheus, который уже включает в себя Kubernetes оператор для grafana, prometheus, alertmanager и node_exporter. Альтернативный вариант - использовать набор helm чартов от bitnami.
- Если на первом этапе вы не воспользовались Terraform Cloud, то задеплойте и настройте в кластере atlantis для отслеживания изменений инфраструктуры. Альтернативный вариант 3 задания: вместо Terraform Cloud или atlantis настройте на автоматический запуск и применение конфигурации terraform из вашего git-репозитория в выбранной вами CI-CD системе при любом комите в main ветку. Предоставьте скриншоты работы пайплайна из CI/CD системы.
Ожидаемый результат:
- Git репозиторий с конфигурационными файлами для настройки Kubernetes.
- Http доступ к web интерфейсу grafana.
- Дашборды в grafana отображающие состояние Kubernetes кластера.
- Http доступ к тестовому приложению.
Система мониторинга разворачивается вместе с деплоем инфраструктуры, через GitHub Actions + Helm actions, в отдельном джобе.
Используется Helm-chart prometheus-community/kube-prometheus-stack
Также в кластер деплоится Atlantis через Helm-chart. Изначально планировал настройку через него, но в процессе понял, что Atlantis в процессе может "сломать" сам себя, т.к. разворачивает кластер, где существует сам. Из соображений безопасности решил перенастроить на GitHub Actions - devops-diplom-infra/workflows/infra-deploy.yml. Workflow запускается при любом коммите в main-ветку.
Для разворачивания приложения в кластер подготовил шаблоны манифестов: devops-diplom-app/.helm/templates. Создается Deployment, Service и Ingress.
Пример успешного деплоя: https://github.com/smutosey/devops-diplom-infra/actions/runs/10098033490/job/27943055041
Развернутое приложение: https://app.smutosey.ru
Веб-интерфейс Grafana: https://grafana.smutosey.ru. В ней множество необходимых дашбордов для мониторинга k8s-кластера.
Prometheus: https://prometheus.smutosey.ru
Alertmanager: https://alertmanager.smutosey.ru
Atlantis: https://atlantis.smutosey.ru
Задачи этапа:
Осталось настроить ci/cd систему для автоматической сборки docker image и деплоя приложения при изменении кода.
Цель:
- Автоматическая сборка docker образа при коммите в репозиторий с тестовым приложением.
- Автоматический деплой нового docker образа.
Можно использовать teamcity, jenkins, GitLab CI или GitHub Actions.
Ожидаемый результат:
- Интерфейс ci/cd сервиса доступен по http.
- При любом коммите в репозиторие с тестовым приложением происходит сборка и отправка в регистр Docker образа.
- При создании тега (например, v1.0.0) происходит сборка и отправка с соответствующим label в регистри, а также деплой соответствующего Docker образа в кластер Kubernetes.
Для сборки и деплоя приложения решил использовать Werf, на основе GitHub Actions.
Создал 2 workflow:
-
build Запускается при любом коммите в любую ветку. Выполняется
werf cr
для аутентификации в Container Registry иwerf build
для сборки docker image и отправки в registry. Тег образа формируется исходя из содержимого слоев (фича werf). -
deploy Запускается при создании тега с семантическим версионированием (
v[0-9]+.[0-9]+.[0-9]+
). В джобе также выполняемwerf cr
и запускаем послеwerf converge
, который собирает образ, пушит в registry и выполняет деплой в k8s-кластер на основе манифестов в .helm/templates
Конфигурация для доступа в кластер лежит в секретах репозитория:
Запуски workflow можно посмотреть здесь: https://github.com/smutosey/devops-diplom-app/actions