- Подготовить облачную инфраструктуру на базе облачного провайдера AWS.
- Запустить и сконфигурировать Kubernetes кластер.
- Установить и настроить систему мониторинга.
- Настроить и автоматизировать сборку тестового приложения с использованием Docker-контейнеров.
- Настроить CI для автоматической сборки и тестирования.
- Настроить CD для автоматического развёртывания приложения.
Для начала необходимо подготовить облачную инфраструктуру в облаке AWS при помощи Terraform.
Особенности выполнения:
- Для выполнения задания следует активировать купон AWS, полученный от координатора курса;
- Бюджет купона ограничен, что следует иметь в виду при проектировании инфраструктуры и использовании ресурсов;
- Следует использовать последнюю стабильную версию Terraform.
Предварительная подготовка к установке и запуску Kubernetes кластера.
- При помощи IAM создайте service account, который будет в дальнейшем использоваться Terraform для работы с инфраструктурой.
- Подготовьте backend для Terraform:
- Рекомендуемый вариант: Terraform Cloud
- Альтернативный вариант: S3 bucket в созданном AWS аккаунте
- Настройте workspaces
- Рекомендуемый вариант: создайте два workspace: stage и prod. В случае выбора этого варианта все последующие шаги должны учитывать факт существования нескольких workspace.
- Альтернативный вариант: используйте один workspace, назвав его stage. Пожалуйста, не используйте workspace, создавайемый Terraform-ом по-умолчанию (default).
- Создайте VPC при помощи готового модуля от AWS.
- При помощи Terraform подготовьте как минимум 3 виртуальных машины EC2 для создания Kubernetes-кластера. Выберите тип виртуальной машины самостоятельно с учётом требовании к производительности и стоимости. Если в дальнейшем поймете, что необходимо сменить тип инстанса, используйте Terraform для внесения изменений.
- Во время выполнения также понадобится создать security groups и некоторые другие ресурсы.
- Следует учитывать, что доступ к EC2 должен быть возможен через Интернет, а не только по локальной сети.
- Убедитесь, что теперь вы можете выполнить команды
terraform destroy
иterraform apply
без дополнительных ручных действий. - В случае использования Terraform Cloud в качестве backend убедитесь, что применение изменений успешно проходит, используя web-интерфейс Terraform cloud.
Ожидаемые результаты:
- Terraform сконфигурирован и создание инфраструктуры посредством Terraform возможно без дополнительных ручных действий.
- Полученная конфигурация инфраструктуры является предварительной, поэтому в ходе дальнейшего выполнения задания возможны изменения.
На этом этапе необходимо создать Kubernetes кластер на базе предварительно созданной инфрастуктуры.
Это можно сделать двумя способами:
- Рекомендуемый вариант: самостоятельная установка Kubernetes кластера.
- Альтернативый вариант: воспользуйтесь сервисом EKS (Amazon Elastic Kubernetes Service)
- воспользуйте модулем terraform-aws-eks
- дополните уже существующую Terraform конфигурацию, новый проект создавать не нужно.
Ожидаемый результат:
- Работоспособный Kubernetes кластер.
- В файле
~/.kube/config
находятся данные для доступа к кластеру. - Команда
kubectl get pods --all-namespaces
отрабатывает без ошибок.
Для перехода к следующему этапу необходимо подготовить тестовое приложение, эмулирующее основное приложение разрабатываемое вашей компанией.
Способ подготовки:
- Рекомендуемый вариант:
- Создайте отдельный git репозиторий с простым nginx конфигом, который будет отдавать статические данные.
- Подготовьте Dockerfile для создания образа приложения.
- Альтернативный вариант:
- Используйте любой другой код, главное, чтобы был самостоятельно создан Dockerfile.
Ожидаемый результат:
- Git репозиторий с тестовым приложением и Dockerfile.
- Dockerhub регистр с собранным docker image.
Уже должны быть готовы конфигурации для автоматического создания облачной инфраструктуры и поднятия 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 образа.
- При создании тега в репозитории происходит деплой соответсвующего Docker образа.
- Репозиторий с конфигурационными файлами Terraform и готовность продемонстировать создание всех рессурсов с нуля.
- Пример pull request с комментариями созданными atlantis'ом или снимки экрана из Terraform Cloud.
- Репозиторий с конфигурацией ansible, если был выбран способ создания Kubernetes кластера при помощи ansible.
- Репозиторий с Dockerfile тестового приложения и ссылка на собранный docker image.
- Репозиторий с конфигурацией Kubernetes кластера.
- Ссылка на тестовое приложение и веб интерфейс Grafana с данными доступа.
-
Создала репозиторий с конфигурационными файлами Terraform: https://github.com/Marinakrivitskaya/devops-diplom/tree/main/terraform
-
Убедилась, что команды
terraform destroy
иterraform apply
работают:
- Изменения проходят успешно , используя web-интерфейс Terraform cloud:
- Создала кластер Kubernetes, при помощи Ansible. Inventory файл: https://github.com/Marinakrivitskaya/devops-diplom/blob/main/ansible/inventory.ini
pip3 install -r requirements.txt
ansible-playbook -i kubespray/inventory/mycluster/inventory.ini kubespray/cluster.yml -u ubuntu --ask-pass -b --ask-become-pass
- Подготовила тестовое приложение, на Gitlab
- Dockerfile для создания образа приложения:
FROM nginx:latest
COPY html /var/www/html
COPY nginx.conf /etc/nginx/nginx.conf
Ссылка на тестовое приложение
http://3.144.88.123:8090/
- Репозиторий с конфигурацией Kubernetes кластера
git clone https://github.com/Marinakrivitskaya/kube-prometheus.git
cd kube-prometheus
kubectl create -f manifests/setup
until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
kubectl create -f manifests/
Ссылка на веб интерфейс Grafana:
URL: http://3.144.88.123:30000
user: admin
password: admin
-
Репозиторий с конфигурационными файлами Terraform
-
Пример pull request с комментариями созданными atlantis'ом или снимки экрана из Terraform Cloud.
-
Репозиторий с конфигурацией ansible, если был выбран способ создания Kubernetes кластера при помощи ansible.
-
Ссылка на тестовое приложение и ссылка на Docker образ
-
Репозиторий с конфигурацией Kubernetes кластера.
-
Ссылка на веб интерфейс Grafana с данными доступа.