This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
введение_в_devops [2022/09/28 07:16] val [Вопросы] |
введение_в_devops [2023/02/04 10:01] val [Введение в DevOps] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Введение в DevOps ====== | ====== Введение в DevOps ====== | ||
- | * [[https://www.cisco.com/c/dam/m/ru_ru/training-events/2019/cisco-connect/pdf/netdevops_angrechi_on_site.pdf|Как начать управлять сетью на основе методологии NetDevOpsи перестать бояться изменений в пятницу вечером]] | + | |
===== Программа курса ===== | ===== Программа курса ===== | ||
- | * [[https://www.specialist.ru/course/kuber|Введение в DevOps: инфраструктура как код, использование Docker и Kubernetes]] | + | * [[https://www.specialist.ru/course/kuber|DevOps. Уровень 1. Инфраструктура как код, основные инструменты]] |
+ | * [[https://www.specialist.ru/track/dp-devops|ДП-ДЕВОПС-М]] | ||
===== Модуль 0. Подготовка стенда в классе ===== | ===== Модуль 0. Подготовка стенда в классе ===== | ||
Line 18: | Line 19: | ||
==== Теория ==== | ==== Теория ==== | ||
- | * Разворачиваем стенд курса ЛИН2 | + | * Разворачиваем стенд курса [[https://www.specialist.ru/course/yun2-b|Linux. Уровень 2. Администрирование сервисов и сетей]] |
==== Лабораторные работы: Развертывание стенда ==== | ==== Лабораторные работы: Развертывание стенда ==== | ||
Line 82: | Line 83: | ||
* [[Переменные окружения#Установка переменных окружения]] http_proxy, https_proxy и no_proxy | * [[Переменные окружения#Установка переменных окружения]] http_proxy, https_proxy и no_proxy | ||
* Установку [[Сервис Ansible]] | * Установку [[Сервис Ansible]] | ||
- | * Установку [[Инструмент GitLab]] | + | * Установку [[Инструмент GitLab]] !!! запустить до первого перерыва |
+ | |||
+ | |||
+ | * !!! Заранее выполняем на host системе | ||
+ | * Технология Vagrant [[Технология Vagrant#Установка]] | ||
==== Теория ==== | ==== Теория ==== | ||
Line 98: | Line 103: | ||
gate:~# sh conf/dhcp.sh | gate:~# sh conf/dhcp.sh | ||
</code> | </code> | ||
- | * [[Установка ПО из исходных текстов#Использование утилиты make]] | + | * [[Сервис DHCP#Статистика DHCP сервера]] |
- | * [[Модуль AppArmor#Определение наличия и правка профилей для служб]] !!! проверить, закачался ли gitlab | + | * [[Установка ПО из исходных текстов#Использование утилиты make]] (установить) |
+ | * [[Модуль AppArmor#Определение наличия и правка профилей для служб]] !!! проверить, закачался ли GitLab !!! | ||
<code> | <code> | ||
gate# su - student | gate# su - student | ||
Line 110: | Line 116: | ||
!!! Если GitLab к этому времени не установился, начать тему Vagrant | !!! Если GitLab к этому времени не установился, начать тему Vagrant | ||
- | * [[Инструмент GitLab#Управление пользователями]] в GitLab для создания учетной записи student, так же назначить пароль пользователю root | + | * http://server.corpX.un/ |
+ | * Используем [[Инструмент GitLab#Управление пользователями]] в GitLab для отключения авто регистрации, назначении пароля пользователю root и создания учетной записи student | ||
* http://server.corpX.un:81/mail | * http://server.corpX.un:81/mail | ||
* Подключаемся как student, New Blank Project (Project name: dhcp, без README) | * Подключаемся как student, New Blank Project (Project name: dhcp, без README) | ||
Line 119: | Line 126: | ||
* [[Сервис DHCP#Статистика DHCP сервера]] | * [[Сервис DHCP#Статистика DHCP сервера]] | ||
- | * [[Сервис Git#Клонирование и обновление локального репозитория из сетевого]] (root на gate) | + | * [[Сервис Git#Клонирование и обновление локального репозитория из сетевого]] (можно тем же student на gate) |
* [[Установка ПО из исходных текстов#Использование make для сопровождения файлов конфигурации сервиса]] | * [[Установка ПО из исходных текстов#Использование make для сопровождения файлов конфигурации сервиса]] | ||
Line 131: | Line 138: | ||
!!! в теме Ansible | !!! в теме Ansible | ||
- | + | * Создаем новый репозиторий (Project name: openvpn1, без README) в GitLab | |
- | * Включаем [[Сервис Git]] для каталога openvpn1 и загружаем его в | + | * Пользуясь инструкцией к проекту, включаем [[Сервис Git]] для каталога openvpn1 (ubuntu20 ветка master) и помещаем его в GitLab (можно сразу добавить GitLab Runner и CI/CD для выкатки в прод) |
- | * Создаем новый репозиторий (Project name: openvpn1, без README) в GitLab и пользуясь инструкцией к проекту, добавляем его в ветку main) | + | * Используем [[Сервис Git#Клонирование и обновление локального репозитория из сетевого]] проекта openvpn1 на локальную систему в [[Cmder]] (!!! появляется скрытое окно, в котором надо нажать Ок) и открываем проект в npp |
- | * Загружаем репозиторий openvpn1 на локальную систему в [[Cmder]] (!!! появляется скрытое окно, в котором надо нажать Ок), открываем проект в npp | + | |
* Используем [[Сервис Git#Работа с ветками]] в Git для тестовой конфигурации в [[Сервис Ansible#Роль OpenVPN сервера]] (можно добавить и протестировать настройки push...dhcp...dns) | * Используем [[Сервис Git#Работа с ветками]] в Git для тестовой конфигурации в [[Сервис Ansible#Роль OpenVPN сервера]] (можно добавить и протестировать настройки push...dhcp...dns) | ||
- | * Устанавливаем [[Инструмент GitLab#GitLab Runner]] (shell) на server | + | * Устанавливаем и регистрируем [[Инструмент GitLab#GitLab Runner]] (shell) на server |
- | * Используем GitLab CI/CD [[Инструмент GitLab#Пример shell ansible]] для сервиса OpenVPN с ручным тестированием тестовой конфигурации | + | * Используем GitLab CI/CD [[Инструмент GitLab#Пример shell ansible]] для сервиса OpenVPN с ручным тестированием конфигурации |
- | * Дополнительное задание - добавить тестирование конфигурации перед деплоем | + | * Используем [[Сервис Git#Работа с ветками]] в Git для переноса изменений ветки test в master |
+ | * Дополнительное задание - добавить [[Пакет OpenVPN#Тестирование конфигурации]] перед деплоем | ||
==== Вопросы ==== | ==== Вопросы ==== | ||
Line 144: | Line 151: | ||
- Чем отличается GitLab от Git? | - Чем отличается GitLab от Git? | ||
- Что делают операции add, commit, push в Git? | - Что делают операции add, commit, push в Git? | ||
- | - Что такое "ветка" в Git и почему переименовали master в main? | ||
- Для чего нужен GitLab Runner? | - Для чего нужен GitLab Runner? | ||
- Как называется файл для CI/CD в GitLab? | - Как называется файл для CI/CD в GitLab? | ||
+ | - Что такое "ветка" в Git и почему переименовали master в main? | ||
===== Модуль 3: Инфраструктура как код ===== | ===== Модуль 3: Инфраструктура как код ===== | ||
Line 168: | Line 175: | ||
* Преподаватель импортирует систему Windows для тестирования OpenVPN | * Преподаватель импортирует систему Windows для тестирования OpenVPN | ||
* Разворачиваем [[Пакет OpenVPN]] в конфигурации с [[Пакет OpenVPN#Использование PAM аутентификации]] на node1,2,3 с [[Сервис Ansible#Использование ролей]] | * Разворачиваем [[Пакет OpenVPN]] в конфигурации с [[Пакет OpenVPN#Использование PAM аутентификации]] на node1,2,3 с [[Сервис Ansible#Использование ролей]] | ||
- | * Для подключения используем [[Сервис Keepalived]] в режиме [[Сервис Keepalived#Настройка балансировки нагрузки]] и соответствующей [[Пакет OpenVPN#Настройка клиента]] windows | + | * Для подключения используем [[Сервис Keepalived]] в режиме [[Сервис Keepalived#Настройка балансировки нагрузки]] и client.ovpn ([[Пакет OpenVPN#Настройка клиента]]) в windows |
- | * Лабораторная работа 2.4 | + | * Можно добавить [[Сервис NAT]] для зрелищности |
+ | |||
+ | * **Лабораторная работа 2.4** | ||
=== 3.3 Использование Ansible в Vagrant === | === 3.3 Использование Ansible в Vagrant === | ||
Line 177: | Line 186: | ||
- Что общего и в чем отличие между Ansible, Vagrant и Terraform? | - Что общего и в чем отличие между Ansible, Vagrant и Terraform? | ||
+ | - Что означает термин Provision в Vagrant? | ||
- Что такое module, playbook, role в Ansible? | - Что такое module, playbook, role в Ansible? | ||
- Назовите каталоги в роли Ansible | - Назовите каталоги в роли Ansible | ||
- | - Что должно быть установлено на целевой системе для управления ею через Ansible | + | - Что должно быть установлено на целевой системе для управления через Ansible? |
- Каким образом Vagrant управляет VM? | - Каким образом Vagrant управляет VM? | ||
- | - Для чего предназначен Provision в Vagrant? | ||
- Как реализован Ansible provision в Vagrant? | - Как реализован Ansible provision в Vagrant? | ||
===== Модуль 4: Распространение ПО с использованием контейнеров ===== | ===== Модуль 4: Распространение ПО с использованием контейнеров ===== | ||
Line 187: | Line 196: | ||
==== Теория ==== | ==== Теория ==== | ||
+ | * [[Технология Docker]] | ||
==== Лабораторные работы: Работа с контейнерами Docker ==== | ==== Лабораторные работы: Работа с контейнерами Docker ==== | ||
=== 4.1 Разработка и нагрузочное тестирование приложения webd === | === 4.1 Разработка и нагрузочное тестирование приложения webd === | ||
- | * Преподаватель импортирует linux систему external-host для нагрузочного тестирования | + | * Преподаватель импортирует linux систему external-host для нагрузочного тестирования и демонстрирует "разработку" приложения на VM server |
- | * [[Средства программирования shell#Web сервер на shell]] | + | * [[Средства программирования shell#Web сервер на shell]] (методически, для обсуждения кода, можно, для упрощения, удалить из него все за комментированные строки) |
* [[Сервис INETD]] | * [[Сервис INETD]] | ||
* Через [[Сервис Keepalived#Настройка балансировки нагрузки]] в Keepalived предоставляем доступ снаружи | * Через [[Сервис Keepalived#Настройка балансировки нагрузки]] в Keepalived предоставляем доступ снаружи | ||
* [[https://lindevs.com/install-vegeta-on-ubuntu|Install Vegeta on Ubuntu 20.04]] | * [[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)]] | * [[https://serverfault.com/questions/389645/ftp-tcp-server-failing-looping|ftp/tcp server failing (looping)]] | ||
+ | |||
+ | * duration=60s rate=400 выдерживают 10 экземпляров приложения | ||
+ | * в качестве external-host можно использовать gate | ||
<code> | <code> | ||
external-host# curl http://172.16.1.X | external-host# curl http://172.16.1.X | ||
- | external-host# echo "GET http://172.16.1.X" | vegeta attack -duration=10s -rate=400 | vegeta report | + | external-host# echo "GET http://172.16.1.X" | vegeta attack -duration=60s -rate=400 | vegeta report |
server# tail -f /var/log/syslog | server# tail -f /var/log/syslog | ||
</code> | </code> | ||
- | === 4.2 Использование технологии Docker для распространения приложения webd === | + | === 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 | ||
- | * Упаковываем приложение и знакомимся с [[Технология Docker]] (без sftp) на gitlab-runner@server (удобно для тестов CI/CD из командной строки) не забыв [[Технология Docker#Предоставление прав непривилегированным пользователям]] | + | * Создаем (без README) проект webd и размещаем каталог webd в [[Сервис Git#On-Premise gitlab]] пользуясь инструкцией к проекту |
- | * Создаем проект webd в [[Сервис Git#On-Premise gitlab]] | + | |
* Включаем [[Инструмент GitLab#GitLab Docker Registry]] | * Включаем [[Инструмент GitLab#GitLab Docker Registry]] | ||
- | * Cохраняем образ используя [[Технология Docker#Локальные репозитории]] | + | * Cохраняем образ, используя [[Технология Docker#Локальные репозитории]] |
- | * Автоматизируем сборку образа используя [[Средства программирования shell#Проверка синтаксиса]] и [[Инструмент GitLab#GitLab CI/CD]], не забыв назначить метки Gitlab Runner | + | * [[Сервис NFS]] на server (преподаватель) |
- | * Добавляем и тестируем [[Технология Docker#docker-compose]] для загрузки и запуска нескольких копий приложения | + | * [[Сервис NFS#Установка nfs клиента]] на node1,2,3 и монтирование /var/www |
+ | * Проверяем наличие, или устанавливаем Docker на node1,2,3 | ||
+ | * Используя доступ к [[Технология Docker#Локальные репозитории]] на node1,2,3 запускаем несколько экземпляров приложения и, через [[Сервис Keepalived#Настройка балансировки нагрузки]], повторяем нагрузочное тестирование | ||
- | === 4.3 Горизонтальное масштабирование приложения webd с использованием docker-compose === | + | === 4.4 GitLab CI для Docker images === |
- | Примечание: слушатели делают только "Сервис NFS на server", остальное демонстрирует преподаватель | + | * Автоматизируем сборку образа используя [[Средства программирования shell#Проверка синтаксиса]] и [[Инструмент GitLab#GitLab CI/CD]], проверяем "в ручном" режиме, а затем, в автоматическом, не забыв назначить переменные проекта, метки Gitlab Runner и сделав add, commit и push |
+ | === 4.5 CD приложения webd с использованием docker-compose === | ||
- | * [[Сервис NFS]] на server | + | * Модифицируем [[Технология Docker#docker-compose]] для загрузки и запуска нескольких копий приложения и тестируем на server |
- | * [[Сервис NFS#Установка nfs клиента]] на node1 (достаточно для демонстрации, node2,3 опустим) | + | * Используя [[Инструмент GitLab#Подключение через API]] скачиваем на node1,2,3 файл [[Технология Docker#docker-compose]] и запускаем |
- | * Настраиваем доступ к [[Технология Docker#Локальные репозитории]] на node1,2,3, понадобится в k8s (дополнительное задание - создать ansible playbook для настройки подключения docker к локальному репозиторию) | + | |
- | * Используя [[Инструмент GitLab#Подключение через API]] скачиваем на node1 (node2,3 опустим) файл [[Технология Docker#docker-compose]] и масштабируем | + | |
* Считаем, что пришлось делать "вручную": выбирать узлы, монтировать nfs, загружать файл docker-compose, выяснять порты - выход: [[Система Kubernetes]] | * Считаем, что пришлось делать "вручную": выбирать узлы, монтировать nfs, загружать файл docker-compose, выяснять порты - выход: [[Система Kubernetes]] | ||
==== Вопросы ==== | ==== Вопросы ==== | ||
+ | - Зачем нужен Docker? | ||
+ | - Чем Docker отличается от LXC? | ||
+ | - Из каких частей состоит имя образа? | ||
+ | - Чем Docker контейнер отличается от Docker образа? | ||
+ | - Как ПО в Docker контейнере может взаимодействовать с системой и другими контейнерами? | ||
+ | - Зачем нужен Dockerfile? | ||
+ | - Зачем "запихивать" сразу много инструкций в команду RUN? | ||
+ | - Зачем нужен docker-compose? | ||
===== Модуль 5: Управление ПО с использованием Kubernetes ===== | ===== Модуль 5: Управление ПО с использованием Kubernetes ===== | ||
==== Теория ==== | ==== Теория ==== | ||
+ | * [[Система Kubernetes]] | ||
==== Лабораторные работы: Тема лабораторных работ ==== | ==== Лабораторные работы: Тема лабораторных работ ==== | ||
=== 5.1 Установка и подключение к k8s === | === 5.1 Установка и подключение к k8s === | ||
- | * Может понадобиться [[Управление файловыми системами в Linux#Расширение существующего логического тома]] | + | * Может закончиться место на диске VM server и понадобиться [[Управление ПО в Linux#Удаление архива установленных пакетов]] плюс отключение [[Инструмент GitLab#GitLab Prometheus]] или [[Управление файловыми системами в Linux#Расширение существующего логического тома]] |
* Производим [[Система Kubernetes#Установка minikube]] для gitlab-runner@server (для доступа к репозиторию, на нем же, понадобится включить [[Сервисы Gateway и routing]]) | * Производим [[Система Kubernetes#Установка minikube]] для gitlab-runner@server (для доступа к репозиторию, на нем же, понадобится включить [[Сервисы Gateway и routing]]) | ||
* [[Система Kubernetes#Инструмент командной строки kubectl]] для gitlab-runner@server | * [[Система Kubernetes#Инструмент командной строки kubectl]] для gitlab-runner@server | ||
Line 242: | Line 273: | ||
* Изучаем [[Система Kubernetes#Базовые объекты k8s]] | * Изучаем [[Система Kubernetes#Базовые объекты k8s]] | ||
- | * Для понимания работы [[Система Kubernetes#Ingress]], изучаем [[Сервис HTTP#NGINX]], используя его параллельно [[Система Kubernetes#Ingress]] для доступа к приложению webd с хост системы | + | * Для понимания работы [[Система Kubernetes#Ingress]], настраиваем [[Сервис HTTP#NGINX]] для доступа к приложению webd в minikube с хост системы |
- | * и системы снаружи для тестирования livenessProbe (лучше не использовать DNS View из-зи множества внутренних сетей Docker/K8S) | + | * Тестируем livenessProbe с extern-host |
<code> | <code> | ||
extern-host# cat /etc/hosts | extern-host# cat /etc/hosts | ||
Line 255: | Line 286: | ||
* Автоматизируем deploy используя [[Инструмент GitLab#GitLab CI/CD]], сталкиваемся с необходимостью править версию в манифесте, рассмотрев вариант envsubst видим необходимость в Helm | * Автоматизируем deploy используя [[Инструмент GitLab#GitLab CI/CD]], сталкиваемся с необходимостью править версию в манифесте, рассмотрев вариант envsubst видим необходимость в Helm | ||
- | === 5.4 Helm в k8s === | + | === 5.4 Helm в k8s (следующий курс :) === |
+ | |||
+ | * [[https://www.specialist.ru/course/devops2|DevOps. Уровень 2. Использование Kubernetes]] | ||
- | * Разворачиваем новый [[Система Kubernetes#Кластер Kubernetes]] из node1,2,3, тестируем, используя [[Система Kubernetes#Базовые объекты k8s]] из Docker Hup | + | * Разворачиваем новый [[Система Kubernetes#Кластер Kubernetes]] из node1,2,3 |
- | * Подключаем [[Система Kubernetes#Инструмент командной строки kubectl]] к новому кластеру | + | * Тестируем, используя [[Система Kubernetes#Базовые объекты k8s]] из Docker Hup, в процессе подключив [[Система Kubernetes#Инструмент командной строки kubectl]] gitlab-runner@server к новому кластеру |
- | * Тестируем [[Система Kubernetes#Базовые объекты k8s]] из локального репозитория и deploy [[Инструмент GitLab#GitLab CI/CD]] в новом кластере (при использовании nfs-volume потребуется [[Сервис NFS#Установка nfs клиента]] и [[Система Kubernetes#Настройка доступа к Insecure Private Registry]] на node1,2,3) | + | * Тестируем [[Система Kubernetes#Базовые объекты k8s]] из локального репозитория и deploy [[Инструмент GitLab#GitLab CI/CD]] в новом кластере (потребуется [[Система Kubernetes#Настройка доступа к Insecure Private Registry]] и, при использовании nfs-volume, [[Сервис NFS#Установка nfs клиента]] на node1,2,3) |
- | * Используем [[Система Kubernetes#Helm]] для развертывании [[Система Kubernetes#Ingress]] в новом кластере | + | * Используем [[Система Kubernetes#Helm]] Chart для развертывания и тестирования [[Система Kubernetes#Ingress]] в новом кластере |
- | * Изучаем тему [[Система Kubernetes#Helm]] на примере разработки чарта для приложения webd | + | * Создаем [[Система Kubernetes#Helm]] Chart для развертывания приложения webd (предварительно проводим [[Система Kubernetes#Удаление объектов]] deployment, service и [[Система Kubernetes#Ingress]] (можно весь namespace my-ns) и добавляем index.html в [[Технология Docker#Создание контейнера для приложения с использованием Dockerfile]] для упрощения примера) |
- | * Возвращаемся к deploy используя [[Инструмент GitLab#GitLab CI/CD]] и чарта [[Система Kubernetes#Helm]] приложения webd | + | * Используем [[Система 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 и что используется для его описания? | ||
===== Дополнительные материалы ===== | ===== Дополнительные материалы ===== | ||