From 913bfc8dabcb457228d6976ddae9ebae91ecc7a4 Mon Sep 17 00:00:00 2001 From: dannc Date: Mon, 13 Mar 2023 10:09:57 +0700 Subject: [PATCH] gw: add graduate work task description --- readme.md | 13 ++++ src/graduate_work/readme.md | 45 ++++++++++++ src/graduate_work/tasks.md | 136 ++++++++++++++++++++++++++++++++++++ 3 files changed, 194 insertions(+) create mode 100644 src/graduate_work/readme.md create mode 100644 src/graduate_work/tasks.md diff --git a/readme.md b/readme.md index e36e87d..a998d78 100644 --- a/readme.md +++ b/readme.md @@ -74,3 +74,16 @@ * [14.5. SecurityContext, NetworkPolicies](/src/homework/14-kubernetes-security/14.5) * [15.1. Организация сети](/src/homework/15-cloud-providers/15.1) * [15.2. Вычислительные мощности. Балансировщики нагрузки](/src/homework/15-cloud-providers/15.2) +* [15.3. Безопасность в облачных провайдерах](/src/homework/15-cloud-providers/15.3) + +## Graduate work + +[**Дипломная работа**](/src/graduate_work) + +## Related repositories + +* [Dannecron/netology-devops-ansible-lighthouse](https://github.com/Dannecron/netology-devops-ansible-lighthouse) +* [Dannecron/netology-devops-ansible-yandex-cloud-cvl](https://github.com/Dannecron/netology-devops-ansible-yandex-cloud-cvl) +* [Dannecron/netology-devops-ansible-vector](https://github.com/Dannecron/netology-devops-ansible-vector) +* [Dannecron/netology-devops-teamcity-example](https://github.com/Dannecron/netology-devops-teamcity-example) +* [Dannecron/netology-devops-gitlab](https://github.com/Dannecron/netology-devops-gitlab) diff --git a/src/graduate_work/readme.md b/src/graduate_work/readme.md new file mode 100644 index 0000000..7698585 --- /dev/null +++ b/src/graduate_work/readme.md @@ -0,0 +1,45 @@ +## Дипломная работа + +Выполнение дипломной работы курса netology DevOps инженер. Оригинал задания доступен по [ссылке](https://github.com/netology-code/devops-diplom-yandexcloud/blob/main/README.md). + +### Создание облачной инфраструктуры + +[Задание](./tasks.md#создание-облачной-инфраструктуры). + +/// todo + +--- + +### Создание Kubernetes кластера + +[Задание](./tasks.md#создание-Kubernetes-кластера). + +/// todo + +--- + +### Создание тестового приложения + +[Задание](./tasks.md#создание-тестового-приложения). + +[Репозиторий тестового приложения](https://github.com/Dannecron/parcel-example-neko) + +/// todo + +--- + +### Подготовка cистемы мониторинга и деплой приложения + +[Задание](./tasks.md#подготовка-cистемы-мониторинга-и-деплой-приложения). + +/// todo + +--- + +### Установка и настройка CI/CD + +[Задание](./tasks.md#установка-и-настройка-CI/CD). + +/// todo + +--- diff --git a/src/graduate_work/tasks.md b/src/graduate_work/tasks.md new file mode 100644 index 0000000..06a5140 --- /dev/null +++ b/src/graduate_work/tasks.md @@ -0,0 +1,136 @@ +## Цели + +* [Цели](#цели) +* [Этапы выполнения](#этапы-выполнения) + * [Создание облачной инфраструктуры](#создание-облачной-инфраструктуры) + * [Создание Kubernetes кластера](#создание-Kubernetes-кластера) + * [Создание тестового приложения](#создание-тестового-приложения) + * [Подготовка cистемы мониторинга и деплой приложения](#подготовка-cистемы-мониторинга-и-деплой-приложения) + * [Установка и настройка CI/CD](#установка-и-настройка-CI/CD) +* [Что необходимо для сдачи задания?](#что-необходимо-для-сдачи-задания) + +## Этапы выполнения + +### Создание облачной инфраструктуры + +Для начала необходимо подготовить облачную инфраструктуру в ЯО при помощи [Terraform](https://www.terraform.io/). + +Особенности выполнения: + +- Бюджет купона ограничен, что следует иметь в виду при проектировании инфраструктуры и использовании ресурсов; +- Следует использовать последнюю стабильную версию [Terraform](https://www.terraform.io/). + +Предварительная подготовка к установке и запуску Kubernetes кластера. + +1. Создайте сервисный аккаунт, который будет в дальнейшем использоваться Terraform для работы с инфраструктурой с необходимыми и достаточными правами. Не стоит использовать права суперпользователя +2. Подготовьте [backend](https://www.terraform.io/docs/language/settings/backends/index.html) для Terraform: + а. Рекомендуемый вариант: [Terraform Cloud](https://app.terraform.io/) + б. Альтернативный вариант: S3 bucket в созданном ЯО аккаунте +3. Настройте [workspaces](https://www.terraform.io/docs/language/state/workspaces.html) + а. Рекомендуемый вариант: создайте два workspace: *stage* и *prod*. В случае выбора этого варианта все последующие шаги должны учитывать факт существования нескольких workspace. + б. Альтернативный вариант: используйте один workspace, назвав его *stage*. Пожалуйста, не используйте workspace, создаваемый Terraform-ом по-умолчанию (*default*). +4. Создайте VPC с подсетями в разных зонах доступности. +5. Убедитесь, что теперь вы можете выполнить команды `terraform destroy` и `terraform apply` без дополнительных ручных действий. +6. В случае использования [Terraform Cloud](https://app.terraform.io/) в качестве [backend](https://www.terraform.io/docs/language/settings/backends/index.html) убедитесь, что применение изменений успешно проходит, используя web-интерфейс Terraform cloud. + +Ожидаемые результаты: + +1. Terraform сконфигурирован и создание инфраструктуры посредством Terraform возможно без дополнительных ручных действий. +2. Полученная конфигурация инфраструктуры является предварительной, поэтому в ходе дальнейшего выполнения задания возможны изменения. + +--- + +### Создание Kubernetes кластера + +На этом этапе необходимо создать [Kubernetes](https://kubernetes.io/ru/docs/concepts/overview/what-is-kubernetes/) кластер на базе предварительно созданной инфраструктуры. Требуется обеспечить доступ к ресурсам из Интернета. + +Это можно сделать двумя способами: + +1. Рекомендуемый вариант: самостоятельная установка Kubernetes кластера. + а. При помощи Terraform подготовить как минимум 3 виртуальных машины Compute Cloud для создания Kubernetes-кластера. Тип виртуальной машины следует выбрать самостоятельно с учётом требовании к производительности и стоимости. Если в дальнейшем поймете, что необходимо сменить тип инстанса, используйте Terraform для внесения изменений. + б. Подготовить [ansible](https://www.ansible.com/) конфигурации, можно воспользоваться, например [Kubespray](https://kubernetes.io/docs/setup/production-environment/tools/kubespray/) + в. Задеплоить Kubernetes на подготовленные ранее инстансы, в случае нехватки каких-либо ресурсов вы всегда можете создать их при помощи Terraform. +2. Альтернативный вариант: воспользуйтесь сервисом [Yandex Managed Service for Kubernetes](https://cloud.yandex.ru/services/managed-kubernetes) + а. С помощью terraform resource для [kubernetes](https://registry.terraform.io/providers/yandex-cloud/yandex/latest/docs/resources/kubernetes_cluster) создать региональный мастер kubernetes с размещением нод в разных 3 подсетях + б. С помощью terraform resource для [kubernetes node group](https://registry.terraform.io/providers/yandex-cloud/yandex/latest/docs/resources/kubernetes_node_group) + +Ожидаемый результат: + +1. Работоспособный Kubernetes кластер. +2. В файле `~/.kube/config` находятся данные для доступа к кластеру. +3. Команда `kubectl get pods --all-namespaces` отрабатывает без ошибок. + +--- + +### Создание тестового приложения + +Для перехода к следующему этапу необходимо подготовить тестовое приложение, эмулирующее основное приложение разрабатываемое вашей компанией. + +Способ подготовки: + +1. Рекомендуемый вариант: + а. Создайте отдельный git репозиторий с простым nginx конфигом, который будет отдавать статические данные. + б. Подготовьте Dockerfile для создания образа приложения. +2. Альтернативный вариант: + а. Используйте любой другой код, главное, чтобы был самостоятельно создан Dockerfile. + +Ожидаемый результат: + +1. Git репозиторий с тестовым приложением и Dockerfile. +2. Регистр с собранным docker image. В качестве регистра может быть DockerHub или [Yandex Container Registry](https://cloud.yandex.ru/services/container-registry), созданный также с помощью terraform. + +--- + +### Подготовка cистемы мониторинга и деплой приложения + +Уже должны быть готовы конфигурации для автоматического создания облачной инфраструктуры и поднятия Kubernetes кластера. +Теперь необходимо подготовить конфигурационные файлы для настройки нашего Kubernetes кластера. + +Цель: +1. Задеплоить в кластер [prometheus](https://prometheus.io/), [grafana](https://grafana.com/), [alertmanager](https://github.com/prometheus/alertmanager), [экспортер](https://github.com/prometheus/node_exporter) основных метрик Kubernetes. +2. Задеплоить тестовое приложение, например, [nginx](https://www.nginx.com/) сервер отдающий статическую страницу. + +Рекомендуемый способ выполнения: +1. Воспользовать пакетом [kube-prometheus](https://github.com/prometheus-operator/kube-prometheus), который уже включает в себя [Kubernetes оператор](https://operatorhub.io/) для [grafana](https://grafana.com/), [prometheus](https://prometheus.io/), [alertmanager](https://github.com/prometheus/alertmanager) и [node_exporter](https://github.com/prometheus/node_exporter). При желании можете собрать все эти приложения отдельно. +2. Для организации конфигурации использовать [qbec](https://qbec.io/), основанный на [jsonnet](https://jsonnet.org/). Обратите внимание на имеющиеся функции для интеграции helm конфигов и [helm charts](https://helm.sh/) +3. Если на первом этапе вы не воспользовались [Terraform Cloud](https://app.terraform.io/), то задеплойте в кластер [atlantis](https://www.runatlantis.io/) для отслеживания изменений инфраструктуры. + +Альтернативный вариант: +1. Для организации конфигурации можно использовать [helm charts](https://helm.sh/) + +Ожидаемый результат: +1. Git репозиторий с конфигурационными файлами для настройки Kubernetes. +2. Http доступ к web интерфейсу grafana. +3. Дашборды в grafana отображающие состояние Kubernetes кластера. +4. Http доступ к тестовому приложению. + +--- + +### Установка и настройка CI/CD + +Осталось настроить ci/cd систему для автоматической сборки docker image и деплоя приложения при изменении кода. + +Цель: + +1. Автоматическая сборка docker образа при коммите в репозиторий с тестовым приложением. +2. Автоматический деплой нового docker образа. + +Можно использовать [teamcity](https://www.jetbrains.com/ru-ru/teamcity/), [jenkins](https://www.jenkins.io/) либо [gitlab ci](https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/) + +Ожидаемый результат: + +1. Интерфейс ci/cd сервиса доступен по http. +2. При любом коммите в репозиторие с тестовым приложением происходит сборка и отправка в регистр Docker образа. +3. При создании тега (например, v1.0.0) происходит сборка и отправка с соответствующим label в регистр, а также деплой соответствующего Docker образа в кластер Kubernetes. + +--- + +## Что необходимо для сдачи задания? + +1. Репозиторий с конфигурационными файлами Terraform и готовность продемонстрировать создание всех ресурсов с нуля. +2. Пример pull request с комментариями созданными atlantis'ом или снимки экрана из Terraform Cloud. +3. Репозиторий с конфигурацией ansible, если был выбран способ создания Kubernetes кластера при помощи ansible. +4. Репозиторий с Dockerfile тестового приложения и ссылка на собранный docker image. +5. Репозиторий с конфигурацией Kubernetes кластера. +6. Ссылка на тестовое приложение и веб интерфейс Grafana с данными доступа. +7. Все репозитории рекомендуется хранить на одном ресурсе (github, gitlab)