This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
devops2._использование_kubernetes_2025 [2025/03/18 14:17] val [3.3 Разворачивание нужной версии приложения в kubernetes] |
— (current) | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== DevOps2. Использование Kubernetes 2025 ====== | ||
| - | ===== При вводе в эксплуатацию учесть ===== | ||
| - | |||
| - | * 4GB на узел для лонгхорн и кейклоак | ||
| - | * 12-й дебиан | ||
| - | * Нужен работающий k8s для демонстрации, в ожидании Kubespray | ||
| - | |||
| - | ===== Модуль 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 ==== | ||
| - | <code> | ||
| - | Запустите с правами 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 | ||
| - | </code> | ||
| - | ==== 1.2 Настройка сети VM gate и server ==== | ||
| - | |||
| - | * [[Настройка стендов слушателей#Настройка виртуальных систем Unix]] с использованием [[Настройка стендов слушателей#Скрипты автоконфигурации]] | ||
| - | |||
| - | * gate | ||
| - | <code> | ||
| - | # sh net_gate.sh | ||
| - | |||
| - | # init 6 | ||
| - | </code> | ||
| - | |||
| - | * server | ||
| - | <code> | ||
| - | # sh net_server.sh | ||
| - | |||
| - | # init 6 | ||
| - | </code> | ||
| - | |||
| - | * Создать в Putty профили gate, server и подключиться | ||
| - | |||
| - | ==== 1.3 Подготовка инфраструктуры для kubespray ==== | ||
| - | |||
| - | * [[Финальная настройка DNS сервера]] на server | ||
| - | <code> | ||
| - | server:~# git -C conf/ pull | ||
| - | |||
| - | server:~# sh conf/dns.sh | ||
| - | </code> | ||
| - | |||
| - | * Добавляем DNS записи kubeN A 192.168.X.220+N в [[Сервис DNS#Настройка мастер сервера зоны corpX.un]] | ||
| - | * Настройка клиента DNS на gate и server | ||
| - | <code> | ||
| - | # cat /etc/resolv.conf | ||
| - | </code><code> | ||
| - | search corpX.un | ||
| - | nameserver 192.168.X.10 | ||
| - | </code><code> | ||
| - | # nslookup kubeN | ||
| - | </code> | ||
| - | |||
| - | * Настройка сервера DHCP на gate | ||
| - | <code> | ||
| - | gate:~# git -C conf/ pull | ||
| - | |||
| - | gate:~# sh conf/dhcp.sh | ||
| - | </code> | ||
| - | * Настройка 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 | ||
| - | <code> | ||
| - | server# apt install apache2 | ||
| - | |||
| - | server# rm /var/www/html/index.html | ||
| - | |||
| - | server# cp wild.crt /var/www/html/ca.crt | ||
| - | </code> | ||
| - | |||
| - | * Проверяем в [[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 | ||
| - | <code> | ||
| - | 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 | ||
| - | </code> | ||
| - | |||
| - | * Используем на 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]] | ||
| - | |||
| - | |||
| - | <code> | ||
| - | kube1:~# mkdir pywebd-k8s;cd $_ | ||
| - | </code> | ||
| - | * !!! Можно начать с использования образа gowebd, а потом усложнить | ||
| - | * [[Система Kubernetes#Deployment]] | ||
| - | * [[Система Kubernetes#Service]], [[Система Kubernetes#ClusterIP]] | ||
| - | * Предоставляем доступ к приложниям в k8s по [[Система Kubernetes#NodePort]] | ||
| - | |||
| - | <code> | ||
| - | kube1:~/pywebd-k8s# kubectl -n my-ns exec -ti pods/my-webd-<TAB> -- sh | ||
| - | |||
| - | ~ $ kill -STOP 16 | ||
| - | |||
| - | kube1:~/pywebd-k8s# kubectl get pods -n my-ns --watch | ||
| - | </code> | ||
| - | |||
| - | ==== 2.2 volumes, nodeAffinity, helm ==== | ||
| - | |||
| - | * Хранение данных приложений в k8s | ||
| - | |||
| - | * [[Система Kubernetes#hostPath и nodeSelector]] (lifecycle и initContainers снова пригодятся на следующем шаге) | ||
| - | * [[Система Kubernetes#Установка Helm]] на kube1 (**делаем все**) | ||
| - | * [[Система Kubernetes#PersistentVolume и PersistentVolumeVolumeClaim]] (убрать nodeSelector) | ||
| - | |||
| - | |||
| - | |||
| - | ==== 2.3 ingress ==== | ||
| - | |||
| - | * Предоставляем доступ к приложниям в k8s по URL | ||
| - | |||
| - | * Вариант [[Система Kubernetes#Ingress baremetal DaemonSet]] (**делаем все**) | ||
| - | |||
| - | * [[Система Kubernetes#Deployment]] с emptyDir для демонстрации балансировки | ||
| - | |||
| - | <code> | ||
| - | server.corpX.un:~# cat /etc/bind/corpX.un | ||
| - | </code><code> | ||
| - | ... | ||
| - | pywebd A 192.168.X.221 | ||
| - | A 192.168.X.222 | ||
| - | A 192.168.X.223 | ||
| - | ... | ||
| - | </code> | ||
| - | * [[Система Kubernetes#ingress example]] | ||
| - | |||
| - | <code> | ||
| - | $ curl http://pywebd.corpX.un | ||
| - | </code> | ||
| - | |||
| - | |||
| - | ==== 2.4 configmap, secret ==== | ||
| - | |||
| - | * Управление конфигурацией и доступ к приложеням в k8s по https | ||
| - | |||
| - | * Добавляем ssl в приложение на [[Язык программирования Python]] (в venv2, с конфигурацией (скопируем в k8s) и проверки работоспособности) | ||
| - | <code> | ||
| - | $ curl --connect-to "":"":server.corpX.un:4443 https://pywebd.corpX.un | ||
| - | </code> | ||
| - | * Создаем Docker образ ver1.2 для [[Технология Docker#Приложение python pywebd]] | ||
| - | * Push-им в Gitlab и делаем проект приватным | ||
| - | |||
| - | * [[Система Kubernetes#ConfigMap, Secret]] | ||
| - | |||
| - | * [[Система Kubernetes#LoadBalancer]] | ||
| - | |||
| - | * [[Система Kubernetes#Service]] LoadBalancer, port: 443, targetPort: 4443 | ||
| - | |||
| - | <code> | ||
| - | $ curl --connect-to "":"":192.168.X.64:443 https://pywebd.corp24.un | ||
| - | |||
| - | server# cat /etc/bind/corpX.un | ||
| - | </code><code> | ||
| - | ... | ||
| - | pywebd A 192.168.X.64 | ||
| - | ... | ||
| - | </code> | ||
| - | |||
| - | * Тестируем с 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 ==== | ||
| - | |||
| - | <code> | ||
| - | kube1:~# mkdir gowebd-k8s;cd $_ | ||
| - | </code> | ||
| - | * [[Система Kubernetes#Deployment]] ver1.1 | ||
| - | * [[Система Kubernetes#Service]], [[Система Kubernetes#ClusterIP]] | ||
| - | |||
| - | * В GitLab создаем версию ver1.2 и назначаем тэг | ||
| - | <code> | ||
| - | kube1:~/gowebd-k8s# cp my-webd-deployment.yaml my-webd-deployment-env.yaml | ||
| - | |||
| - | kube1:~/gowebd-k8s# cat my-webd-deployment-env.yaml | ||
| - | </code><code> | ||
| - | ... | ||
| - | image: server.corpX.un:5000/student/gowebd:$VER | ||
| - | ... | ||
| - | </code><code> | ||
| - | 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 | ||
| - | </code> | ||
| - | |||
| - | * Устанавливаем из dpkg [[Инструмент GitLab#GitLab Runner]] на server и регистрируем как общий с тегом "k8s-deploy" и shell executor | ||
| - | * Устанавливаем [[Система Kubernetes#Инструмент командной строки kubectl]] на server | ||
| - | * Настраиваем [[Система Kubernetes#Подключение к кластеру]] для пользователя gitlab-runner на server | ||
| - | |||
| - | * Настраиваем stage deploy через envsubst используя [[Инструмент GitLab#Пример shell Kubernetes]] | ||
| - | * Создаем проект gowebd-k8s (Public, без Readme) | ||
| - | * Деплоим нужную версию в ручную (New Pipeeline MY_WEBD_VER=ver1.1) | ||
| - | |||
| - | * Через WebIDE | ||
| - | * Настраиваем зависимость между проектами gowebd и gowebd-k8s через stage deploy в [[Инструмент GitLab#Пример CI с использованием контейнеров]] | ||
| - | * Увеличиваем версию, добавляем соответствующий тег, проверяем версию приложения в k8s | ||
| - | |||
| - | * Обсуждаем [[Система Kubernetes#Версии deployment]], недостатки Gitlab CD и варианты, например Argo CD | ||
| - | |||
| - | * [[Система Kubernetes#Удаление объектов]] (весь namespace) | ||
| - | * [[Система Kubernetes#Установка Helm]] (если еще не установлен) на kube1 | ||
| - | * [[Система Kubernetes#Развертывание своего приложения]] (webd-chart с образом gowebd) | ||
| - | |||
| - | <code> | ||
| - | server.corpX.un:~# cat /etc/bind/corpX.un | ||
| - | </code><code> | ||
| - | ... | ||
| - | gowebd A 192.168.X.221 | ||
| - | A 192.168.X.222 | ||
| - | A 192.168.X.223 | ||
| - | ... | ||
| - | </code><code> | ||
| - | $ curl http://gowebd.corpX.un | ||
| - | </code> | ||
| - | |||
| - | * [[Система Kubernetes#Установка Helm]] на server | ||
| - | <code> | ||
| - | gitlab-runner@server:~$ helm list -n my-ns | ||
| - | </code> | ||
| - | * Исправляем [[Инструмент GitLab#Пример shell Kubernetes]] с использованим helm и push-им все в репозиторий gowebd-k8s | ||
| - | * В проекте gowebd увеличиваем версию, добавляем соответствующий тег, проверяем версию приложения в k8s | ||
| - | |||
| - | * [[Система Kubernetes#Работа со своим репозиторием]] для размещения helm пакета (будет использоваться в дополнительном материале) | ||
| - | ===== Модуль 4. Дополнительные материалы ===== | ||
| - | |||
| - | ==== 4.1 Доступ к приложениям в Bare-Metal Kubernetes ==== | ||
| - | |||
| - | |||
| - | Необходимо: | ||
| - | |||
| - | * удалить NS my-ns | ||
| - | * Удаляем [[Система Kubernetes#Ingress baremetal DaemonSet]] в вебинаре будет повтор через helm) | ||
| - | |||
| - | <code> | ||
| - | server:~# ssh-copy-id gate | ||
| - | </code> | ||
| - | |||
| - | * Видео [[Доступ к приложениям в Bare-Metal Kubernetes]] с 00:28:30 до 01:39:00 | ||
| - | |||
| - | ==== 4.2 Стратегии деплоя в Kubernetes ==== | ||
| - | |||
| - | * Видео [[Стратегии деплоя в Kubernetes]] (выполняем работы с 00:05:30 до конца) | ||
| - | |||
| - | ==== 4.3 Работа с хранилищами в Kubernetes и восстановление после аварии ==== | ||
| - | |||
| - | * Видео [[Работа с хранилищами в Kubernetes]] (выполняем работы с 00:04:00 до конца) | ||
| - | |||
| - | ==== 4.4 Продолжение восстановления после аварии и Обновление кластера Kubernetes ==== | ||
| - | |||
| - | * Видео [[Обновление кластера Kubernetes]] | ||
| - | |||
| - | выполняем работы: | ||
| - | |||
| - | * с 00:09:10 до 00:34:25 (восстанавливаем etcd) | ||
| - | * с 00:48:55 до 00:51:25 (добавляем kube3 как worker) | ||
| - | * с 00:54:50 до 01:03:33 (обновляем кластер) | ||
| - | |||
| - | ===== Черновик ===== | ||
| - | |||
| - | <code> | ||
| - | kube1:~/pywebd-k8s# cat my-ingress.yaml | ||
| - | </code><code> | ||
| - | apiVersion: networking.k8s.io/v1 | ||
| - | kind: Ingress | ||
| - | metadata: | ||
| - | name: my-ingress | ||
| - | spec: | ||
| - | ingressClassName: nginx | ||
| - | rules: | ||
| - | - host: pywebd.corp13.un | ||
| - | http: | ||
| - | paths: | ||
| - | - backend: | ||
| - | service: | ||
| - | name: my-webd | ||
| - | port: | ||
| - | number: 4080 | ||
| - | path: / | ||
| - | pathType: Prefix | ||
| - | </code> | ||