User Tools

Site Tools


введение_в_devops

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
введение_в_devops [2022/09/28 07:40]
val [Теория]
введение_в_devops [2023/09/11 06:19]
val [Лабораторные работы: Развертывание стенда]
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 35: Line 36:
  
 cd conf/​virtualbox/​ cd conf/​virtualbox/​
 +
 +!!! 8 - это номер курса, вместо X укажите Ваш номер стенда,​ если не знаете его, спросите преподавателя !!!
  
 ./setup.sh X 8 ./setup.sh X 8
Line 40: Line 43:
 === 1.2 Настройка сети VM gate и server === === 1.2 Настройка сети VM gate и server ===
  
 +  * !!! Добавить HDD 20GB к server
   * [[Настройка стендов слушателей#​Настройка виртуальных систем Unix]] с использованием [[Настройка стендов слушателей#​Скрипты автоконфигурации]]   * [[Настройка стендов слушателей#​Настройка виртуальных систем Unix]] с использованием [[Настройка стендов слушателей#​Скрипты автоконфигурации]]
  
Line 82: Line 86:
   * [[Переменные окружения#​Установка переменных окружения]] http_proxy, https_proxy и no_proxy   * [[Переменные окружения#​Установка переменных окружения]] http_proxy, https_proxy и no_proxy
   * Установку [[Сервис Ansible]]   * Установку [[Сервис Ansible]]
-  * Установку [[Инструмент GitLab]]+  * Установку [[Инструмент GitLab]] !!! запустить до первого перерыва 
 + 
 + 
 +  * !!! Заранее выполняем на host системе 
 +  * Технология Vagrant [[Технология Vagrant#​Установка]]
  
 ==== Теория ==== ==== Теория ====
Line 98: Line 106:
 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 119:
 !!! Если 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 129:
  
   * [[Сервис DHCP#​Статистика DHCP сервера]]   * [[Сервис DHCP#​Статистика DHCP сервера]]
-  * [[Сервис Git#​Клонирование и обновление локального репозитория из сетевого]] (root на gate)+  * [[Сервис Git#​Клонирование и обновление локального репозитория из сетевого]] (можно тем же student ​на gate)
   * [[Установка ПО из исходных текстов#​Использование make для сопровождения файлов конфигурации сервиса]]   * [[Установка ПО из исходных текстов#​Использование make для сопровождения файлов конфигурации сервиса]]
  
Line 125: Line 135:
   * Используем [[Пакет sudo]] для разрешений пользователя gitlab-runner   * Используем [[Пакет sudo]] для разрешений пользователя gitlab-runner
   * [[Инструмент GitLab#​GitLab CI/CD]]   * [[Инструмент GitLab#​GitLab CI/CD]]
-  * Экспериментируем)+  * Экспериментируем ​или смотри вебинар :[[https://​youtu.be/​FeD6VBY2Xss|Вход в CI/CD для Linux-админа]]
  
 === 2.4 Работа с ветками в GitLab CI/CD === === 2.4 Работа с ветками в GitLab CI/CD ===
Line 131: Line 141:
 !!! в теме 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 154:
   - Чем отличается 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 161: Line 171:
  
   * Добавляем DNS записи nodeN A 192.168.X.200+N в [[Сервис DNS#​Настройка мастер сервера зоны corpX.un]]   * Добавляем DNS записи nodeN A 192.168.X.200+N в [[Сервис DNS#​Настройка мастер сервера зоны corpX.un]]
 +  * Обзор команд [[Технология VirtualBox]]
   * Развертываем с использованием [[Технология Vagrant]] node1,2,3   * Развертываем с использованием [[Технология Vagrant]] node1,2,3
  
Line 168: Line 179:
   * Преподаватель импортирует систему 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 190:
  
   - Что общего и в чем отличие между 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 192: Line 205:
 === 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]]
  
Line 245: Line 270:
 === 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 252: Line 277:
  
   * Изучаем [[Система 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 265: Line 290:
   * Автоматизируем 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 и что используется для его описания?​
 ===== Дополнительные материалы ===== ===== Дополнительные материалы =====
  
введение_в_devops.txt · Last modified: 2023/09/11 06:23 by val