Skip to content

killakazzak/tenda-devops-diplom-netology

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

213 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Дипломный практикум в Yandex.Cloud

Автор: Тен Денис Александрович

Группа: FOPS-20

Перед началом работы над дипломным заданием изучите Инструкция по экономии облачных ресурсов.


Цели:

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

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

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

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

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

  • Бюджет купона ограничен, что следует иметь в виду при проектировании инфраструктуры и использовании ресурсов; Для облачного k8s используйте региональный мастер(неотказоустойчивый). Для self-hosted k8s минимизируйте ресурсы ВМ и долю ЦПУ. В обоих вариантах используйте прерываемые ВМ для worker nodes.

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

  1. Создайте сервисный аккаунт, который будет в дальнейшем использоваться Terraform для работы с инфраструктурой с необходимыми и достаточными правами. Не стоит использовать права суперпользователя
  2. Подготовьте backend для Terraform:
    а. Рекомендуемый вариант: S3 bucket в созданном ЯО аккаунте(создание бакета через TF) б. Альтернативный вариант: Terraform Cloud
  3. Создайте конфигурацию Terrafrom, используя созданный бакет ранее как бекенд для хранения стейт файла. Конфигурации Terraform для создания сервисного аккаунта и бакета и основной инфраструктуры следует сохранить в разных папках.
  4. Создайте VPC с подсетями в разных зонах доступности.
  5. Убедитесь, что теперь вы можете выполнить команды terraform destroy и terraform apply без дополнительных ручных действий.
  6. В случае использования Terraform Cloud в качестве backend убедитесь, что применение изменений успешно проходит, используя web-интерфейс Terraform cloud.

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

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

Этап 1.1 Настройка Yandex Cloud

Установка ПО для работы в CLI Yandex Cloud

curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash

Иструкция

Настройка профиля в Yandex Cloud

yc init

Создание сервисного аккаунта администратора и авторизационного ключа

Предварительная проверка

yc iam service-accounts list

alt text

Файл конфигурации

Генерация токена и добавление его в переменную 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

alt text

alt text

Проверка создания аккаунта

yc iam service-accounts list

alt text

Этап 1.2 Подготовка backend для Terraform:

Создание bucket в S3

Файл конфигурации

Предварительная проверка

yc storage bucket list

alt text

cd /home/tenda/tenda-devops-diplom-netology/yc-bucket
terraform init
terraform validate
terraform apply --auto-approve
source .env

alt text

Проверка

yc storage bucket list

alt text

**Внимание:**в связи с тем, что переменные 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

Проверка

alt text

Этап 1.4 Создание VPC с подсетями в разных зонах доступности

Предварительная проверка

yc vpc network list

alt text

Файл конфигурации

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 list

alt text

Итоговая проверка 1-го этапа

yc iam service-accounts list
yc storage bucket list
yc vpc network list
yc vpc subnet list

alt text

Результаты

  1. Конфигурации Terraform для создания сервисного аккаунта и бакета и основной инфраструктуры храняться в разных папках.

alt text

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

alt text


Этап 2. Создание Kubernetes кластера

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

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

  1. Рекомендуемый вариант: самостоятельная установка Kubernetes кластера.
    а. При помощи Terraform подготовить как минимум 3 виртуальных машины Compute Cloud для создания Kubernetes-кластера. Тип виртуальной машины следует выбрать самостоятельно с учётом требовании к производительности и стоимости. Если в дальнейшем поймете, что необходимо сменить тип инстанса, используйте Terraform для внесения изменений.
    б. Подготовить ansible конфигурации, можно воспользоваться, например Kubespray
    в. Задеплоить Kubernetes на подготовленные ранее инстансы, в случае нехватки каких-либо ресурсов вы всегда можете создать их при помощи Terraform.
  2. Альтернативный вариант: воспользуйтесь сервисом Yandex Managed Service for Kubernetes
    а. С помощью terraform resource для kubernetes создать региональный мастер kubernetes с размещением нод в разных 3 подсетях
    б. С помощью terraform resource для kubernetes node group

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

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

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

Создание ВМ в разных зонах доступности

[В целях экономии ресурсов создаем 3 ВМ: 1 - master-ноду и 2 - worker-ноды]

Файлы конфигурации

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

Файл конфигурации

Файл шаблона

cd /home/tenda/tenda-devops-diplom-netology/yc-main-infra
terraform init
terraform validate
terraform apply --auto-approve

Проверка

yc compute instance list

alt text

Этап 2.2 Установка балансировщика и добавление DNS зоны denisten.ru

Планируется организовывать доступ к 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

alt text

Проверка установки балансировщика

yc load-balancer network-load-balancer list

alt text

alt text

  • Добавление 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 list

alt text

yc dns zone list-records --name denisten-ru

alt text

Этап 2.3 Установка Kubernetes

Установка кластера с помощью 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

alt text

Копирование файла 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

alt text

Результаты

  • Настроен и сконфигурирован работоспособный Kubernetes кластер (kuberspray)
  • В файле ~/.kube/config находятся данные для доступа к кластеру
  • Команда kubectl get pods --all-namespaces отрабатывает без ошибок.
kubectl get nodes
kubectl get pods -A

alt text


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

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

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

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

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

  1. Git репозиторий с тестовым приложением и Dockerfile.
  2. Регистри с собранным docker image. В качестве регистри может быть DockerHub или Yandex Container Registry, созданный также с помощью terraform.

alt text

Клонирование репозитория на локальный ПК

git clone git@github.com:killakazzak/tenda-devops-diplom-app.git

alt text

  • Подготовлен 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 .

alt text

Проверка

docker images

alt text

  • Авторизация на github.com

Создание Personal access token

alt text

alt text

docker login -u killakazzak

alt text

Публикация образа на dockerhub

docker push killakazzak/tenda-devops-app:0.0

alt text

alt text

Результаты выполнения 3-го этапа

  • тестовое приложение подготовлено
  • образ собран и опубликован

Этап 4. Подготовка cистемы мониторинга и деплой приложения

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

Цель:

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

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

  1. Воспользоваться пакетом kube-prometheus, который уже включает в себя Kubernetes оператор для grafana, prometheus, alertmanager и node_exporter. Альтернативный вариант - использовать набор helm чартов от bitnami.

  2. Если на первом этапе вы не воспользовались Terraform Cloud, то задеплойте и настройте в кластере atlantis для отслеживания изменений инфраструктуры. Альтернативный вариант 3 задания: вместо Terraform Cloud или atlantis настройте на автоматический запуск и применение конфигурации terraform из вашего git-репозитория в выбранной вами CI-CD системе при любом комите в main ветку. Предоставьте скриншоты работы пайплайна из CI/CD системы.

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

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

Добавление helm-репозитория для установки Prometheus и Grafana

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

alt text

Сохранение и редактирование значений по умолчанию в файл 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
sed -i '/portName: http-web/a\    type: NodePort\    \n    nodePort: 30050' /home/tenda/tenda-devops-diplom-netology/k8s/prometheus-values.yaml
service:
    portName: http-web
    type: NodePort   #добавлен тип сервиса
    nodePort: 30050  #добавлен номер порта
    ipFamilies: []
    ipFamilyPolicy: ""

Этап 4.1 Установка системы мониторинга

Файл параметров установки

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

alt text

Проверка установки Системы мониторинга

kubectl get pods -n monitoring

alt text

kubectl get svc -n monitoring

alt text

Этап 4.2 Установка тестового приложения

Создание namespace tenda

kubectl create namespace tenda

alt text

cd /home/tenda/tenda-devops-diplom-netology/k8s
kubectl apply -f deployment.yaml -f service.yaml -n tenda

alt text

Проверка

kubectl get pods -n tenda

alt text

kubectl get svc -A

alt text

Этап 4.3 Добавление helm-репозитория для установки Ingress конроллера

helm 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 контроллера

Файл конфигурации Ingress-Nginx контроллера

cd /home/tenda/tenda-devops-diplom-netology/k8s/
kubectl apply -f ingress-config.yaml

Проверка установки Ingress-Nginx контроллера

kubectl get pods -n ingress-nginx

alt text

kubectl get svc -n ingress-nginx

alt text

Результаты выполнения 4-го этапа

  1. В Git репозиторий добавлены конфигурационные файлы для настройки Kubernetes.

Файлы конфигураций

Ссылка: https://github.com/killakazzak/tenda-devops-diplom-netology/tree/main/k8s

  1. Web-интерфейс Grafana доступен по внешней публикации: http://denisten.ru/

alt text

  1. Дашборды в grafana отображают состояние Kubernetes кластера.

alt text

  1. Тестовое приложение доступно по внешней публикации: http://denisten.ru/app

alt text

  • Через Web-интерфейс выпустил ssl-сертификат для домена *denisten.ru* - данный сертификат можно использовать для организации доступа по https к развернутым приложениям.
yc certificate-manager certificate list

alt text

alt text

alt text


Этап 5. Установка и настройка CI/CD

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

Цель:

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

Можно использовать teamcity, jenkins, GitLab CI или GitHub Actions.

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

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

Этап 5.1 Первоначальная настройка

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 main

alt text

Добавление удаленного репозитория с именем origin

git 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 main

alt text

Копирование тестового приложения в новый репозиторий

cd /home/tenda/tenda-devops-diplom-app-cicd
rsync -av --exclude='.git' ../tenda-devops-diplom-app/ ./

alt text

cd /home/tenda/tenda-devops-diplom-app-cicd
git add .
git commit -m "update"
git push

alt text

alt text

  • Создание и регистрация Gitlab Runner

alt text

Этап 5.2 Установка GitLab Runner в Kubernetes кластер

Создание namespace для GitLab Runner

kubectl create ns gitlab-runner

Получение токена для регистрации GitLab Runner

alt text

export GITLAB_RUNNER_TOKEN="значение_токена"

Создание secret для установки GitLab Runner

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-runner

alt text

Установка GitLab Runner

helm 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

alt text

Проверка установки GitLab Runner

kubectl get pods -n gitlab-runner

alt text

alt text

Добавление переменных в настройки проекта

alt text

Этап 5.3 Создание pipeline

Файл конфигурации 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

alt text

Проверка публикации образа

alt text

**Проверка работоспособности pipeline **

alt text

Оба этапа build и deploy прошли без ошибок!

1-я версия тестового приложения

alt text

Изменяем код тестового приложения и отправляем изменения в репозиторий

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

alt text

Автоматически запускается сборка и деплой новой версии приложения

Проверка публикации образа

alt text

Проверка работоспособности pipeline

Оба этапа build и deploy прошли без ошибок!

Сборка прошла успешно

alt text

Сайт доступен

http://denisten.ru/app

2-я версия тестового приложения

alt text


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

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

Итоги выполненной работы:

  1. Репозиторий с конфигурационными файлами Terraform и готовность продемонстрировать создание всех ресурсов с нуля.
  1. Репозиторий с конфигурацией ansible, был выбран способ создания Kubernetes кластера при помощи ansible
  1. Репозиторий с Dockerfile тестового приложения и ссылка на собранный docker image. Сборка и деплой выполнялась на базе GitLab CI.
  1. Репозиторий с конфигурацией Kubernetes кластера.
  1. Ссылка на тестовое приложение и веб интерфейс Grafana с данными доступа.
  1. Автоматизация

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors