- Цели:
- Этапы выполнения:
- Что необходимо для сдачи задания?
- Как правильно задавать вопросы дипломному руководителю?
Перед началом работы над дипломным заданием изучите Инструкция по экономии облачных ресурсов.
- Подготовить облачную инфраструктуру на базе облачного провайдера Яндекс.Облако.
- Запустить и сконфигурировать Kubernetes кластер.
- Установить и настроить систему мониторинга.
- Настроить и автоматизировать сборку тестового приложения с использованием Docker-контейнеров.
- Настроить CI для автоматической сборки и тестирования.
- Настроить CD для автоматического развёртывания приложения.
- Проверка
Для начала необходимо подготовить облачную инфраструктуру в ЯО при помощи Terraform.
Особенности выполнения:
- Бюджет купона ограничен, что следует иметь в виду при проектировании инфраструктуры и использовании ресурсов; Для облачного k8s используйте региональный мастер(неотказоустойчивый). Для self-hosted k8s минимизируйте ресурсы ВМ и долю ЦПУ. В обоих вариантах используйте прерываемые ВМ для worker nodes.
Предварительная подготовка к установке и запуску Kubernetes кластера.
- Создайте сервисный аккаунт, который будет в дальнейшем использоваться Terraform для работы с инфраструктурой с необходимыми и достаточными правами. Не стоит использовать права суперпользователя
- Подготовьте backend для Terraform:
а. Рекомендуемый вариант: S3 bucket в созданном ЯО аккаунте(создание бакета через TF) б. Альтернативный вариант: Terraform Cloud - Создайте конфигурацию Terrafrom, используя созданный бакет ранее как бекенд для хранения стейт файла. Конфигурации Terraform для создания сервисного аккаунта и бакета и основной инфраструктуры следует сохранить в разных папках.
- Создайте VPC с подсетями в разных зонах доступности.
- Убедитесь, что теперь вы можете выполнить команды
terraform destroyиterraform applyбез дополнительных ручных действий. - В случае использования Terraform Cloud в качестве backend убедитесь, что применение изменений успешно проходит, используя web-интерфейс Terraform cloud.
Ожидаемые результаты:
- Terraform сконфигурирован и создание инфраструктуры посредством Terraform возможно без дополнительных ручных действий, стейт основной конфигурации сохраняется в бакете или Terraform Cloud
- Полученная конфигурация инфраструктуры является предварительной, поэтому в ходе дальнейшего выполнения задания возможны изменения.
curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bashyc initПредварительная проверка
yc iam service-accounts listФайл конфигурации
Генерация токена и добавление его в переменную TF_VAR_token
export TF_VAR_token=$(yc iam create-token)export TF_VAR_token=$(yc iam create-token)
cd /home/tenda/tenda-devops-diplom-netology/yc-sa
terraform init
terraform validate
terraform apply --auto-approveПроверка создания аккаунта
yc iam service-accounts listФайл конфигурации
Предварительная проверка
yc storage bucket listcd /home/tenda/tenda-devops-diplom-netology/yc-bucket
terraform init
terraform validate
terraform apply --auto-approve
source .envПроверка
yc storage bucket list**Внимание:**в связи с тем, что переменные Terraform (var.*) нельзя использовать в блоке backend, а ACCESS_KEY и SECRET_ACCESS_KEY являются чувствительными данными, значения будем передавать через переменные AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY
source .envЭтап 1.3 Создание конфигурации Terrafrom, для хранения terraform.state файла в ранее созданном бакете
Файл конфигурации
cd /home/tenda/tenda-devops-diplom-netology/yc-main-infra
terraform init
terraform validate
terraform apply --auto-approveПроверка
Предварительная проверка
yc vpc network listФайл конфигурации
cd /home/tenda/tenda-devops-diplom-netology/yc-main-infra
terraform init
terraform validate
terraform apply --auto-approveПроверка
yc vpc network list
yc vpc subnet listyc iam service-accounts list
yc storage bucket list
yc vpc network list
yc vpc subnet listРезультаты
- Конфигурации Terraform для создания сервисного аккаунта и бакета и основной инфраструктуры храняться в разных папках.
- 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отрабатывает без ошибок.
[В целях экономии ресурсов создаем 3 ВМ: 1 - master-ноду и 2 - worker-ноды]
Файлы конфигурации
Файл конфигурации
Файл шаблона
cd /home/tenda/tenda-devops-diplom-netology/yc-main-infra
terraform init
terraform validate
terraform apply --auto-approveПроверка
yc compute instance listПланируется организовывать доступ к Cистеме мониторинга и Тестовому приложению через Ingress Nginx
Параметры подключения:
Протокол - HTTP
Порт - tcp/80
Домен - denisten.ru
Адреса публикаций:
-
Система мониторинга - http://denisten.ru
-
Тестовое приложение - http://denisten.ru/app
-
Добавление балансировщика в инфраструктуру
Файл конфигурации
cd /home/tenda/tenda-devops-diplom-netology/yc-main-infra
terraform init
terraform validate
terraform apply --auto-approveПроверка установки балансировщика
yc load-balancer network-load-balancer list- Добавление DNS зоны и A-записи
Создание и обновление А-записи для домена denisten.ru происходит в автоматическом режиме.
Файл конфигурации
cd /home/tenda/tenda-devops-diplom-netology/yc-main-infra
terraform init
terraform validate
terraform apply --auto-approveПроверка регистрации домена и создание A-записи
yc dns zone listyc dns zone list-records --name denisten-ruУстановка кластера с помощью kuberspay
cd /home/tenda/tenda-devops-diplom-netology/yc-main-infra/kubespray
pip install -r requirements.txt
ansible-playbook -i inventory/mycluster/inventory-default.ini cluster.yml -b -vКопирование файла kubeconfig на локальный хост.
cd /home/tenda/tenda-devops-diplom-netology/yc-main-infra/
mkdir -p ~/.kube/
export API_ENDPOINT=$(terraform output -raw api_endpoint)
ssh -o StrictHostKeyChecking=no ubuntu@$API_ENDPOINT "sudo cat /etc/kubernetes/admin.conf" > ~/.kube/configИзменение kubeconfig
cd /home/tenda/tenda-devops-diplom-netology/yc-main-infra/
export API_ENDPOINT=$(terraform output -raw api_endpoint)
sed -i "s/127.0.0.1/$API_ENDPOINT/g" ~/.kube/configОтключение проверки TLS-сертификата.
Отключение проверки TLS делает соединение уязвимым к MITM-атакам (злоумышленник может перехватить трафик).
Не использовать в продакшене!
kubectl config set-cluster cluster.local --insecure-skip-tls-verify=trueРезультаты
- Настроен и сконфигурирован работоспособный Kubernetes кластер (kuberspray)
- В файле ~/.kube/config находятся данные для доступа к кластеру
- Команда kubectl get pods --all-namespaces отрабатывает без ошибок.
kubectl get nodes
kubectl get pods -AДля перехода к следующему этапу необходимо подготовить тестовое приложение, эмулирующее основное приложение разрабатываемое вашей компанией.
Способ подготовки:
- Рекомендуемый вариант:
а. Создайте отдельный git репозиторий с простым nginx конфигом, который будет отдавать статические данные.
б. Подготовьте Dockerfile для создания образа приложения. - Альтернативный вариант:
а. Используйте любой другой код, главное, чтобы был самостоятельно создан Dockerfile.
Ожидаемый результат:
- Git репозиторий с тестовым приложением и Dockerfile.
- Регистри с собранным docker image. В качестве регистри может быть DockerHub или Yandex Container Registry, созданный также с помощью terraform.
- Создание отдельного git-репозиторий. Ссылка на репозиторий: https://github.com/killakazzak/tenda-devops-diplom-app.git
git clone git@github.com:killakazzak/tenda-devops-diplom-app.git- Подготовлен Dockerfile
FROM nginx:1.28.0
RUN rm -rf /usr/share/nginx/html/*
COPY content/ /usr/share/nginx/html/
EXPOSE 80- Создание образа
cd /home/tenda/tenda-devops-diplom-app
docker build -t killakazzak/tenda-devops-app:0.0 .Проверка
docker images- Авторизация на github.com
docker login -u killakazzakdocker push killakazzak/tenda-devops-app:0.0- тестовое приложение подготовлено
- образ собран и опубликован
Уже должны быть готовы конфигурации для автоматического создания облачной инфраструктуры и поднятия Kubernetes кластера.
Теперь необходимо подготовить конфигурационные файлы для настройки нашего Kubernetes кластера.
Цель:
- Задеплоить в кластер prometheus, grafana, alertmanager, экспортер основных метрик Kubernetes.
- Задеплоить тестовое приложение, например, nginx сервер отдающий статическую страницу.
Способ выполнения:
-
Воспользоваться пакетом kube-prometheus, который уже включает в себя Kubernetes оператор для grafana, prometheus, alertmanager и node_exporter. Альтернативный вариант - использовать набор helm чартов от bitnami.
-
Если на первом этапе вы не воспользовались Terraform Cloud, то задеплойте и настройте в кластере atlantis для отслеживания изменений инфраструктуры. Альтернативный вариант 3 задания: вместо Terraform Cloud или atlantis настройте на автоматический запуск и применение конфигурации terraform из вашего git-репозитория в выбранной вами CI-CD системе при любом комите в main ветку. Предоставьте скриншоты работы пайплайна из CI/CD системы.
Ожидаемый результат:
- Git репозиторий с конфигурационными файлами для настройки Kubernetes.
- Http доступ на 80 порту к web интерфейсу grafana.
- Дашборды в grafana отображающие состояние Kubernetes кластера.
- Http доступ на 80 порту к тестовому приложению.
- Atlantis или terraform cloud или ci/cd-terraform
helm repo add prometheus-community https://prometheus-community.github.io/helm-chartsСохранение и редактирование значений по умолчанию в файл prometheus-values.yaml
cd /home/tenda/tenda-devops-diplom-netology
mkdir -p k8s
helm show values prometheus-community/kube-prometheus-stack > /home/tenda/tenda-devops-diplom-netology/k8s/prometheus-values.yaml- Редактирование файла prometheus-values.yaml
sed -i '/portName: http-web/a\ type: NodePort\ \n nodePort: 30050' /home/tenda/tenda-devops-diplom-netology/k8s/prometheus-values.yamlservice:
portName: http-web
type: NodePort #добавлен тип сервиса
nodePort: 30050 #добавлен номер порта
ipFamilies: []
ipFamilyPolicy: ""Файл параметров установки
helm upgrade --install monitoring prometheus-community/kube-prometheus-stack --create-namespace -n monitoring -f /home/tenda/tenda-devops-diplom-netology/k8s/prometheus-values.yamlПолучение пароля
kubectl --namespace monitoring get secrets monitoring-grafana -o jsonpath="{.data.admin-password}" | base64 -d ; echoПроверка установки Системы мониторинга
kubectl get pods -n monitoringkubectl get svc -n monitoringkubectl create namespace tenda- Применение манифестов deployment.yaml и service.yaml
cd /home/tenda/tenda-devops-diplom-netology/k8s
kubectl apply -f deployment.yaml -f service.yaml -n tendaПроверка
kubectl get pods -n tendakubectl get svc -Ahelm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxУстановка Ingress-Nginx контроллера (Версия Helm 3.18.0 для установки не подходит (баг в 3.18.1 обещали исправить))
Файл параметров установки Ingress-Nginx контроллера
cd /home/tenda/tenda-devops-diplom-netology/k8s/
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace -f ingress-values.yamlФайл конфигурации Ingress-Nginx контроллера
cd /home/tenda/tenda-devops-diplom-netology/k8s/
kubectl apply -f ingress-config.yamlПроверка установки Ingress-Nginx контроллера
kubectl get pods -n ingress-nginxkubectl get svc -n ingress-nginx- В Git репозиторий добавлены конфигурационные файлы для настройки Kubernetes.
Файлы конфигураций
Ссылка: https://github.com/killakazzak/tenda-devops-diplom-netology/tree/main/k8s
- Web-интерфейс Grafana доступен по внешней публикации: http://denisten.ru/
- Дашборды в
grafanaотображают состояниеKubernetesкластера.
- Тестовое приложение доступно по внешней публикации: http://denisten.ru/app
- Через Web-интерфейс выпустил
ssl-сертификатдля домена*denisten.ru*- данный сертификат можно использовать для организации доступа по https к развернутым приложениям.
yc certificate-manager certificate listОсталось настроить ci/cd систему для автоматической сборки docker image и деплоя приложения при изменении кода.
Цель:
- Автоматическая сборка docker образа при коммите в репозиторий с тестовым приложением.
- Автоматический деплой нового docker образа.
Можно использовать teamcity, jenkins, GitLab CI или GitHub Actions.
Ожидаемый результат:
- Интерфейс ci/cd сервиса доступен по http.
- При любом коммите в репозиторие с тестовым приложением происходит сборка и отправка в регистр Docker образа.
- При создании тега (например, v1.0.0) происходит сборка и отправка с соответствующим label в регистри, а также деплой соответствующего Docker образа в кластер Kubernetes.
CI/CD реализован на базе GitLab CI
- Создание нового репозитория. Ссылка на репозиторий tenda-devops-diplom-app-cicd
- Клонирование репозитория на локальный ПК
git clone git@gitlab.com:denis.a.ten/tenda-devops-diplom-app-cicd.git
cd tenda-devops-diplom-app-cicd
git switch --create main
touch README.md
git add README.md
git commit -m "add README"
git push --set-upstream origin maingit init --initial-branch=main
git remote add origin git@gitlab.com:denis.a.ten/tenda-devops-diplom-app-cicd.git
git add .
git commit -m "Initial commit"
git push --set-upstream origin maincd /home/tenda/tenda-devops-diplom-app-cicd
rsync -av --exclude='.git' ../tenda-devops-diplom-app/ ./cd /home/tenda/tenda-devops-diplom-app-cicd
git add .
git commit -m "update"
git push- Создание и регистрация Gitlab Runner
kubectl create ns gitlab-runnerexport GITLAB_RUNNER_TOKEN="значение_токена"kubectl --namespace=gitlab-runner create secret generic runner-secret --from-literal=runner-registration-token="$GITLAB_RUNNER_TOKEN" --from-literal=runner-token=""
Проверка создания secret
kubectl get secrets -n gitlab-runnerhelm repo add gitlab https://charts.gitlab.io
helm install gitlab-runner gitlab/gitlab-runner -n gitlab-runner -f /home/tenda/tenda-devops-diplom-netology/k8s/gitlab-runner-values.yamlПроверка установки GitLab Runner
kubectl get pods -n gitlab-runnerФайл конфигурации GitLab CI
Сборка и Деплой приложения будет выполняться автоматически при измении кода и добавления нового тега.
Pipeline разделен на 2е стадии:
- Этап сборки
build - Этап деплоя
deploy
Проверка работоспособности CI/CD конвеера
Для запуска CI/CD конвеера, в целях тестирования, добавляем новый tag
cd /home/tenda/tenda-devops-diplom-app-cicd
git add .
git commit -m 'version 0.1'
git tag 0.1
git push origin main --tagsПроверка публикации образа
**Проверка работоспособности pipeline **
Оба этапа build и deploy прошли без ошибок!
1-я версия тестового приложения
Изменяем код тестового приложения и отправляем изменения в репозиторий
cd /home/tenda/tenda-devops-diplom-app-cicd
git add .
git commit -m 'version 0.2'
git tag 0.2
git push origin main --tagsАвтоматически запускается сборка и деплой новой версии приложения
Проверка публикации образа
Проверка работоспособности pipeline
Оба этапа build и deploy прошли без ошибок!
Сайт доступен
2-я версия тестового приложения
- Репозиторий с конфигурационными файлами Terraform и готовность продемонстрировать создание всех ресурсов с нуля.
- Пример pull request с комментариями созданными atlantis'ом или снимки экрана из Terraform Cloud или вашего CI-CD-terraform pipeline.
- Репозиторий с конфигурацией ansible, если был выбран способ создания Kubernetes кластера при помощи ansible.
- Репозиторий с Dockerfile тестового приложения и ссылка на собранный docker image.
- Репозиторий с конфигурацией Kubernetes кластера.
- Ссылка на тестовое приложение и веб интерфейс Grafana с данными доступа.
- Все репозитории рекомендуется хранить на одном ресурсе (github, gitlab)
- Репозиторий с конфигурационными файлами Terraform и готовность продемонстрировать создание всех ресурсов с нуля.
- Создание сервисного аккаунта: https://github.com/killakazzak/tenda-devops-diplom-netology/tree/main/yc-sa
- Создание бакета: https://github.com/killakazzak/tenda-devops-diplom-netology/tree/main/yc-bucket
- Создание инфраструктуры: https://github.com/killakazzak/tenda-devops-diplom-netology/tree/main/yc-main-infra
- Репозиторий с конфигурацией ansible, был выбран способ создания
Kubernetesкластера при помощиansible
- Репозиторий с шаблонами: https://github.com/killakazzak/tenda-devops-diplom-netology/tree/main/yc-main-infra
- Репозиторий с Dockerfile тестового приложения и ссылка на собранный docker image. Сборка и деплой выполнялась на базе
GitLab CI.
- Репозиторий: https://gitlab.com/denis.a.ten/tenda-devops-diplom-app-cicd
- Ссылка на образ: https://hub.docker.com/r/killakazzak/tenda-devops-app
- Репозиторий с конфигурацией Kubernetes кластера.
- Репозиторий: https://github.com/killakazzak/tenda-devops-diplom-netology/tree/fcf6612ed7e9d00824d0ce48f9a007659deb1ae1/k8s
- Ссылка на тестовое приложение и веб интерфейс Grafana с данными доступа.
- Тестовое приложение: http://denisten.ru/app
- Web-интерфейс Grafana: http://denisten.ru
- Пользователь: admin
- Пароль: prom-operator
- Автоматизация
- установка инфраструктуры: deploy_infra.sh
- удаление инфраструктуры: destroy_infra.sh


































































