Дипломный практикум в Cloud: Amazon Web Services"

Цели:

  1. Подготовить облачную инфраструктуру на базе облачного провайдера AWS.
  2. Запустить и сконфигурировать Kubernetes кластер.
  3. Установить и настроить систему мониторинга.
  4. Настроить и автоматизировать сборку тестового приложения с использованием Docker-контейнеров.
  5. Настроить CI для автоматической сборки и тестирования.
  6. Настроить CD для автоматического развёртывания приложения.

Этапы выполнения:

Создание облачной инфраструктуры

Для начала необходимо подготовить облачную инфраструктуру в облаке AWS при помощи Terraform.

Особенности выполнения:

  • Для выполнения задания следует активировать купон AWS, полученный от координатора курса;
  • Бюджет купона ограничен, что следует иметь в виду при проектировании инфраструктуры и использовании ресурсов;
  • Следует использовать последнюю стабильную версию Terraform.

Предварительная подготовка к установке и запуску Kubernetes кластера.

  1. При помощи IAM создайте service account, который будет в дальнейшем использоваться Terraform для работы с инфраструктурой.
  2. Подготовьте backend для Terraform:
    1. Рекомендуемый вариант: Terraform Cloud
    2. Альтернативный вариант: S3 bucket в созданном AWS аккаунте
  3. Настройте workspaces
    1. Рекомендуемый вариант: создайте два workspace: stage и prod. В случае выбора этого варианта все последующие шаги должны учитывать факт существования нескольких workspace.
    2. Альтернативный вариант: используйте один workspace, назвав его stage. Пожалуйста, не используйте workspace, создавайемый Terraform-ом по-умолчанию (default).
  4. Создайте VPC при помощи готового модуля от AWS.
  5. При помощи Terraform подготовьте как минимум 3 виртуальных машины EC2 для создания Kubernetes-кластера. Выберите тип виртуальной машины самостоятельно с учётом требовании к производительности и стоимости. Если в дальнейшем поймете, что необходимо сменить тип инстанса, используйте Terraform для внесения изменений.
  6. Во время выполнения также понадобится создать security groups и некоторые другие ресурсы.
  7. Следует учитывать, что доступ к EC2 должен быть возможен через Интернет, а не только по локальной сети.
  8. Убедитесь, что теперь вы можете выполнить команды terraform destroy и terraform apply без дополнительных ручных действий.
  9. В случае использования Terraform Cloud в качестве backend убедитесь, что применение изменений успешно проходит, используя web-интерфейс Terraform cloud.

Ожидаемые результаты:

  1. Terraform сконфигурирован и создание инфраструктуры посредством Terraform возможно без дополнительных ручных действий.
  2. Полученная конфигурация инфраструктуры является предварительной, поэтому в ходе дальнейшего выполнения задания возможны изменения.

Создание Kubernetes кластера

На этом этапе необходимо создать Kubernetes кластер на базе предварительно созданной инфрастуктуры.

Это можно сделать двумя способами:

  1. Рекомендуемый вариант: самостоятельная установка Kubernetes кластера.
    1. подготовить ansible конфигурации, можно воспользоваться, например Kubespray
    2. задеплоить Kubernetes на подготовленные ранее ec2 инстансы, в случае нехватки каких-либо ресурсов вы всегда можете создать их при помощи Terraform.
  2. Альтернативый вариант: воспользуйтесь сервисом EKS (Amazon Elastic Kubernetes Service)
    1. воспользуйте модулем terraform-aws-eks
    2. дополните уже существующую Terraform конфигурацию, новый проект создавать не нужно.

Ожидаемый результат:

  1. Работоспособный Kubernetes кластер.
  2. В файле ~/.kube/config находятся данные для доступа к кластеру.
  3. Команда kubectl get pods --all-namespaces отрабатывает без ошибок.

Создание тестового приложения

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

Способ подготовки:

  1. Рекомендуемый вариант:
    1. Создайте отдельный git репозиторий с простым nginx конфигом, который будет отдавать статические данные.
    2. Подготовьте Dockerfile для создания образа приложения.
  2. Альтернативный вариант:
    1. Используйте любой другой код, главное, чтобы был самостоятельно создан Dockerfile.

Ожидаемый результат:

  1. Git репозиторий с тестовым приложением и Dockerfile.
  2. Dockerhub регистр с собранным docker image.

Подготовка Kubernetes конфигурации

Уже должны быть готовы конфигурации для автоматического создания облачной инфраструктуры и поднятия Kubernetes кластера.
Теперь необходимо подготовить конфигурационные файлы для настройки нашего Kubernetes кластера.

Цель:

  1. Задеплоить в кластер prometheus, grafana, alertmanager, экспортет основных метрик Kubernetes.
  2. Задеплоить тестовое приложение, например nginx сервер отдающий статическую страницу.

Рекомендуемые способ выполнения:

  1. Воспользовать пакетом kube-prometheus, который уже включает в себя Kubernetes оператор для grafana, prometheus, alertmanager и node_exporter. При желании можете собрать все эти приложения отдельно.
  2. Для организации конфигурации использовать qbec, основанный на jsonnet. Обратите внимание на имеющиеся функции для интеграции helm конфигов и helm charts
  3. Если на первом этапе вы не воспользовались Terraform Cloud, то задеплойте в кластер atlantis для отслеживания изменений инфраструктуры.

Альтернативный вариант:

  1. Для организации конфигурации можно использовать helm charts

Ожидаемый результат:

  1. Git репозиторий с конфигурационными файлами для настройки Kubernetes.
  2. Http доступ к web интерфейсу grafana.
  3. Дашборды в grafana отображающие состояние Kubernetes кластера.
  4. Http доступ к тестовому приложению.

Установка и настройка CI/CD

Осталось настроить ci/cd систему для автоматической сборки docker image и деплоя приложения при изменении кода.

Цель:

  1. Автоматическая сборка docker образа при коммите в репозиторий с тестовым приложением.
  2. Автоматический деплой нового docker образа.

Можно использовать teamcity, jenkins либо gitlab ci

Ожидаемый результат:

  1. Интерфейс ci/cd сервиса доступен по http.
  2. При любом коммите в репозиторий с тестовым приложением происходит сборка и отправка в регистр Docker образа.
  3. При создании тега в репозитории происходит деплой соответсвующего Docker образа.

Что необходимо для сдачи задания?

  1. Репозиторий с конфигурационными файлами Terraform и готовность продемонстировать создание всех рессурсов с нуля.
  2. Пример pull request с комментариями созданными atlantis'ом или снимки экрана из Terraform Cloud.
  3. Репозиторий с конфигурацией ansible, если был выбран способ создания Kubernetes кластера при помощи ansible.
  4. Репозиторий с Dockerfile тестового приложения и ссылка на собранный docker image.
  5. Репозиторий с конфигурацией Kubernetes кластера.
  6. Ссылка на тестовое приложение и веб интерфейс Grafana с данными доступа.

Выполнение работы.

Создание облачной инфраструктуры

  1. Создала репозиторий с конфигурационными файлами Terraform: https://github.com/Marinakrivitskaya/devops-diplom/tree/main/terraform

  2. Убедилась, что команды terraform destroy и terraform apply работают:

terraform destroy

  1. Изменения проходят успешно , используя web-интерфейс Terraform cloud:

Screenshot 2021-11-09 at 19 53 54

Screenshot 2021-11-09 at 20 06 20

Создание Kubernetes кластера

  1. Создала кластер 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 

Screenshot 2021-11-10 at 22 14 20

Создание тестового приложения

  1. Подготовила тестовое приложение, на Gitlab
  2. Dockerfile для создания образа приложения:
FROM nginx:latest
COPY html /var/www/html
COPY nginx.conf /etc/nginx/nginx.conf

gitlab

Screenshot 2021-11-29 at 13 22 53

Screenshot 2021-11-29 at 13 53 46

Ссылка на тестовое приложение

http://3.144.88.123:8090/

Создание Kubernetes кластера

  1. Репозиторий с конфигурацией 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/

prometheus

Ссылка на веб интерфейс Grafana:

URL: http://3.144.88.123:30000
user: admin
password: admin

Screenshot 2021-11-29 at 13 36 28

Что необходимо для сдачи задания?

  1. Репозиторий с конфигурационными файлами Terraform

  2. Пример pull request с комментариями созданными atlantis'ом или снимки экрана из Terraform Cloud.

Screenshot 2021-11-09 at 19 53 54

Screenshot 2021-11-09 at 20 06 20

  1. Репозиторий с конфигурацией ansible, если был выбран способ создания Kubernetes кластера при помощи ansible.

  2. Ссылка на тестовое приложение и ссылка на Docker образ

  3. Репозиторий с конфигурацией Kubernetes кластера.

  4. Ссылка на веб интерфейс Grafana с данными доступа.