====== DevOps1. Основные инструменты ======
===== Программа курса =====
* [[https://www.specialist.ru/course/kuber|DevOps. Уровень 1. Инфраструктура как код, основные инструменты]]
* [[https://www.specialist.ru/track/dp-devops|ДП-ДЕВОПС-М]]
===== Модуль 0. Подготовка к занятию =====
- Узнать и записать свой номер стенда: X=
- Сообщить его в чат преподавателю
===== Модуль 1: Введение и развертывание стенда =====
==== Теория ====
* [[https://landscape.cncf.io/]]
* [[https://dzen.ru/a/ZVIBk2kT0ntemhwK|∞ Дорожная карта DevOps-инженера в 2023 году]]
* Ссылки в разделе [[Сервис Git]]
==== Лабораторные работы: Развертывание стенда и инициализация репозитория Git ====
* Разворачиваем стенд курса [[https://www.specialist.ru/course/yun2-b|Linux. Уровень 2. Администрирование сервисов и сетей]] или [[https://rutube.ru/video/18b52d9721f7464b4485fec7d894e8ca/|Развертывание стенда дома (смотреть с 13-й минуты)]]
=== 1.1 Схема стенда, импорт, настройка и запуск VM gate и server ===
Запустите с правами Administrator
C:\cmder\cmder.exe
bash
cd
test -d conf && rm -r conf
git clone http://val.bmstu.ru/unix/conf.git
cd conf/virtualbox/
!!! 8 - это номер курса, вместо X укажите Ваш номер стенда, если не знаете его, спросите преподавателя !!!
./setup.sh X 8
=== 1.2 Настройка сети VM gate и server ===
* [[Настройка стендов слушателей#Настройка виртуальных систем Unix]] с использованием [[Настройка стендов слушателей#Скрипты автоконфигурации]]
* gate
# sh net_gate.sh
# init 6
* server
# sh net_server.sh
# init 6
* Создать в Putty профили gate, server и подключиться
=== 1.3 Инициализация репозитория Git ===
* [[Сервис Git]], команды init, add, commit для каталога /etc на server
* [[Финальная настройка DNS сервера]]
server:~# git -C conf/ pull
server:~# sh conf/dns.sh
* Настройка клиента DNS на gate и server
# cat /etc/resolv.conf
search corpX.un
nameserver 192.168.X.10
# nslookup ns
=== 1.4 Работа с репозиторием Git ===
!!! Методическая рекомендация, запустить установку Docker (только на server) из лабораторной работы 2.1
server# cat /etc/bind/corpX.un
...
webd A 192.168.X.10
* [[Сервис Git]], команды git -C /etc/ ..., log, show, diff, reset
==== Вопросы ====
- Перечислите и объясните команды git
===== Модуль 2: Docker =====
==== Теория ====
* Ссылки в разделах [[Технология cgroup]], [[Технология namespaces]] и [[Технология Docker]]
* [[https://ru.wikipedia.org/wiki/Микросервисная_архитектура|Микросервисная архитектура]]
==== Лабораторные работы: Установка docker и работа с контейнерами ====
=== 2.1 Собираем docker контейнер ===
* [[Технология Docker#Установка]] Docker из базового репозитория на **server** и из репозитория вендора на **gate**
!!! Методическая рекомендация, запустить установку Golang из этой лабораторной работы
* Обсудить [[Технология Docker#Создание образа для приложения вручную]] было в ЛИН3
!!! Методическая рекомендация, запустить установку docker-compose из лабораторной работы 2.2
* Обсудить [[Технология Docker#Создание образа для приложения с использованием Dockerfile]] будет в доп. практикуме
== 2.1.2 Приложение на Python ==
* [[Язык программирования Python#Виртуальная среда Python]] (учетная запись root на server)
* Создаем [[Язык программирования Python#Web приложение]] на Python
!!! Методическая рекомендация, запустить установку Vagrant из лабораторной работы 3.1
* Собираем образ [[Технология Docker#Приложение python pywebd]]
* Вопросы оптимизации Dockerfile и безопасности
* [[Технология Docker#Анализ параметров запущенного контейнера]]
== 2.1.3 Приложение на Go ==
!!! Методическая рекомендация, запустить установку GitLab из лабораторной работы 4.1
* [[Язык программирования Golang]] (учетная запись root на gate)
* Создаем [[Язык программирования Golang#Web приложение]] на Golang
~/gowebd# apt purge golang-go; apt autoremove -y
* Собираем образ [[Технология Docker#Приложение golang gowebd]]
* Вопросы оптимизации размера образа
* Расширение [[Технология Docker#docker buildx]]
* Вопросы оптимизации времени сборки образа
* [[Технология Docker#Обзор и удаление]] ненужных ресурсов Docker
=== 2.2 Связываем и деплоим контейнеры с помощью docker-compose ===
* [[Технология Docker#Использование готовых образов приложений]]
* Использование [[Технология Docker#docker-compose]]
* Можно показать "кубернетес" - [[Сервис HTTP#Прокси "красивого" URL в приложение (пример 3)|Использование прокси Nginx]] для доступа к приложению (если установился GitLab)
==== Вопросы ====
- Зачем нужен Docker?
- Чем Docker отличается от LXC?
- Чем Docker контейнер отличается от Docker образа?
- Как ПО в Docker контейнере может взаимодействовать с системой и другими контейнерами?
- Зачем нужен Dockerfile?
- Как указать агрументы для entrypoint в команде run ([[Технология Docker#Запуск контейнеров]])
- Зачем "запихивать" сразу много инструкций в команду RUN?
- Зачем нужен docker-compose?
===== Модуль 3. Инфраструктура как код =====
==== Теория ====
* Построение ландшафта инфраструктуры на примере [[Технология Vagrant]]
* Построение ландшафта облачной инфраструктуры с использованием [[https://ru.wikipedia.org/wiki/Terraform|HashiCorp Terraform]]
* Видео урок: [[On-premise Terraform]]
* Управление инфраструктурой с использованием [[Сервис Ansible]]
==== Лабораторные работы: Управление инфраструктурой ====
=== 3.1 Управление инфраструктурой с использованием Vagrant ===
!!! Методическая рекомендация, запустить установку Ansible из лабораторной работы 3.2
* Добавляем DNS записи nodeN A 192.168.X.200+N в [[Сервис DNS#Настройка мастер сервера зоны corpX.un]]
* Обзор команд [[Технология VirtualBox]]
* Обзор [[Технология Vagrant]]
* Развертываем с использованием [[Технология Vagrant#Multi-Machine Vagrant Environments]] узлы кластера node1,2,3
=== 3.2 Управление инфраструктурой с использованием Ansible ===
* Общие принципы и модели управления (Push and Pull)
* Ansible - [[Сервис Ansible#Установка на управляющей системе]]
* [[Сервис Ansible#Настройка групп управляемых систем]]
* [[Сервис Ansible#Настройка транспорта ssh]] с [[Сервис SSH#Парольная аутентификация]]
* [[Сервис Ansible#Использование модулей]] для тестирования связи с управляемыми системами
* Установка Docker с помощью [[Сервис Ansible#Использование playbook|Ansible playbook]] на node1,2,3 (лучше во время перерыва)
* [[Сервис Ansible#Использование шаблонов]] Jinja в playbook для установки Nginx (на gate, по окончании демонстрации удалить!!)
* Обсудить варианты [[Сервис Ansible#Использование handlers]]
* Развертывание кластера приложения с [[Сервис Ansible#Использование ролей]] Ansible
==== Вопросы ====
- Что общего и в чем отличие между Ansible, Vagrant и Terraform?
- Что означает термин Provision в Vagrant?
- Что такое module, playbook, role в Ansible?
- Назовите каталоги в роли Ansible
- Что должно быть установлено на целевой системе для управления через Ansible?
- Каким образом Vagrant управляет VM?
- Как реализован Ansible provision в Vagrant?
===== Модуль 4. Continuous Integration =====
==== Теория ====
* [[https://ru.wikipedia.org/wiki/Непрерывная_интеграция]]
* [[https://simpleone.ru/glossary/ci-cd-cd-continuous-integration-continuous-delivery-continuous-deployment|CI/CD/CD. Continuous Integration / Continuous Delivery / Continuous Deployment]]
* [[https://youtu.be/FeD6VBY2Xss|Вебинар: Вход в CI/CD для Linux-админа]]
* [[https://habr.com/ru/articles/716454/|Статья: Самый простой пример CI/CD]]
==== Лабораторные работы: От Git к CI/CD ====
=== 4.1 Обзор GitLab ===
* [[Инструмент GitLab#Установка из репозитория]]
!!! Методическая рекомендация, скачать gitlab-runner из лабораторной работы 4.2
* [[Инструмент GitLab#Управление пользователями]] (назначить УЗ student администратором)
* Создаем новый репозиторий (Project name: openvpn1, Private, без README) в GitLab
* Пользуясь инструкцией к проекту, включаем [[Сервис Git]] для каталога openvpn1 и помещаем его в GitLab
=== 4.2 Запуск пайплайнов из .gitlab-ci в gitlab-runners ===
* [[Инструмент GitLab#Установка из пакета]] GitLab Runner на server и его [[Инструмент GitLab#Регистрация]] с меткой **ansible** и исполнителем **shell**
* Используя GitLab Pipeline Editor добавляем в проект openvpn1 [[Инструмент GitLab#Пример shell ansible]] Pipeline и наблюдаем "выкатку" в "прод" после Commit в ветку main
==== Вопросы ====
- Чем отличается GitLab от Git?
- Для чего нужен GitLab Runner?
- Как называется файл для CI/CD в GitLab?
===== Модуль 5. Обзор задач QA =====
==== Теория ====
* [[https://testengineer.ru/dorogostoyashchie-bagi/|7 эпичнейших багов в истории человечества]]
* [[https://ru.wikipedia.org/wiki/Тестирование_программного_обеспечения]]
* [[https://www.atlassian.com/ru/continuous-delivery/software-testing/types-of-software-testing|Различные виды тестирования ПО]]
* [[https://ru.wikipedia.org/wiki/Ручное_тестирование]]
* [[https://ru.wikipedia.org/wiki/Автоматизированное_тестирование]]
* [[https://ru.wikipedia.org/wiki/Lint]]
* [[https://ru.wikipedia.org/wiki/Smoke_test]]
* [[https://eurobyte.ru/articles/v-chem-otlichiya-nagruzochnogo-ot-stress-testirovaniya/|В чем отличия нагрузочного от стресс-тестирования]]
==== Лабораторные работы: Задачи тестирования ====
=== 5.1 Ручное тестирование функциональности и работа с ветками проекта ===
* Понадобится win client2 (ip/m: 172.16.1.100+X/24, dns: 172.16.1.254)
* Для подключения используем [[Сервис Keepalived]] в режиме [[Сервис Keepalived#Настройка балансировки нагрузки]] и corpX.ovpn ([[Пакет OpenVPN#Настройка клиента]]) в windows или linux
* Добавить [[Сервисы Gateway и routing#Управление таблицей маршрутизации]] на gate (можно отключить маршрут в LAN и настроить [[Сервис NAT]] для зрелищности, !!! вернуть обратно для доп. работ)
* Добавляем параметры dhcp-option,block-outside-dns и Commit в test с созданием Merge requests и наблюдаем "выкатку" в "тестовую" среду, проверяем работу сервиса в ней
* Одобряем Merge requests и наблюдаем "выкатку" в "прод"
=== 5.2 Тестирование в этапах развертывания образа приложения в Docker среде ===
!!! Методическая рекомендация, включить GitLab Docker Registry из этой лабораторной работы
* [[Язык программирования Golang#golangci-lint]] кода приложения
* Сборка образа [[Технология Docker#Приложение golang gowebd]]
* [[Технология Docker#Smoke test]] работоспособности приложения
* Размещение образа приложения в Registry
* Включаем [[Инструмент GitLab#GitLab Docker Registry]]
* Включаем [[Технология Docker#Insecure Private Registry]] и [[Технология Docker#Аутентификация в Registry]]
* Создаем (Public, без README) проект gowebd
* Cохраняем образ, [[Технология Docker#Использование Private Registry]]
!!! Методическая рекомендация, запустить установку minikube из лабораторной работы 6.1
* Можно продемонстрировать развертывание приложения на nodeN
=== 5.3 Тестирование в процессе CI и управление версиями ===
* Проводим [[Инструмент GitLab#Установка в виде контейнера]] gitlab-runner на gate
* Используем [[Инструмент GitLab#Регистрация DooD]] для добавления runner в проект gowebd
* Отключаем gowebd->CI/CD Settings->Auto DevOps
* Добавляем в папку gowebd [[Инструмент GitLab#Пример CI с использованием контейнеров]]
* Используя инструкции из GitLab добавляем папку в проект и наблюдаем сборку образа с тэгом commit hash
* Можно продемонстрирорвать Smoke test, заменив порт в коде
* Останавливаем, очищаем конфигурацию [[Инструмент GitLab#Установка в виде контейнера]] gitlab-runner на gate
* Удаляем Runner в GitLab
* [[Технология Docker#Обзор и удаление]] (преподавателю можно всех) образов c gate
* Отключаем [[Технология Docker#Insecure Private Registry]]
* Повторяем [[Инструмент GitLab#Установка в виде контейнера]] gitlab-runner на gate
* Используем [[Инструмент GitLab#Регистрация DinD]] для добавления runner в проект gowebd
* Добавляем необходимые для DinD элементы конфигурации в [[Инструмент GitLab#Пример CI с использованием контейнеров]]
* Увеличиваем версию и наблюдаем сборку образа с тэгом commit hash
* Можно продемонстрирорвать Lint test, добавив лишнюю переменную в коде
* Используем Git тэги ([[Сервис Git#Обновление сетевого репозитория из локального]] или Code->Tags) для указания версии Docker образов
==== Вопросы ====
- Что такое "ветка" в Git и почему переименовали master в main?
- Из каких частей состоит имя образа?
- Как работает DooD и DinD?
- Что такое Linter?
- Что такое Smoke test?
===== Модуль 6. Kubernetes =====
==== Теория ====
* [[https://timeweb.cloud/blog/sistemy-orkestracii-kontejnerov|Системы оркестрации контейнеров: что такое и лучше для вашего проекта]]
* [[https://habr.com/ru/articles/589415/|K8S для начинающих. Первая часть]]
* [[https://habr.com/ru/amp/publications/651653/|K8S для начинающих. Часть вторая]]
==== Лабораторные работы: Работа с minikube, cоздание deployment и service ====
=== 6.1 Установка minikube ===
* Для доступа к репозиторию, понадобится включить [[Сервисы Gateway и routing]]
* [[Система Kubernetes#Установка minikube]] для gitlab-runner@server (можно, если будет время, показать CD)
=== 6.2 Создание deployment и service ===
* Изучаем [[Система Kubernetes#Базовые объекты k8s]] - [[Система Kubernetes#Deployment]] и [[Система Kubernetes#Service]]
* Для понимания работы [[Система Kubernetes#Ingress]] (будет в следующем курсе), можно продемонстрировать использование [[Сервис HTTP#Прокси "красивого" URL в приложение (пример 3)|Nginx]] для доступа к приложению webd в minikube с хост системы
* Если есть 30 минут, можно показать CD через envsubst "**3.3 Разворачивание нужной версии приложения в kubernetes**" из Девопс2
* Понадобится назначить метку k8s-deploy ранеру и
server# cp -v /home/gitlab-runner/.minikube/cache/linux/amd64/v*/kubectl /usr/local/bin/
* Можно показать все, используя Web IDE
==== Вопросы ====
* Почему Kubernetes часто обозначают K8s?
* Чем K8s отличается от Docker-Compose?
* Что используется для описания состояния объектов в K8s?
* Как связаны понятия Deployment, Replica Sets, Pods?
* Для чего используются Namespace?
===== Модуль 7. Дополнительные материалы =====
* [[Вход в Jenkins]] и процесс непрерывной интеграции для администратора Linux (выполняем работы с 00:05:30 до конца)
* [[Зачем нужен Kubernetes]] (выполняем работы с 00:02:45 до 00:53:00 и с 01:08:33 до конца), понадобятся [[Средства программирования shell#Ресурсы Web сервера на shell]]
* [[On-premise Terraform|Развертывание инфраструктуры в On-premise облаке с использованием Terraform]] (выполняем работы с 00:10:15 до 00:35:30 и с 00:40:45 до конца)
* Понадобится освободить ресурсы и исключить кофликт по IP адресам, остановив узлы кластера
Administrator@RAZLIV_48 ~/conf/vagrant/nodes (master)
λ vagrant halt
* Понадобится развернуть VM home-computer ([[Технология VirtualBox#Вложенная виртуализация]]) подключить к сети класса (WAN), увеличить RAM до 8192, запустить, назначить hostname, выяснить IP адрес и подключиться PuTTY
* Понадобится установить VNC [[https://www.tightvnc.com/download.php]], все по умолчанию
* Перед "Шаг 3": перенести home-computer в LAN, назанчить IP .200 из сети 192.168.X.0/24 и считать ее "домашней сетью"
* Шаг 4 - в режиме просмотра