
Дипломный практикум в Yandex.Cloud
- Цели:
- Этапы выполнения:
- Что необходимо для сдачи задания?
- Как правильно задавать вопросы дипломному руководителю?
Цели:
- Подготовить облачную инфраструктуру на базе облачного провайдера Яндекс.Облако.
- Запустить и сконфигурировать Kubernetes кластер.
- Установить и настроить систему мониторинга.
- Настроить и автоматизировать сборку тестового приложения с использованием Docker-контейнеров.
- Настроить CI для автоматической сборки и тестирования.
- Настроить CD для автоматического развёртывания приложения.
Этапы:
- Создание облачной инфраструктуры
- Создание Kubernetes кластера
- Создание тестового приложения
- Подготовка cистемы мониторинга и деплой приложения
- Установка и настройка CI/CD
- Ссылки на все ресурсы
- Заключение
- Скриншоты
Создание облачной инфраструктуры
-
Характеристики инфраструктуры легко можно изменить для экономии бюджета гранта на Yandex Cloud. Это наглядно видно в модулях терраформ.
Но для демонстрации я оставлю хосты непрерываемые, чтобы проверяющий мог проверить их в любое время. При этом, если строго следовать требованиям задания, то значения переменных для моего модуля по созданию групп ВМ выглядели бы так:
cores = 2 memory = 2 core_fraction = 5 preemptible = true
-
Версия Terraform
Terraform v1.8.3 on linux_amd64
Также в модулях я выставил ограничение по версиям Terraform. Может слишком жестко, что только от 1.8.3, но "я художник - я так вижу".
required_version = ">=1.8.3"
Предварительная подготовка к установке и запуску Kubernetes кластера.
-
Подготовительные работы я вынес за рамки выполнения дипломного проекта, так как считаю, что SA для работы Terraform и S3-bucket должны быть реализованы без привязки к проекту. Но так как и они выполняются через мои модули Terraform, то можно было бы выполнить их вместе с проектом в одном манифесте.
-
Создание VPC я бы таким же образом вынес в отдельный этап, и обращался с к данным VPC через
terraform_remote_state
, но сделал по заданию, так как этот момент считаю некритичным. -
Все остальные ресурсы так же создаются с помощью модулей, которые расположены в моем репозитории
-
Конфигурация манифестов Terraform для выполнения дипломного проекта:
- Репозиторий
- Пример выполнения
terraform apply
-
Скриншоты этапа:
- Дополнительно реализован HTTPS доступ ко всем WEB сервисам в данном задании. Модуль
- Хосты кластера реализованы через
instance_group
. Проводил тесты с количеством: 3 мастера - 6 воркеров. Проблем нет. Количество хостов можно легко менять. Динамический инвентори отрабатывает без ошибок - Ориентировочное время выполнения манифестов - 17-20 минут
Создание Kubernetes кластера
-
Кластер подготавливается и настраивается с помощью моей Ansible роли. В проде я бы использовал Kubespray, но было интересно создать свою роль. Очевидно, что моя роль и близко не стоит с Kubespray, но сколько людей занимаются его разработкой и какое количество времени?
- Репозиторий с Ansible ролью ansible-kubeadm
-
Конфигурация кластера запускается на первом этапе с помощью Terraform:
Данный модуль также формирует инвентори файл для работы Ansible. Все операции производятся через созданый на первом этапе бастион. Все хосты кластрера находятся в приватных подсетях.
- Доступ
kubectl
производится через Load Balancer на группу мастеров - Доступ приложений кластера поизводится через Application Load Balancer на группу воркеров (на ingress controller)
Файл ~/.kube/config
создается так же из роли, для чего я предусмотрел переменные.
# Setting up a local configuration file
kubeadm_local:
config_path: "~/.kube/config"
user: "{{ lookup('env', 'USER') }}" # variable with the name of the user running ansible?
make_config: true # Danger! Rewrite your config file if kubeadm_local.config_path: "~/.kube/config"
- Скриншоты этапа:
Создание тестового приложения
-
Создан отдельный Git репозиторий.
-
Регистр образа разместил на своем Gitlab.
- Пример запуска приложения:
docker run -d --name feniks-web -p 80:80 registry.infernofeniks.ru/feniks/nginx-feniks:lastest
Подготовка cистемы мониторинга и деплой приложения
Данное задание выполнено на втором этапе.
Функция установки мониторинга кластера включены в Ansible роль.
Дополнительно реализована замена стандартного пароля (admin:admin
) в Grafana Web GUI. Так же указано в переменных Ansible роли.
- Репозиторий с Ansible ролью ansible-kubeadm
HTTPS доступ к web интерфейсу grafana:
Авторизационные данные
Логин:
super
Пароль:
netology
Конфигурация Grafana указывается в Ansible плейбуке
kubeadm_grafana_fqdn: grafana.infernofeniks.tech
kubeadm_grafana_user: super
kubeadm_grafana_password: netology
HTTPS доступ к тестовому приложению (Деплой через Gitlab):
HTTPS доступ к тестовому приложению (деплой через ArgoCD):
Скриншоты этапа:
Установка и настройка CI/CD
Для выполнения доставки приложения в кластер Kubernetes реализовано два сбособа:
-
Реализация через ArgoCD. Работа выполняется по следующему алгоритму:
- При создание тега в репозитории с приложением выполняется пайплайн:
- проверка синтаксиса
- тест
- сборка
- автоматический деплой в репозиторий конфигураций приложений для ArgoCD
- При создание тега в репозитории с приложением выполняется пайплайн:
-
Реализация через ручное задание в пайплайне:
-
В дополнение к первому способу появляется возможность ручного запуска задачи для деплоя приложения в кластер Kubernetes
Но необходимо внести данные в Gitlab CI/CD Variables -
$KUBE_CONFIG
Значение переменной
KUBE_CONFIG
- этоcat ~/.kube/config | base64
-
Скриншоты этапа:
Веб доступы к ресурсам
Описание | URL |
---|---|
GITLAB Тестовое приложение | https://gitlab.infernofeniks.ru/feniks/nginx-feniks |
GITLAB Репозиторий ARGO-PROJECTS | https://gitlab.infernofeniks.ru/feniks/argocd-projects |
GITHUB Репозиторий ARGO-PROJECTS DEMO | https://github.com/InfernoFeniks/argocd-demo |
ARGOCD | https://argocd.infernofeniks.tech |
GRAFANA | https://grafana.infernofeniks.tech |
PROMETHEUS | https://prometheus.infernofeniks.tech |
ALERTMANAGER | https://alertmanager.infernofeniks.tech/#/status |
APP | https://myapp.infernofeniks.tech |
APP (ARGOCD) | https://myapp.infernofeniks.tech/argocd |
DEMO-APP #1 (ARGOCD) | https://myapp.infernofeniks.tech/myapp1 |
DEMO-APP #2 (ARGOCD) | https://myapp.infernofeniks.tech/myapp2 |
Заключение
Все операции выполняются полностью автоматически после запуска Terrafom.
Единственно исключение - ручной запуск CI/CD в пайплайне Gitlab, так как нужно вручную внести в переменную значение конфигурационного файла кластера. Данный момент полностью перекрывается с помощью ARGOCD (описано выше).
Пароль от ARGOCD копируется на локальную машину с которой производится запуск манифестов в файл: cat /tmp/kubernetes_argocd_pass
Все скриншоты
Что необходимо для сдачи задания?
- Репозиторий с конфигурационными файлами Terraform и готовность продемонстрировать создание всех ресурсов с нуля.
- Пример pull request с комментариями созданными atlantis'ом или снимки экрана из Terraform Cloud или вашего CI-CD-terraform pipeline.
- Репозиторий с конфигурацией ansible, если был выбран способ создания Kubernetes кластера при помощи ansible.
- Репозиторий с Dockerfile тестового приложения и ссылка на собранный docker image.
- Репозиторий с конфигурацией Kubernetes кластера.
- Ссылка на тестовое приложение и веб интерфейс Grafana с данными доступа.
- Все репозитории рекомендуется хранить на одном ресурсе (github, gitlab)