====== Введение в DevOps ====== ===== Программа курса ===== * [[https://www.specialist.ru/course/kuber|DevOps. Уровень 1. Инфраструктура как код, основные инструменты]] * [[https://www.specialist.ru/track/dp-devops|ДП-ДЕВОПС-М]] ===== Модуль 0. Подготовка стенда в классе ===== * Узнать свой номер стенда * Проверить наличие дистрибутивов и образов (будет сделано) * Использовать кэширующий прокси для ускорения загрузки ===== Модуль 1: Развертывание стенда ===== ==== Теория ==== * Разворачиваем стенд курса [[https://www.specialist.ru/course/yun2-b|Linux. Уровень 2. Администрирование сервисов и сетей]] ==== Лабораторные работы: Развертывание стенда ==== === 1.1 Схема стенда, импорт, настройка и запуск VM gate и server === Запустите с правами Administrator C:\cmder\cmder.exe bash cd git clone http://val.bmstu.ru/unix/conf.git cd conf/virtualbox/ !!! 8 - это номер курса, вместо X укажите Ваш номер стенда, если не знаете его, спросите преподавателя !!! ./setup.sh X 8 === 1.2 Настройка сети VM gate и server === * !!! Добавить HDD 20GB к server * [[Настройка стендов слушателей#Настройка виртуальных систем Unix]] с использованием [[Настройка стендов слушателей#Скрипты автоконфигурации]] * gate # sh net_gate.sh # init 6 * server # sh net_server.sh # init 6 * Создать в Putty профили gate, server и подключиться === 1.3 настройка сервиса DNS === * [[Управление файловыми системами в Linux#Использование LVM]] * [[Финальная настройка 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 к GitLab CI/CD ===== * !!! Заранее выполняем на server * [[Переменные окружения#Установка переменных окружения]] http_proxy, https_proxy и no_proxy * Установку [[Сервис Ansible]] * Установку [[Инструмент GitLab]] !!! запустить до первого перерыва * !!! Заранее выполняем на host системе * Технология Vagrant [[Технология Vagrant#Установка]] ==== Теория ==== * [[Сервис Git]] * [[Инструмент GitLab]] ==== Лабораторные работы: От Git к GitLab ==== === 2.1 Вспоминаем Git === * [[Сервис Git]] для каталога /etc на gate (демонстрирует преподаватель) * [[Сервис DHCP]] gate:~# sh conf/dhcp.sh * [[Сервис DHCP#Статистика DHCP сервера]] * [[Установка ПО из исходных текстов#Использование утилиты make]] (установить) * [[Модуль AppArmor#Определение наличия и правка профилей для служб]] !!! проверить, закачался ли GitLab !!! gate# su - student * [[Установка ПО из исходных текстов#Использование make для сопровождения файлов конфигурации сервиса]] * [[Сервис Git]] для каталога ~student/dhcp/ на gate === 2.2 Знакомимся с GitLab === !!! Если GitLab к этому времени не установился, начать тему Vagrant * http://server.corpX.un/ * Используем [[Инструмент GitLab#Управление пользователями]] в GitLab для отключения авто регистрации, назначении пароля пользователю root и создания учетной записи student * http://server.corpX.un:81/mail * Подключаемся как student, New Blank Project (Project name: dhcp, без README) * [[Сервис Git#Обновление сетевого репозитория из локального]] * Редактируем dhcpd.conf в GitLab IDE (Commit to master branch) === 2.3 Знакомимся с GitLab CI/CD === * [[Сервис DHCP#Статистика DHCP сервера]] * [[Сервис Git#Клонирование и обновление локального репозитория из сетевого]] (можно тем же student на gate) * [[Установка ПО из исходных текстов#Использование make для сопровождения файлов конфигурации сервиса]] * Устанавливаем [[Инструмент GitLab#GitLab Runner]] (shell) на gate и регистрируем в GitLab * Используем [[Пакет sudo]] для разрешений пользователя gitlab-runner * [[Инструмент GitLab#GitLab CI/CD]] * Экспериментируем или смотри вебинар :) [[https://youtu.be/FeD6VBY2Xss|Вход в CI/CD для Linux-админа]] === 2.4 Работа с ветками в GitLab CI/CD === !!! в теме Ansible * Создаем новый репозиторий (Project name: openvpn1, без README) в GitLab * Пользуясь инструкцией к проекту, включаем [[Сервис Git]] для каталога openvpn1 (ubuntu20 ветка master) и помещаем его в GitLab (можно сразу добавить GitLab Runner и CI/CD для выкатки в прод) * Используем [[Сервис Git#Клонирование и обновление локального репозитория из сетевого]] проекта openvpn1 на локальную систему в [[Cmder]] (!!! появляется скрытое окно, в котором надо нажать Ок) и открываем проект в npp * Используем [[Сервис Git#Работа с ветками]] в Git для тестовой конфигурации в [[Сервис Ansible#Роль OpenVPN сервера]] (можно добавить и протестировать настройки push...dhcp...dns) * Устанавливаем и регистрируем [[Инструмент GitLab#GitLab Runner]] (shell) на server * Используем GitLab CI/CD [[Инструмент GitLab#Пример shell ansible]] для сервиса OpenVPN с ручным тестированием конфигурации * Используем [[Сервис Git#Работа с ветками]] в Git для переноса изменений ветки test в master * Дополнительное задание - добавить [[Пакет 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]] * Управление инфраструктурой на примере [[Сервис 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]] openvpn, docker (только слушатели), можно addusers.yml для OpenVPN * Преподаватель импортирует систему Windows для тестирования OpenVPN * Разворачиваем [[Пакет OpenVPN]] в конфигурации с [[Пакет OpenVPN#Использование PAM аутентификации]] на node1,2,3 с [[Сервис Ansible#Использование ролей]] * Для подключения используем [[Сервис Keepalived]] в режиме [[Сервис Keepalived#Настройка балансировки нагрузки]] и client.ovpn ([[Пакет OpenVPN#Настройка клиента]]) в windows * Можно добавить [[Сервис NAT]] для зрелищности * **Лабораторная работа 2.4** === 3.3 Использование Ansible в Vagrant === * Преподаватель демонстрирует установку docker на node1,2,3 с [[Сервис Ansible#Использование playbook]] 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]] (методически, для обсуждения кода, можно, для упрощения, удалить из него все за комментированные строки) * [[Сервис INETD]] * Через [[Сервис Keepalived#Настройка балансировки нагрузки]] в Keepalived предоставляем доступ снаружи * [[https://lindevs.com/install-vegeta-on-ubuntu|Install Vegeta on Ubuntu 20.04]] * [[https://serverfault.com/questions/389645/ftp-tcp-server-failing-looping|ftp/tcp server failing (looping)]] * duration=60s rate=400 выдерживают 10 экземпляров приложения * в качестве external-host можно использовать gate external-host# curl http://172.16.1.X external-host# echo "GET http://172.16.1.X" | vegeta attack -duration=60s -rate=400 | vegeta report server# tail -f /var/log/syslog === 4.2 Использование технологии Docker и docker-compose для масштабирования приложения webd на одном узле === * Устанавливаем [[Технология Docker]] на server * Используя su - gitlab-runner (пригодится для тестов CI/CD из командной строки, для удобства работы выполнить [[Настройка командных интерпретаторов]]), знакомимся с технологией и упаковываем приложение (без sftp) в Docker образ * Запускаем несколько копий вручную, и, через [[Сервис Keepalived#Настройка балансировки нагрузки]], повторяем нагрузочное тестирование * Знакомимся с [[Технология Docker#docker-compose]] для запуска нескольких копий приложения === 4.3 Использование технологии Docker Registry для распространения приложения webd === Методически, достаточно показать на node1 * Создаем (без README) проект webd и размещаем каталог webd в [[Сервис Git#On-Premise gitlab]] пользуясь инструкцией к проекту * Включаем [[Инструмент GitLab#GitLab Docker Registry]] * Cохраняем образ, используя [[Технология Docker#Локальные репозитории]] * [[Сервис NFS]] на server (преподаватель) * [[Сервис NFS#Установка nfs клиента]] на node1,2,3 и монтирование /var/www * Проверяем наличие, или устанавливаем Docker на node1,2,3 * Используя доступ к [[Технология Docker#Локальные репозитории]] на node1,2,3 запускаем несколько экземпляров приложения и, через [[Сервис Keepalived#Настройка балансировки нагрузки]], повторяем нагрузочное тестирование === 4.4 GitLab CI для Docker images === * Автоматизируем сборку образа используя [[Средства программирования shell#Проверка синтаксиса]] и [[Инструмент GitLab#GitLab CI/CD]], проверяем "в ручном" режиме, а затем, в автоматическом, не забыв назначить переменные проекта, метки Gitlab Runner и сделав add, commit и push === 4.5 CD приложения webd с использованием docker-compose === * Модифицируем [[Технология Docker#docker-compose]] для загрузки и запуска нескольких копий приложения и тестируем на server * Используя [[Инструмент GitLab#Подключение через API]] скачиваем на node1,2,3 файл [[Технология Docker#docker-compose]] и запускаем * Считаем, что пришлось делать "вручную": выбирать узлы, монтировать 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]]) * [[Система Kubernetes#Инструмент командной строки kubectl]] для gitlab-runner@server === 5.2 Базовые объекты k8s === * Изучаем [[Система Kubernetes#Базовые объекты k8s]] * Для понимания работы [[Система Kubernetes#Ingress]], настраиваем [[Сервис HTTP#NGINX]] для доступа к приложению webd в minikube с хост системы * Тестируем livenessProbe с extern-host extern-host# cat /etc/hosts ... 172.16.1.X webd.corpX.un === 5.3 Deploy в k8s === * Автоматизируем deploy используя [[Инструмент GitLab#GitLab CI/CD]], сталкиваемся с необходимостью править версию в манифесте, рассмотрев вариант envsubst видим необходимость в Helm === 5.4 Helm в k8s (следующий курс :) === * [[https://www.specialist.ru/course/devops2|DevOps. Уровень 2. Использование Kubernetes]] * Разворачиваем новый [[Система Kubernetes#Кластер Kubernetes]] из node1,2,3 * Тестируем, используя [[Система Kubernetes#Базовые объекты k8s]] из Docker Hup, в процессе подключив [[Система Kubernetes#Инструмент командной строки kubectl]] gitlab-runner@server к новому кластеру * Тестируем [[Система Kubernetes#Базовые объекты k8s]] из локального репозитория и deploy [[Инструмент GitLab#GitLab CI/CD]] в новом кластере (потребуется [[Система Kubernetes#Настройка доступа к Insecure Private Registry]] и, при использовании nfs-volume, [[Сервис NFS#Установка nfs клиента]] на node1,2,3) * Используем [[Система Kubernetes#Helm]] Chart для развертывания и тестирования [[Система Kubernetes#Ingress]] в новом кластере * Создаем [[Система Kubernetes#Helm]] Chart для развертывания приложения webd (предварительно проводим [[Система Kubernetes#Удаление объектов]] deployment, service и [[Система Kubernetes#Ingress]] (можно весь namespace my-ns) и добавляем index.html в [[Технология Docker#Создание образа для приложения с использованием Dockerfile]] для упрощения примера) * Используем [[Система Kubernetes#Helm]] Chart для deploy приложения webd в [[Инструмент GitLab#GitLab CI/CD]], демонстрируем history и rollback * Через [[Сервис Keepalived#Настройка балансировки нагрузки]] в Keepalived предоставляем доступ снаружи для тестирования нагрузки и отказоустойчивости * [[Система Kubernetes#Работа со своим репозиторием]] для Helm Charts ==== Вопросы ==== * Почему Kubernetes часто обозначают K8s? * Чем K8s отличается от Docker-Compose? * Что используется для описания состояния объектов в K8s? * Как связаны понятия Deployment, Replica Sets, Pods? * Для чего используются Namespace? * Что общего и в чем различие между Service и Ingress? * Что используется для подключения Pod к общим файлам? * Для чего нужен Helm и что используется для его описания? ===== Дополнительные материалы =====