====== 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 - в режиме просмотра