- Подготовить облачную инфраструктуру на базе облачного провайдера Яндекс.Облако.
- Запустить и сконфигурировать Kubernetes кластер.
- Установить и настроить систему мониторинга.
- Настроить и автоматизировать сборку тестового приложения с использованием Docker-контейнеров.
- Настроить CI для автоматической сборки и тестирования.
- Настроить CD для автоматического развёртывания приложения.
Для начала необходимо подготовить облачную инфраструктуру в ЯО при помощи Terraform.
Особенности выполнения:
- Бюджет купона ограничен, что следует иметь в виду при проектировании инфраструктуры и использовании ресурсов;
- Следует использовать последнюю стабильную версию Terraform.
Предварительная подготовка к установке и запуску Kubernetes кластера.
- Создайте сервисный аккаунт, который будет в дальнейшем использоваться Terraform для работы с инфраструктурой с необходимыми и достаточными правами. Не стоит использовать права суперпользователя
- Подготовьте backend для Terraform:
а. Рекомендуемый вариант: Terraform Cloud
б. Альтернативный вариант: S3 bucket в созданном ЯО аккаунте - Настройте workspaces
а. Рекомендуемый вариант: создайте два workspace: stage и prod. В случае выбора этого варианта все последующие шаги должны учитывать факт существования нескольких workspace.
б. Альтернативный вариант: используйте один workspace, назвав его stage. Пожалуйста, не используйте workspace, создаваемый Terraform-ом по-умолчанию (default). - Создайте VPC с подсетями в разных зонах доступности.
- Убедитесь, что теперь вы можете выполнить команды
terraform destroy
иterraform apply
без дополнительных ручных действий. - В случае использования Terraform Cloud в качестве backend убедитесь, что применение изменений успешно проходит, используя web-интерфейс Terraform cloud.
Ожидаемые результаты:
- Terraform сконфигурирован и создание инфраструктуры посредством Terraform возможно без дополнительных ручных действий.
- Полученная конфигурация инфраструктуры является предварительной, поэтому в ходе дальнейшего выполнения задания возможны изменения.
На этом этапе необходимо создать 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
отрабатывает без ошибок.
Для перехода к следующему этапу необходимо подготовить тестовое приложение, эмулирующее основное приложение разрабатываемое вашей компанией.
Способ подготовки:
- Рекомендуемый вариант:
а. Создайте отдельный git репозиторий с простым nginx конфигом, который будет отдавать статические данные.
б. Подготовьте Dockerfile для создания образа приложения. - Альтернативный вариант:
а. Используйте любой другой код, главное, чтобы был самостоятельно создан Dockerfile.
Ожидаемый результат:
- Git репозиторий с тестовым приложением и Dockerfile.
- Регистр с собранным docker image. В качестве регистра может быть DockerHub или Yandex Container Registry, созданный также с помощью terraform.
Уже должны быть готовы конфигурации для автоматического создания облачной инфраструктуры и поднятия Kubernetes кластера.
Теперь необходимо подготовить конфигурационные файлы для настройки нашего Kubernetes кластера.
Цель:
- Задеплоить в кластер prometheus, grafana, alertmanager, экспортер основных метрик Kubernetes.
- Задеплоить тестовое приложение, например, nginx сервер отдающий статическую страницу.
Рекомендуемый способ выполнения:
- Воспользовать пакетом kube-prometheus, который уже включает в себя Kubernetes оператор для grafana, prometheus, alertmanager и node_exporter. При желании можете собрать все эти приложения отдельно.
- Для организации конфигурации использовать qbec, основанный на jsonnet. Обратите внимание на имеющиеся функции для интеграции helm конфигов и helm charts
- Если на первом этапе вы не воспользовались Terraform Cloud, то задеплойте в кластер atlantis для отслеживания изменений инфраструктуры.
Альтернативный вариант:
- Для организации конфигурации можно использовать helm charts
Ожидаемый результат:
- Git репозиторий с конфигурационными файлами для настройки Kubernetes.
- Http доступ к web интерфейсу grafana.
- Дашборды в grafana отображающие состояние Kubernetes кластера.
- Http доступ к тестовому приложению.
Осталось настроить ci/cd систему для автоматической сборки docker image и деплоя приложения при изменении кода.
Цель:
- Автоматическая сборка docker образа при коммите в репозиторий с тестовым приложением.
- Автоматический деплой нового docker образа.
Можно использовать teamcity, jenkins либо gitlab ci
Ожидаемый результат:
- Интерфейс ci/cd сервиса доступен по http.
- При любом коммите в репозиторие с тестовым приложением происходит сборка и отправка в регистр Docker образа.
- При создании тега (например, v1.0.0) происходит сборка и отправка с соответствующим label в регистр, а также деплой соответствующего Docker образа в кластер Kubernetes.
- Репозиторий с конфигурационными файлами Terraform и готовность продемонстрировать создание всех ресурсов с нуля.
- Пример pull request с комментариями созданными atlantis'ом или снимки экрана из Terraform Cloud.
- Репозиторий с конфигурацией ansible, если был выбран способ создания Kubernetes кластера при помощи ansible.
- Репозиторий с Dockerfile тестового приложения и ссылка на собранный docker image.
- Репозиторий с конфигурацией Kubernetes кластера.
- Ссылка на тестовое приложение и веб интерфейс Grafana с данными доступа.
- Все репозитории рекомендуется хранить на одном ресурсе (github, gitlab)
Что поможет решить большинство частых проблем:
- Попробовать найти ответ сначала самостоятельно в интернете или в материалах курса и ДЗ и только после этого спрашивать у дипломного руководителя. Скилл поиска ответов пригодится вам в профессиональной деятельности.
- Если вопросов больше одного, то присылайте их в виде нумерованного списка. Так дипломному руководителю будет проще отвечать на каждый из них.
- При необходимости прикрепите к вопросу скриншоты и стрелочкой покажите, где не получается.
Что может стать источником проблем:
- Вопросы вида «Ничего не работает. Не запускается. Всё сломалось». Дипломный руководитель не сможет ответить на такой вопрос без дополнительных уточнений. Цените своё время и время других.
- Откладывание выполнения курсового проекта на последний момент.
- Ожидание моментального ответа на свой вопрос. Дипломные руководители работающие разработчики, которые занимаются, кроме преподавания, своими проектами. Их время ограничено, поэтому постарайтесь задавать правильные вопросы, чтобы получать быстрые ответы :)
Все действия будут производиться на домашней машине с ArchLinux.
Для начала подготовим системные переменные для Yandex Cloud и Gitlab:
export YC_STORAGE_ACCESS_KEY="XXXXXXXXXXXXXX-XXXXXXXXXX"
export YC_STORAGE_SECRET_KEY="XXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
export YC_SERVICE_ACCOUNT_KEY_FILE="/home/wizard/.yckey.json"
export GITLAB_PRIVATE_TOKEN="xxxxx-XXXXXXXXXXXXXXXXXXXX"
export GITLAB_AGENT_TOKEN="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Создадим руками через web-интерфейс YC s3 backet и проинициализируем terraform backend:
terraform init -backend-config "access_key=$YC_STORAGE_ACCESS_KEY" -backend-config "secret_key=$YC_STORAGE_SECRET_KEY"
Напишем манифесты для terraform
Подключимся к app.terraform.io
через анонимный прокси, настроим там наш репозиторий с терраформом и проверим как всё само работает:
Установим kubespray и напишем скрипт, который будет генерировать hosts.yaml (инвентори для kubespray) из развернутой terraform-ом инфраструктуры.
Напишем скрипты (1, 2), которые будут:
- подготавливать инвентори для kubespray из шаблона,
- копировать сгенерированный
hosts.yaml
в созданный инвентори, - включать поддержку ingress-controller,
- менять имя кластера,
- создавать кластер K8S с помощью kubespray,
- копировать
.kube/config
с control plane созданного kubespray кластера в локальный каталог для использования с kubectl, - копировать
.kube/config
с control plane созданного kubespray кластера в переменную в gitlab для использования в pipeline с qbec и kubectl, - подключаться к кластеру K8S, смотреть, что всё работает, поды есть,
- устанавливать
kube-prometheus
, - устанавливать
gitlab agent
в кластер, - создавать qbec манифест тестового приложения из шаблона,
- создавать namespace в K8S с тем же именем что и
terraform workspace
, - применять манифест
qbec
в кластер K8S в соответствующееnamespace
, - смотреть, что
pod
с тестовым приложением задеплоился, - выводить в финале адреса ресурсов кластера.
Запустим стартовый скрипт setup_k8s.sh, будем ждать и любоваться как поднимается инфраструктура, кластер, деплоятся приложения и т.д.:
Сходим на Yandex Cloud, посмотрим на поднявшуюся инфраструктуру:
Подключимся к свежеподнятому K8S кластеру (с которого скрипт любезно достал .kube/config
и указал его как KUBECONFIG
чтобы у нас подключение происходило куда нужно) и посмотрим на него:
У нас в кластер и наше тестовое приложение задеплоилось:
И kube-prometheus
уже работает:
Поменяем что-нибудь в репозитории с нашим тестовым приложением и посмотрим, как на gitlab
отработает pipeline
, соберет новый docker image
и задеплоит приложение в кластер:
Тестовое приложение доступно по адресу: http://pirozhkov-aa.ru
К Grafana
можно подключиться по ссылке: http://k8s.pirozhkov-aa.ru с логином: admin
и паролем: ADMIN123456!
Репозиторий тестового приложения: https://gitlab.com/tabwizard/nginxn
Docker image для тестового приложения
Репозиторий и Docker image для деплоя тестового приложения в gitlab pipeline
Репозиторий qbec
с настройками для кластера: webtestapp
Репозиторий Terraform
Репозиторий kubespray
полностью дефолтный за исключением нескольких файлов инвентори для kubespray