====== DevOps1. Основные инструменты ======
===== Программа курса =====
* [[https://www.specialist.ru/course/kuber|DevOps. Уровень 1. Инфраструктура как код, основные инструменты]]
* [[https://www.specialist.ru/track/dp-devops|ДП-ДЕВОПС-М]]
* [[https://dzen.ru/a/ZVIBk2kT0ntemhwK|∞ Дорожная карта DevOps-инженера в 2023 году]]
===== Модуль 0. Подготовка стенда в классе =====
* Узнать свой номер стенда
* Проверить наличие дистрибутивов и образов (будет сделано)
* Использовать кэширующий прокси для ускорения загрузки
===== Модуль 1: Развертывание стенда =====
==== Теория ====
* Разворачиваем стенд курса [[https://www.specialist.ru/course/yun2-b|Linux. Уровень 2. Администрирование сервисов и сетей]]
==== Лабораторные работы: Развертывание стенда ====
=== 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 настройка сервиса DNS ===
* [[Финальная настройка DNS сервера]]
server:~# sh conf/dns.sh
* Настройка клиента DNS на gate и server
# cat /etc/resolv.conf
search corpX.un
nameserver 192.168.X.10
# nslookup ns
==== Вопросы ====
===== Модуль 2: От Git к SCM к CI/CD =====
* !!! Заранее выполняем на server
* Установку [[Инструмент Gitea]]
* Установку [[Сервис JRE]] (и на gate)
* Установку [[Инструмент Jenkins]] !!! и установку плагинов !!!
* Установку [[Сервис Ansible]]
* Cкачать deb пакет [[Инструмент GitLab#GitLab Runner]]
* Установку [[Инструмент GitLab]]
* !!! Заранее выполняем на host системе
* Технология Vagrant [[Технология Vagrant#Установка]]
==== Теория ====
* [[Сервис Git]]
==== Лабораторные работы: От Git к CI/CD====
=== 2.1 Вспоминаем Git ===
* [[Сервис Git]] для каталога /etc на gate (демонстрирует преподаватель)
* [[Сервис DHCP]]
gate:~# sh conf/dhcp.sh
* [[Сервис DHCP#Статистика DHCP сервера]]
* [[Установка ПО из исходных текстов#Использование утилиты make]] (установить)
* [[Модуль AppArmor#Определение наличия и правка профилей для служб]] (удалить профиль) !!! перед перезагрузкой gate, проверить, не качается ли что-то на server !!!
gate# su - student
* [[Установка ПО из исходных текстов#Использование make для сопровождения файлов конфигурации сервиса]]
* [[Сервис Git]] для каталога ~student/dhcp/ на gate (лучше в следующей лабораторной)
=== 2.2 Знакомимся с SCM Gitea ===
* [[Инструмент Gitea]]
* Подключаемся как student, Repository Name: dhcp
* [[Сервис Git#Обновление сетевого репозитория из локального]] (копируем инструкции из подсказки)
* Редактируем dhcpd.conf в Gitea (Commit to master branch)
=== 2.3 Знакомимся с Jenkins CI/CD ===
* [[Сервис DHCP#Статистика DHCP сервера]]
* [[Сервис Git#Клонирование и обновление локального репозитория из сетевого]] (можно как root на gate)
* [[Установка ПО из исходных текстов#Использование make для сопровождения файлов конфигурации сервиса]]
* [[Инструмент Jenkins]]
=== 2.4 Знакомимся с GitLab CI/CD ===
* [[https://youtu.be/FeD6VBY2Xss|Вебинар: Вход в CI/CD для Linux-админа]]
* [[https://habr.com/ru/articles/716454/|Статья: Самый простой пример CI/CD]]
* Установка [[Инструмент GitLab]]
* http://server.corpX.un/
* Используем [[Инструмент GitLab#Управление пользователями]] в GitLab для назначении пароля пользователю root и создания учетной записи student (лучше назначить его администратором)
!!! в теме Ansible
* Создаем новый репозиторий (Project name: openvpn1, Private, без README) в GitLab
* Пользуясь инструкцией к проекту, включаем [[Сервис Git]] для каталога openvpn1 (ubuntu20 ветка master) и помещаем его в GitLab
* Устанавливаем и регистрируем [[Инструмент GitLab#GitLab Runner]] (shell) на server
* Используя GitLab Pipeline Editor добавляем в проект openvpn1 [[Инструмент GitLab#Пример shell ansible]] Pipeline и наблюдаем выкатку в прод после Commit в master/main
* Добавляем параметры dhcp-option,block-outside-dns и Commit в test с созданием Merge requests и наблюдаем выкатку в тестовую среду, проверяем работу сервиса в ней
* Одобряем Merge requests и наблюдаем выкатку в прод
* Дополнительное задание - добавить [[Пакет OpenVPN#Тестирование конфигурации]] перед деплоем
==== Вопросы ====
- Чем отличается GitLab от Git?
- Что делают операции add, commit, push в Git?
- Для чего нужен GitLab Runner?
- Как называется файл для CI/CD в GitLab?
- Что такое "ветка" в Git и почему переименовали master в main?
===== Модуль 3: Инфраструктура как код =====
==== Теория ====
* Построение ландшафта инфраструктуры на примере [[Технология Vagrant]]
* Построение ландшафта облачной инфраструктуры с использованием [[https://ru.wikipedia.org/wiki/Terraform|HashiCorp Terraform]]
* Видео урок: [[On-premise Terraform]]
* Управление инфраструктурой на примере [[Сервис Ansible]]
==== Лабораторные работы: Использование Vagrant ====
=== 3.1 Использование Vagrant ===
* Добавляем DNS записи nodeN A 192.168.X.200+N в [[Сервис DNS#Настройка мастер сервера зоны corpX.un]]
* Обзор команд [[Технология VirtualBox]]
* Развертываем с использованием [[Технология Vagrant]] node1,2,3
=== 3.2 Использование Ansible ===
* [[Сервис Ansible]], модуль apt на примере openvpn, playbook docker (только слушатели), можно addusers.yml (для OpenVPN)
* Преподаватель импортирует систему Windows для тестирования OpenVPN
* C [[Сервис Ansible#Использование ролей]] разворачиваем [[Пакет OpenVPN]] в конфигурации с [[Пакет OpenVPN#Использование PAM аутентификации]] на node1,2,3 (не забыть про [[Сервисы Gateway и routing#Управление таблицей маршрутизации]] на gate)
* Для подключения используем [[Сервис Keepalived]] в режиме [[Сервис Keepalived#Настройка балансировки нагрузки]] и corpX.ovpn ([[Пакет OpenVPN#Настройка клиента]]) в windows или linux
* Можно добавить [[Сервис NAT]] для зрелищности
* **Лабораторная работа 2.4**
=== 3.3 Использование Ansible в Vagrant ===
* Преподаватель демонстрирует установку docker на node1,2,3 с [[Сервис Ansible#Использование playbook]] для [[Технология Vagrant#Provision с использованием ansible]] в Vagrant
==== Вопросы ====
- Что общего и в чем отличие между Ansible, Vagrant и Terraform?
- Что означает термин Provision в Vagrant?
- Что такое module, playbook, role в Ansible?
- Назовите каталоги в роли Ansible
- Что должно быть установлено на целевой системе для управления через Ansible?
- Каким образом Vagrant управляет VM?
- Как реализован Ansible provision в Vagrant?
===== Модуль 4: Распространение ПО с использованием контейнеров =====
==== Теория ====
* [[Технология Docker]]
==== Лабораторные работы: Работа с контейнерами Docker ====
=== 4.1 Разработка и нагрузочное тестирование приложения webd ===
* Преподаватель использует linux систему external-host для нагрузочного тестирования и демонстрирует "разработку" приложения на VM server
* [[Средства программирования shell#Web сервер на shell]] (методически, для обсуждения кода, можно, для упрощения, удалить из него все за комментированные строки, но не сохранять. Так же, можно вывести в лог [[Сервис HTTP#Пример HTTP диалога]])
* [[Сервис INETD]]
* Через [[Сервис Keepalived#Настройка балансировки нагрузки]] в Keepalived предоставляем доступ снаружи
* [[https://github.com/wg/wrk|wrk - a HTTP benchmarking tool]]
* [[https://lindevs.com/install-vegeta-on-ubuntu|Install Vegeta on Ubuntu 20.04]]
* [[https://github.com/tsenart/vegeta/releases|github/tsenart/vegeta/releases]]
* [[https://val.bmstu.ru/unix/WWW/vegeta_12.12.0_linux_amd64.tar.gz]]
* [[https://serverfault.com/questions/389645/ftp-tcp-server-failing-looping|ftp/tcp server failing (looping)]]
* duration=60s rate=400 выдерживают 10 экземпляров приложения
* в качестве external-host можно использовать gate
cmd> route add 172.16.1.0 mask 255.255.255.0 10.5.N.178
external-host# curl http://172.16.1.X
external-host# echo "GET http://172.16.1.X" | vegeta attack -duration=20s -rate=100 | vegeta report
server# tail -f /var/log/syslog
=== 4.2 Использование технологии Docker и docker-compose для масштабирования приложения webd на одном узле ===
* Устанавливаем [[Технология Docker]] на server, и рассматриваем [[Технология Docker#Создание образа для приложения вручную]] и образа из него (из под root)
* Рассматриваем [[Технология Docker#Запуск в режиме демона и подключение к контейнеру]]
* Изучаем [[Технология Docker#Процессы контейнера и системы]] и [[Технология Docker#Анализ параметров запущенного контейнера]] (преподаватель, можно на node1, пока у всех ставится docker)
* Для удобства, выполнить [[Настройка командных интерпретаторов]]
* Используя [[Технология Docker#Предоставление прав непривилегированным пользователям]] для gitlab-runner (пригодится для процесса CD в minikube), знакомимся с [[Технология Docker#Создание образа для приложения с использованием Dockerfile]]
* [[Технология Docker#Запуск в режиме демона и подключение к контейнеру]] несколько копий вручную, и, через [[Сервис Keepalived#Настройка балансировки нагрузки]], повторяем нагрузочное тестирование (преподаватель)
* Знакомимся с [[Технология Docker#docker-compose]] для запуска нескольких копий приложения (без sftp и vol)
=== 4.3 Использование технологии Docker Registry для распространения приложения webd ===
Методически, достаточно показать на node1
* Создаем (Public, без README) проект webd
* Размещаем каталог webd в [[Сервис Git#On-Premise gitlab]] пользуясь инструкцией к проекту (можно в теме 4.4)
* Включаем [[Инструмент GitLab#GitLab Docker Registry]]
* Cохраняем образ, используя [[Технология Docker#Локальные репозитории]]
* [[Сервис NFS]] на server (преподаватель)
* [[Сервис NFS#Установка nfs клиента]] на node1,2,3 и монтирование /var/www
* Проверяем наличие, или [[Технология Docker#Установка|устанавливаем]] Docker на node1,2,3
* Используя доступ к [[Технология Docker#Локальные репозитории]] на node1,2,3 запускаем приложение
=== 4.4 GitLab CI для Docker images ===
* Размещаем каталог webd в [[Сервис Git#On-Premise gitlab]] пользуясь инструкцией к проекту
* Автоматизируем сборку образа используя [[Средства программирования shell#Проверка синтаксиса]] и [[Инструмент GitLab#Пример shell docker]] GitLab CI/CD, не забыв назначить метки Gitlab Runner. Можно обсудить добавление переменных в проект и вывод их через env
=== 4.5 CD приложения webd с использованием docker-compose ===
* Модифицируем [[Технология Docker#docker-compose]] для загрузки и запуска нескольких копий приложения и тестируем на server
* Используя [[Инструмент GitLab#Подключение через API]] скачиваем на node1,2,3 файл [[Технология Docker#docker-compose]] запускаем несколько экземпляров приложения и, через [[Сервис Keepalived#Настройка балансировки нагрузки]], повторяем нагрузочное тестирование
* Считаем, что пришлось делать "вручную": выбирать узлы, монтировать nfs, загружать файл docker-compose, выяснять порты - выход: [[Система Kubernetes]]
==== Вопросы ====
- Зачем нужен Docker?
- Чем Docker отличается от LXC?
- Из каких частей состоит имя образа?
- Чем Docker контейнер отличается от Docker образа?
- Как ПО в Docker контейнере может взаимодействовать с системой и другими контейнерами?
- Зачем нужен Dockerfile?
- Зачем "запихивать" сразу много инструкций в команду RUN?
- Зачем нужен docker-compose?
===== Модуль 5: Управление ПО с использованием Kubernetes =====
==== Теория ====
* [[Система Kubernetes]]
==== Лабораторные работы: Тема лабораторных работ ====
=== 5.1 Установка и подключение к k8s ===
* Может закончиться место на диске VM server и понадобиться [[Управление ПО в Linux#Удаление архива установленных пакетов]] плюс отключение [[Инструмент GitLab#GitLab Prometheus]] или [[Управление файловыми системами в Linux#Расширение существующего логического тома]]
* Производим [[Система Kubernetes#Установка minikube]] для gitlab-runner@server (для доступа к репозиторию, на нем же, понадобится включить [[Сервисы Gateway и routing]])
=== 5.2 Базовые объекты k8s ===
* [[Настройка командных интерпретаторов]] (gitlab-runner@server)
* Изучаем [[Система Kubernetes#Базовые объекты k8s]]
* Для понимания работы [[Система Kubernetes#Ingress]] (понадобится в следующем курсе), настраиваем [[Сервис HTTP#Прокси "красивого" URL в приложение (пример 3)|Nginx]] для доступа к приложению webd в minikube с хост системы
* Настраиваем [[Сервис Keepalived#Настройка балансировки нагрузки|Keepalived]] и тестируем [[Утилита curl]]
* Тестируем livenessProbe с extern-host
extern-host# cat /etc/hosts
...
172.16.1.X webd.corpX.un
или
ext-host:~# echo "GET http://webd.corpX.un" | vegeta attack -duration=20s -rate=400 -connect-to webd.corpX.un:80:172.16.1.X:80 | vegeta report
=== 5.3 Deploy в k8s ===
* Автоматизируем deploy используя [[Инструмент GitLab#Пример shell Kubernetes]] GitLab CD (см. выше)
* Тестируем "выкатку" новой версии приложения через запрос несуществующего файла и [[Система Kubernetes#Версии deployment]]
* Столкнувшись с необходимостью править версию в манифесте, рассмотрев вариант с envsubst в [[Инструмент GitLab#Пример shell Kubernetes]], видим необходимость в Helm
* В финале, можно "закоммитить" новую версию приложения прямо в GitLab
==== Вопросы ====
* Почему Kubernetes часто обозначают K8s?
* Чем K8s отличается от Docker-Compose?
* Что используется для описания состояния объектов в K8s?
* Как связаны понятия Deployment, Replica Sets, Pods?
* Для чего используются Namespace?
===== Дополнительные материалы =====