====== DevOps2. Использование Kubernetes ====== ===== Программа курса ===== * [[https://www.specialist.ru/course/devops2|DevOps. Уровень 2. Использование Kubernetes]] ===== Модуль 0. Подготовка к занятию ===== - Узнать и записать свой номер стенда: X= - Сообщить его в чат преподавателю ===== Практикум ===== * [[https://val.bmstu.ru/~val/pract/dev2/|Записи практикума]] ===== Модуль 1. Развертывание стенда и kubernetes кластера ===== ==== Теория ==== ==== Лабораторные работы: Развертывание стенда и kubernetes кластера ==== * Разворачиваем стенд курса [[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 -rf conf git clone http://val.bmstu.ru/unix/conf.git cd conf/virtualbox/ !!! 9 - это номер курса, вместо X укажите Ваш номер стенда, если не знаете его, спросите преподавателя !!! ./setup.sh X 9 ==== 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 Подготовка инфраструктуры для kubespray ==== * [[Финальная настройка DNS сервера]] на server server:~# git -C conf/ pull server:~# sh conf/dns.sh * Добавляем DNS записи kubeN A 192.168.X.220+N в [[Сервис DNS#Настройка мастер сервера зоны corpX.un]] * Настройка клиента DNS на gate и server # cat /etc/resolv.conf search corpX.un nameserver 192.168.X.10 # nslookup kubeN * Настройка сервера DHCP на gate gate:~# git -C conf/ pull gate:~# sh conf/dhcp.sh * Настройка MAC адресов 08:00:27:12:34:5N (для получения назначенного IP через [[Сервис DHCP]]) и запуск kube1-4 ==== 1.4 Разворачивание кластера Kubernetes через Kubespray ==== * [[Система Kubernetes#Развертывание через Kubespray]] ==== 1.5 Развертывание GitLab (для 3-го модуля) ==== * [[Пакет OpenSSL#Создание самоподписанного сертификата]] (wild) * [[Пакет OpenSSL#Импорт сертификата центра сертификации]] на server (что бы не пере запускать docker) * Установка [[Технология Docker#docker-compose]] * Подготовка к [[Инструмент GitLab#Включение TLS]] в GitLab * [[Инструмент GitLab#Установка через docker-compose|Установка GitLab через docker-compose]] * Подключаемся с хост системы по FQDN (для правильного Project URL) и создаем УЗ student с правами администратора (можно в следующую паузу) ==== 1.6 Развертывание рабочей станции пользователя (для 4-го модуля) ==== * Разворачиваем win client2 (ip/m: 172.16.1.100+X/24, dns: 192.168.X.10) * Копируем ca.crt server# apt install apache2 server# rm /var/www/html/index.html server# cp wild.crt /var/www/html/ca.crt * Проверяем в [[Chrome]] доступность GitLab по https ==== 1.7 Разработка образов приложений (для 2-го модуля) ==== * [[Язык программирования Golang]] на server, берем только код программы для следующего пункта * Создаем Docker **файл** для [[Технология Docker#Приложение golang gowebd]] (multistage для уменьшения размера) * Проводим [[Технология Docker#Аутентификация в Registry]] по **https** * Создаем проект **gowebd** (Public, без README) * Отключаем Auto DevOps для проекта * Собираем и загружаем образ (latest), используя [[Технология Docker#Инструмент kaniko]], тестируем результат * Только преподаватель * [[Язык программирования Python]] (в venv2, без ssl (добавим в теме ingress), с конфигурацией и с /var/www, для проверки работоспособности) * Создаем и тестируем Docker образ для [[Технология Docker#Приложение python pywebd]] (безопасный вариант, с конфигурацией и с /var/www, для начальных простых развертываний в k8s) * Создаем проект **pywebd** (Public (Private на следующей итерации), без README) и [[Технология Docker#Использование Private Registry]] для хранения образа (метки latest и ver1.1) ==== 1.8 Работа с кластером Kubernetes ==== * Добавляем корпоративный сертификат в кластер kubernetes bash -c ' scp /var/www/html/ca.crt kube1:/usr/local/share/ca-certificates/ ssh kube1 update-ca-certificates ssh kube1 systemctl restart containerd scp /var/www/html/ca.crt kube2:/usr/local/share/ca-certificates/ ssh kube2 update-ca-certificates ssh kube2 systemctl restart containerd scp /var/www/html/ca.crt kube3:/usr/local/share/ca-certificates/ ssh kube3 update-ca-certificates ssh kube3 systemctl restart containerd ' kubeN# crictl pull server.corpX.un:5000/student/gowebd crictl images crictl rmi server.corpX.un:5000/student/gowebd * Используем на kube1 [[Система Kubernetes#Инструмент командной строки kubectl]] ===== Практикум ===== * [[https://val.bmstu.ru/~val/pract/dev2/dev2_mod1_pract.mp4|Запись практикума]] (длительность: 53 минуты) ===== Модуль 2. Объекты kubernetes, helm ===== ==== Теория ==== * [[https://habr.com/ru/companies/slurm/articles/783708/|Что происходит, когда вы создаёте Pod в Kubernetes?]] ==== Теория через лабораторные работы: Управление объектами Kubernetes ==== ==== 2.1 deployment, service, проверка статуса пода, настройка лимитов ==== * Запуск и доступ к приложениям в k8s * [[https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/|Define Environment Variables for a Container]] * [[https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/|Sidecar Containers]] * [[https://www.kryukov.biz/kubernetes/lokalnye-volumes/emptydir/|emptyDir]] * [[https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/|Configure Liveness, Readiness and Startup Probes]] kube1:~# mkdir pywebd-k8s;cd $_ * !!! Можно начать с использования образа gowebd, а после демонстрации балансировки заменить на pywebd * [[Система Kubernetes#Deployment]] * [[Система Kubernetes#Service]], [[Система Kubernetes#ClusterIP]] * Предоставляем доступ к приложениям в k8s по [[Система Kubernetes#NodePort]] * Проверка статуса пода kube1:~/pywebd-k8s# kubectl -n my-ns exec -ti pods/my-webd- -- sh ~ $ kill -STOP 16 kube1:~/pywebd-k8s# kubectl get pods -n my-ns --watch * Настройка лимитов в [[Система Kubernetes#Manifest]] * Основы администрирования систем Linux [[Основы администрирования систем Linux#Модуль 11. Анализ производительности и оптимизация системы]] * Управление ПО [[Управление ПО в Linux#APK Alpine Linux]] ==== 2.2 volumes, nodeAffinity, helm ==== * Хранение данных приложений в k8s * [[Система Kubernetes#hostPath и nodeSelector]] (lifecycle и initContainers снова пригодятся на следующем шаге) * [[Система Kubernetes#Установка Helm]] на kube1 (**делаем все**) * [[Система Kubernetes#PersistentVolume и PersistentVolumeClaim]] (убрать nodeSelector) * Можно показать [[Система Kubernetes#rancher local-path-provisioner]] ==== 2.3 ingress ==== * Предоставляем доступ к приложниям в k8s по URL * Вариант [[Система Kubernetes#Ingress baremetal DaemonSet]] (**делаем все**) * [[Система Kubernetes#Deployment]] с emptyDir для демонстрации балансировки server.corpX.un:~# cat /etc/bind/corpX.un ... pywebd A 192.168.X.221 A 192.168.X.222 A 192.168.X.223 ... * [[Система Kubernetes#ingress example]] $ curl http://pywebd.corpX.un ==== 2.4 configmap, secret ==== * Управление конфигурацией и доступ к приложеням в k8s по https * Добавляем ssl в приложение на [[Язык программирования Python]] (в venv2, с конфигурацией (скопируем в k8s) и проверки работоспособности) $ curl --connect-to "":"":server.corpX.un:4443 https://pywebd.corpX.un * Создаем Docker образ ver1.2 для [[Технология Docker#Приложение python pywebd]] * Push-им в Gitlab и делаем проект приватным * [[Система Kubernetes#ConfigMap, Secret]] * [[Система Kubernetes#LoadBalancer]] * [[Система Kubernetes#Service]] LoadBalancer, port: 443, targetPort: 4443 $ curl --connect-to "":"":192.168.X.64:443 https://pywebd.corpX.un server# cat /etc/bind/corpX.un ... pywebd A 192.168.X.64 ... * Тестируем с win client https://pywebd.corpX.un/ * Удаляем my-ns * Удаляем [[Система Kubernetes#LoadBalancer]] ===== Практикум ===== * [[https://val.bmstu.ru/~val/pract/dev2/dev2_mod2_pract.mp4|Запись практикума]] (длительность: 12 минут) ===== Модуль 3. Создание CI/CD в kubernetes ===== ==== 3.1 Запуск gitlab-runner в kubernetes ==== * [[Система Kubernetes#Установка Helm]] * Методически, можно показать: "Развертывание своего приложения (webd-chart с образом gowebd)" * Сделать общий [[Система Kubernetes#gitlab-runner kubernetes]] с тегом "build" ==== 3.2 Сборка докер контейнера в kubernetes ==== * Добавляем [[Инструмент GitLab#Пример CI с использованием контейнеров]] в каталог gowebd на server * Используя "подсказки" размещаем проект в GitLab * В GitLab наблюдаем сборку образа * В GitLab добавляем тег ver1.1 и проверяем наличие образов ==== 3.3 Развертывание нужной версии приложения в kubernetes ==== kube1:~# mkdir -p gowebd-k8s;cd $_ * [[Система Kubernetes#Deployment]] ver1.1 * [[Система Kubernetes#Service]], [[Система Kubernetes#ClusterIP]] * В GitLab создаем версию ver1.2 и назначаем тэг kube1:~/gowebd-k8s# cp my-webd-deployment.yaml my-webd-deployment-env.yaml kube1:~/gowebd-k8s# cat my-webd-deployment-env.yaml ... image: server.corpX.un:5000/student/gowebd:$VER ... kube1:~/gowebd-k8s# export VER=ver1.2 kube1:~/gowebd-k8s# envsubst < my-webd-deployment-env.yaml | kubectl apply -f - -n my-ns kubeN# curl my-webd.my-ns.svc.cluster.local * Устанавливаем из dpkg [[Инструмент GitLab#GitLab Runner]] на server и регистрируем как общий с тегом "k8s-deploy" и shell executor * Устанавливаем [[Система Kubernetes#Инструмент командной строки kubectl]] на server * Настраиваем [[Система Kubernetes#Подключение к кластеру]] для пользователя gitlab-runner на server * Преподаватель демонстрирует * Настраиваем stage deploy через envsubst используя [[Инструмент GitLab#Пример shell Kubernetes]] * Создаем проект gowebd-k8s (без Readme) * Деплоим нужную версию в ручную (New Pipeeline MY_WEBD_VER=ver1.1) * Преподаватель удаляет проект gowebd-k8s * [[Система Kubernetes#Удаление объектов]] (весь namespace) * [[Система Kubernetes#Развертывание своего приложения]] (webd-chart с образом gowebd) server.corpX.un:~# cat /etc/bind/corpX.un ... gowebd A 192.168.X.221 A 192.168.X.222 A 192.168.X.223 ... $ curl http://gowebd.corpX.un * [[Система Kubernetes#Установка Helm]] на server gitlab-runner@server:~$ helm list -n my-ns * Настраиваем stage deploy с helm используя [[Инструмент GitLab#Пример shell Kubernetes]] * Создаем проект gowebd-k8s (Public, без Readme) * Через WebIDE * Настраиваем зависимость между проектами gowebd и gowebd-k8s через stage deploy в [[Инструмент GitLab#Пример CI с использованием контейнеров]] * Увеличиваем версию, добавляем соответствующий тег, проверяем версию приложения в k8s * Ожидая процесс сборки, обсуждаем [[Система Kubernetes#Версии deployment]], недостатки Gitlab CD и варианты, например Argo CD * [[Система Kubernetes#Работа со своим репозиторием]] для размещения helm пакета (будет использоваться в дополнительном материале) ===== Практикум ===== * [[https://val.bmstu.ru/~val/pract/dev2/dev2_mod3_pract.mp4|Запись практикума]] (длительность: 52 минуты) ===== Модуль 4. Дополнительные материалы ===== ==== 4.1 Доступ к приложениям в Bare-Metal Kubernetes ==== * Удаляем NS my-ns * "Хором" в классе можно выполнить шаги 10, 12, 13 * В формате "Открытого/Персонального обучения": * Удаляем [[Система Kubernetes#Ingress baremetal DaemonSet]] в вебинаре будет повтор через helm) server:~# ssh-copy-id gate * Видео [[Доступ к приложениям в Bare-Metal Kubernetes]] с 00:28:30 до 01:39:00 ==== 4.2 Стратегии деплоя в Kubernetes ==== * Видео [[Стратегии деплоя в Kubernetes]] (выполняем работы с 00:05:30 до конца) ==== 4.3 Работа с хранилищами в Kubernetes и восстановление после аварии ==== * “Хором” в классе можно выполнить [[Система Kubernetes#Добавление узла через Kubespray]] и, параллельно, шаги 4, 5, 3, можно, добавить мониторинг (VictoriaMetrics Cluster), перед аварией узла * Видео [[Работа с хранилищами в Kubernetes]] (выполняем работы с 00:04:00 до конца) ==== 4.4 Продолжение восстановления после аварии и Обновление кластера Kubernetes ==== “Хором” в классе можно выполнить шаг 4 * Видео [[Обновление кластера Kubernetes]] выполняем работы: * с 00:09:10 до 00:34:25 (восстанавливаем etcd) * с 00:48:55 до 00:51:25 (добавляем kube3 как worker) * с 00:54:50 до 01:03:33 (обновляем кластер) ==== 4.5 Мониторинг кластера Kubernetes ==== * Видео [[Мониторинг кластера Kubernetes]] (выполняем работы с 00:04:50 до конца) ==== 4.6 Бюджетная безотказная сеть для кластера ==== * Видео [[Бюджетная безотказная сеть для кластера]] ==== 4.7 Все что должен знать DevOps про PostgreSQL ==== * Видео [[Все что должен знать DevOps про PostgreSQL]] ===== Доп. занятие ===== ==== Причины ==== Много материала в 3 дня не помещается никак Мало часов Очень сложная тема, необходимо еще несколько раз переслушать материал Много, сложно. Даже в том что я думаю, что усвоил, на самом деле не уверен Объем данных создал в голове кашу ==== Еще причины и пожелания ==== Было очень тяжело. Во первых удерживать постоянно внимание. Это очень трудно Второй день была лекция почти 4 часа и там удержание внимание превращается в подвиг. Поэтому нужны перерывы. Хотя бы 5 минут на 40-60 минут освободить внимание. Второй момент связан с той ситуацией, когда на второй день на самой тяжёлой лекции один студент сказал, а чем вы вообще занимаемся занимаемся. На мой взгляд его вопрос связан не с пониманием каких-то конкретных вещей, а с потерей общего понимания занятия, его цели и смысла. И тут, на мой взгляд, просто нужен общий план лекций или план работ. Без такого плана непонятно как распределять силы. Непонятно что важно, что не очень важно. Непонятно что из чего вытекает. Как правило по ходу лекции ты улавливаешь, что из чего вытекает в данный конкретный момент, но при этом через некоторый промежуток времени теряется общий план задачи. А что бы собственного говоря делаем, к чему идём? Зачем все эти шаги? Если студент имеют возможность смотреть на такой план, то он может понять на каком этапе он находится, что он уже сделал и что ему предстоит. А если не может, то преподавателю при наличии такого плана достаточно будет 2-3 минут что бы вернуть к сути «заблудившегося» студента. Мы сейчас находимся условно в пункте II.5. То есть мы проделали то, то и то. Сейчас мы делаем это, а после этого у нас по плану то-то, то. ==== Вопросы ==== Как реализуется управление конфигурацией и секретами в Kubernetes, и чем это лучше или хуже по сравнению с Ansible Vault? Как Docker сети (bridge, host, overlay) работают и взаимодействуют между контейнерами на одном хосте и в кластере Kubernetes? Какие подходы существуют для организации сетевого взаимодействия и безопасности (например, через Service и Ingress) при масштабном развертывании микросервисов в Kubernetes? Очень хотелось бы рассмотреть https://github.com/rancher/rancher на живом примере (подготовка к развертыванию, работа в его веб-интерфейсе) Rancher — это платформа для управления контейнерами с открытым исходным кодом. Rancher позволяет легко запускать Kubernetes в любом месте, соответствовать требованиям ИТ и расширять возможности команд DevOps. 1 Базовые и продвинутые сущности k8s 2 Стратегии deploy и rollback с реальными примерами из практики 3 Работу с облаками Хотелось бы рассмотреть поподробнее компоненты k8s Такие как Coredns Ingress Sidecar Istio Может рассмотреть подробно как работает например kube api и etcd, scheduler, kube-proxy Можно показать визуально как это выглядит в k9s