====== DevOps2. Использование Kubernetes ======
===== Программа курса =====
* [[https://www.specialist.ru/course/devops2|DevOps. Уровень 2. Использование Kubernetes]]
===== Модуль 0. Подготовка к занятию =====
- Узнать и записать свой номер стенда: X=
- Сообщить его в чат преподавателю
===== Модуль 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]] (безопасный вариант, для демонстрации всех нюансов в 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]]
===== Модуль 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, а потом усложнить
* [[Система 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
==== 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.corp24.un
server# cat /etc/bind/corpX.un
...
pywebd A 192.168.X.64
...
* Тестируем с win client https://pywebd.corpX.un/
* Удаляем my-ns
* Удаляем [[Система Kubernetes#LoadBalancer]]
===== Модуль 3. Создание CI/CD в kubernetes =====
==== 3.1 Запуск gitlab-runner в kubernetes ====
* Сделать общий [[Система Kubernetes#gitlab-runner kubernetes]] с тегом "build"
==== 3.2 Сборка докер контейнера в kubernetes ====
* Добавляем [[Инструмент GitLab#Пример CI с использованием контейнеров]] в каталог gowebd на server
* Используя "подсказки" размещаем проект в GitLab
* В GitLab наблюдаем сборку образа
* В GitLab добавляем тег ver1.1 и проверяем наличие образов
==== 3.3 Разворачивание нужной версии приложения в kubernetes ====
kube1:~# mkdir 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 пакета (будет использоваться в дополнительном материале)
===== Модуль 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 Бюджетная безотказная сеть для кластера ====
* Видео [[Бюджетная безотказная сеть для кластера]]