This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
devsecops_и_промышленные_решения [2026/03/19 06:13] val [Модуль 3: Безопасность в DevOps] |
devsecops_и_промышленные_решения [2026/06/11 16:26] (current) val [2.4 ArgoCD и универсальный Helm Chart] |
||
|---|---|---|---|
| Line 8: | Line 8: | ||
| * [[https://www.specialist.ru/course/devops3|DevSecOps и промышленные решения]] | * [[https://www.specialist.ru/course/devops3|DevSecOps и промышленные решения]] | ||
| + | ===== Ссылка на презентацию ===== | ||
| + | |||
| + | * [[https://docs.google.com/presentation/d/1x0pls2ClHYfdB3W3l6jb4If7e9vGpfDA/]] | ||
| ===== Модуль 0. Подготовка к занятию ===== | ===== Модуль 0. Подготовка к занятию ===== | ||
| Line 83: | Line 86: | ||
| gate:~# sh conf/dhcp.sh | gate:~# sh conf/dhcp.sh | ||
| </code> | </code> | ||
| - | * Настройка MAC адресов 08:00:27:12:34:5N (для получения назначенного IP через [[Сервис DHCP]]) и запуск kube1-4 | + | * Настройка MAC адресов 08:00:27:12:34:5N (для получения назначенного IP через [[Сервис DHCP]]) |
| + | * Запуск kube1-4 | ||
| - | * [[Решение FreeIPA#Настройка доступа для клиентов DNS]] | + | * [[Решение FreeIPA#Поверка после установки]] и [[Решение FreeIPA#Настройка доступа для клиентов DNS]] |
| * [[Решение FreeIPA#Управление DNS]] для добавления A записей kubeN | * [[Решение FreeIPA#Управление DNS]] для добавления A записей kubeN | ||
| Line 94: | Line 98: | ||
| search corpX.un | search corpX.un | ||
| nameserver 192.168.X.10 | nameserver 192.168.X.10 | ||
| - | </code><code> | ||
| - | # host kubeN | ||
| </code> | </code> | ||
| + | <code> | ||
| + | # ping kubeN | ||
| + | </code> | ||
| * [[Система Kubernetes#Подготовка к развертыванию через Kubespray]] | * [[Система Kubernetes#Подготовка к развертыванию через Kubespray]] | ||
| * Развертывание Kubernetes через Kubespray ([[Система Kubernetes#Вариант 2 (docker)]]) | * Развертывание Kubernetes через Kubespray ([[Система Kubernetes#Вариант 2 (docker)]]) | ||
| + | * [[Система Kubernetes#Настройка автодополнения]] (alias k) | ||
| ==== 1.5 Установка и инициализация компьютеров пользователей ==== | ==== 1.5 Установка и инициализация компьютеров пользователей ==== | ||
| - | * Импорт ВМ client1 | + | * Импорт ВМ lin client1 |
| * [[Инсталяция системы в конфигурации Desktop]] | * [[Инсталяция системы в конфигурации Desktop]] | ||
| - | * FreeIPA [[Решение FreeIPA#Установка и инициализация клиента]] client1 | ||
| - | * FreeIPA [[Решение FreeIPA#Управление пользователями]] user1 | ||
| * Настройка [[Firefox#Использование системных сертификатов]] в Firefox | * Настройка [[Firefox#Использование системных сертификатов]] в Firefox | ||
| + | * FreeIPA [[Решение FreeIPA#Установка и инициализация клиента]] client1 (лучше перезагрузить) | ||
| + | * FreeIPA [[Решение FreeIPA#Управление пользователями]] user1 | ||
| + | |||
| + | <code> | ||
| + | server# ssh-copy-id client1 | ||
| + | </code> | ||
| ===== Модуль 2: Развертывание приложений в кластере Kubernetes ===== | ===== Модуль 2: Развертывание приложений в кластере Kubernetes ===== | ||
| Line 116: | Line 126: | ||
| * Dynamic Volume Provisioning [[Система Kubernetes#rancher local-path-provisioner]] | * Dynamic Volume Provisioning [[Система Kubernetes#rancher local-path-provisioner]] | ||
| * Использование баз данных, (развертывание через оператор [[Сервис PostgreSQL#CloudNativePG]]) | * Использование баз данных, (развертывание через оператор [[Сервис PostgreSQL#CloudNativePG]]) | ||
| - | * Преподаватель может показать использование [[Система Kubernetes#Kustomize]] для сокрытия чувствительных данных | + | * В 3-м модуле будет использование [[Система Kubernetes#Kustomize]] для сокрытия чувствительных данных |
| * [[Система Kubernetes#MetalLB]] | * [[Система Kubernetes#MetalLB]] | ||
| * [[Система Kubernetes#Установка Helm]] | * [[Система Kubernetes#Установка Helm]] | ||
| - | * [[Как и чем заменить Ingress NGINX]] | + | * Вебинар: [[Как и чем заменить Ingress NGINX]] |
| - | * [[Система Kubernetes#traefik]] | + | * Устанавливаем [[Система Kubernetes#traefik]] |
| * [[Решение FreeIPA#Создание ключа и сертификата для стороннего сервиса]] | * [[Решение FreeIPA#Создание ключа и сертификата для стороннего сервиса]] | ||
| Line 133: | Line 143: | ||
| * Сервис Keycloak в [[Сервис Keycloak#Kubernetes]] (версия 25.2.0, tls: true, postgresql.enabled: false, externalDatabase.host: "my-pgcluster-rw.my-pgcluster-ns") | * Сервис Keycloak в [[Сервис Keycloak#Kubernetes]] (версия 25.2.0, tls: true, postgresql.enabled: false, externalDatabase.host: "my-pgcluster-rw.my-pgcluster-ns") | ||
| - | * Преподаватель может показать Helm [[Система Kubernetes#Работа с чувствительными данными (секретами)]] для сокрытия чувствительных данных | + | * В 3-м модуле будет использование [[Система Kubernetes#Работа с чувствительными данными (секретами)]] для сокрытия чувствительных данных в Helm |
| * [[Сервис Keycloak#Базовая конфигурация]] (только realm, преподавателю можно user2) | * [[Сервис Keycloak#Базовая конфигурация]] (только realm, преподавателю можно user2) | ||
| Line 141: | Line 151: | ||
| * [[Сервис Keycloak#Страница для проверки учетных записей]] | * [[Сервис Keycloak#Страница для проверки учетных записей]] | ||
| - | * [[Сервис Keycloak#Аутентификация пользователей WEB приложения]] | ||
| Line 151: | Line 160: | ||
| * Решение FreeIPA [[Решение FreeIPA#Поддержка ACME]] | * Решение FreeIPA [[Решение FreeIPA#Поддержка ACME]] | ||
| * Решение FreeIPA [[Решение FreeIPA#Динамический DNS]] | * Решение FreeIPA [[Решение FreeIPA#Динамический DNS]] | ||
| - | * Управление сертификатами с использованием [[Система Kubernetes#cert-manager]] | + | * Управление сертификатами с использованием [[Система Kubernetes#cert-manager]] и выпуск сертификата для будущего развертывания gitlab |
| * Инструмент GitLab [[Инструмент GitLab#Установка через docker-compose]] | * Инструмент GitLab [[Инструмент GitLab#Установка через docker-compose]] | ||
| Line 166: | Line 175: | ||
| </code> | </code> | ||
| - | * Для демонстрации OpenID | + | * Для демонстрации OpenID (преподаватель) |
| <code> | <code> | ||
| server# scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/tmp/ | server# scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/tmp/ | ||
| Line 182: | Line 191: | ||
| </code><code> | </code><code> | ||
| ... | ... | ||
| - | storage: 2000Mi | + | storage: 2Gi |
| </code><code> | </code><code> | ||
| kube1:~/gitlab# cat gitlab-deployment.yaml | kube1:~/gitlab# cat gitlab-deployment.yaml | ||
| Line 232: | Line 241: | ||
| kube1:~/gitlab# kubectl -n my-gitlab-ns apply -f vol1-persistentvolumeclaim.yaml,gitlab-service.yaml,gitlab-deployment.yaml | kube1:~/gitlab# kubectl -n my-gitlab-ns apply -f vol1-persistentvolumeclaim.yaml,gitlab-service.yaml,gitlab-deployment.yaml | ||
| - | kube1:~/gitlab# kubectl -n my-gitlab-ns logs pods/gitlab-<TAB> -f | + | kube1:~/gitlab# kubectl -n my-gitlab-ns logs deployments/gitlab -f |
| </code> | </code> | ||
| * [[Инструмент GitLab#Проверка конфигурации и перезапуск]] для процесса Sidekiq | * [[Инструмент GitLab#Проверка конфигурации и перезапуск]] для процесса Sidekiq | ||
| - | * Для демонстрации OpenID можно создать УЗ user1 через [[Инструмент GitLab#REST API интерфейс]] и связать через [[Инструмент GitLab#Клиент OpenID]] | + | * Настройка подключения через OpenID (преподаватель) |
| + | * [[Сервис Keycloak#Аутентификация пользователей WEB приложения]] | ||
| + | * Создать УЗ user1 через [[Инструмент GitLab#REST API интерфейс]] и связать через [[Инструмент GitLab#Клиент OpenID]] | ||
| ==== 2.3 Стратегии развертывания и масштабирование нагрузки ==== | ==== 2.3 Стратегии развертывания и масштабирование нагрузки ==== | ||
| - | * htwebd A 192.168.X.66 | + | * Развертываем [[Система Kubernetes#Deployment]] для тестового приложения, демонстрирующего версию |
| - | + | ||
| - | * [[Система Kubernetes#Deployment]] | + | |
| <code> | <code> | ||
| Line 257: | Line 266: | ||
| * [[Система Kubernetes#Service]] | * [[Система Kubernetes#Service]] | ||
| - | * Можно показать и, затем удалить [[Система Kubernetes#Horizontal Pod Autoscaler]] | + | * Преподавателю продемонстрировать и, затем удалить [[Система Kubernetes#Horizontal Pod Autoscaler]] |
| - | * [[Система Kubernetes#cert-manager]] | + | * Добавляем в DNS htwebd A 192.168.X.66 |
| - | * [[Система Kubernetes#Gateway]] | + | * Добавляем в [[Система Kubernetes#Traefik]] kubernetesGateway |
| + | |||
| + | * [[Система Kubernetes#Gateway]] (пока, без HTTPS) | ||
| * [[Система Kubernetes#HTTPRoute]] | * [[Система Kubernetes#HTTPRoute]] | ||
| + | * Деплоим новую версию приложения | ||
| <code> | <code> | ||
| - | kube1:~/webd-k8s# cp my-webd-deployment.yaml my-webd-deployment2.yaml | + | kube1:~/webd-k8s# |
| - | kube1:~/webd-k8s# cp my-webd-service.yaml my-webd-service2.yaml | + | cp my-webd-deployment.yaml my-webd-deployment2.yaml |
| + | cp my-webd-service.yaml my-webd-service2.yaml | ||
| ... | ... | ||
| + | ...my-webd2 | ||
| + | ... | ||
| + | |||
| + | kube1:~/webd-k8s# kubectl -n my-ns apply -f my-webd-deployment2.yaml,my-webd-service2.yaml | ||
| </code> | </code> | ||
| - | * [[Стратегии деплоя в Kubernetes]] | + | * Воспроизводим [[Стратегии деплоя в Kubernetes#Шаг 5. canary deployment with Gateway API]] с использованием [[Система Kubernetes#Traefik]] и [[Система Kubernetes#HTTPRoute]] |
| + | |||
| + | * Преподаватель демонстрирует добавление HTTPS в [[Система Kubernetes#Gateway]] с использованием [[Система Kubernetes#cert-manager]] | ||
| ==== 2.4 ArgoCD и универсальный Helm Chart ==== | ==== 2.4 ArgoCD и универсальный Helm Chart ==== | ||
| - | * [[Универсальный Helm-чарт]] | + | * Вебинар: [[Универсальный Helm-чарт]] |
| <code> | <code> | ||
| kube1:~/webd-k8s# kubectl delete ns my-ns | kube1:~/webd-k8s# kubectl delete ns my-ns | ||
| kube1:~/webd-k8s# curl -fsSL https://val.bmstu.ru/unix/uni-webd-chart.tgz | tar xzvf - | kube1:~/webd-k8s# curl -fsSL https://val.bmstu.ru/unix/uni-webd-chart.tgz | tar xzvf - | ||
| + | </code> | ||
| + | * Глобальные настройки для всех приложений | ||
| + | <code> | ||
| + | kube1:~/webd-k8s# cat env.yaml | ||
| + | </code><code> | ||
| + | domain: corpX.un | ||
| + | </code> | ||
| + | * Значения "по умолчанию" и примеры для персональных values.yaml | ||
| + | <code> | ||
| kube1:~/webd-k8s# less uni-webd-chart/values.yaml | kube1:~/webd-k8s# less uni-webd-chart/values.yaml | ||
| </code><code> | </code><code> | ||
| Line 285: | Line 314: | ||
| port: 80 | port: 80 | ||
| ... | ... | ||
| - | </code><code> | + | </code> |
| + | * Персональный values.yaml для приложения | ||
| + | <code> | ||
| kube1:~/webd-k8s# mkdir -p apps/htwebd/ | kube1:~/webd-k8s# mkdir -p apps/htwebd/ | ||
| Line 295: | Line 326: | ||
| image: | image: | ||
| repository: httpd | repository: httpd | ||
| - | </code><code> | ||
| - | kube1:~/webd-k8s# cat env.yaml | ||
| - | </code><code> | ||
| - | domain: corpX.un | ||
| </code><code> | </code><code> | ||
| kube1:~/webd-k8s# helm template my-htwebd uni-webd-chart/ -f apps/htwebd/values.yaml -f env.yaml | kube1:~/webd-k8s# helm template my-htwebd uni-webd-chart/ -f apps/htwebd/values.yaml -f env.yaml | ||
| </code> | </code> | ||
| - | * [[Универсальный Helm-чарт#Добавляем lifecycle.postStart и Gateway API]] | + | * [[Универсальный Helm-чарт#Добавляем lifecycle.postStart и Gateway API]] в Универсальный Helm-чарт |
| - | * [[Контроллер ArgoCD#Развертывание и подключение к контроллеру ArgoCD]] | + | * Демонстрируем недостатки традиционного CI/CD и удаляем развертывание |
| + | <code> | ||
| + | kube1# kubectl -n my-ns edit deployments.apps my-htwebd-dep | ||
| + | ... 1.1 -> 1.2 ... | ||
| - | * Добавление корпоративного корневого сертификата для загрузки Git репозитория | + | client1$ curl https://htwebd.corp13.un |
| + | |||
| + | kube1# kubectl delete ns my-ns | ||
| + | </code> | ||
| + | |||
| + | * [[Контроллер ArgoCD#Развертывание и подключение к контроллеру ArgoCD]] | ||
| + | * Добавление корпоративного корневого сертификата для работы с GitLab репозиторием | ||
| <code> | <code> | ||
| server# scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/usr/local/share/ca-certificates/ | server# scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/usr/local/share/ca-certificates/ | ||
| - | server# ssh kube1 update-ca-certificates | + | kube1# update-ca-certificates |
| </code> | </code> | ||
| * [[Контроллер ArgoCD#Добавление корпоративного корневого сертификата]] в контроллер ArgoCD | * [[Контроллер ArgoCD#Добавление корпоративного корневого сертификата]] в контроллер ArgoCD | ||
| - | * [[Контроллер ArgoCD#Управление приложениями через kubectl]] | ||
| - | * Можно показать [[Контроллер ArgoCD#Развертывание множества приложений через ApplicationSet]], добавив приложение ehwebd | + | * Добавляем в GitLab public группу student |
| + | * Создаем проект webd-k8s (public, без readme, в группе student) в GitLab и настраиваем [[Контроллер ArgoCD#Управление приложениями через kubectl]] в ArgoCD | ||
| + | * Повторяем попытку изменить поведение приложения "вручную" | ||
| + | |||
| + | * Преподавателю можно показать [[Контроллер ArgoCD#Развертывание множества приложений через ApplicationSet]], добавив приложение ehwebd | ||
| <code> | <code> | ||
| kube1:~/webd-k8s# mkdir apps/ehwebd | kube1:~/webd-k8s# mkdir apps/ehwebd | ||
| Line 327: | Line 366: | ||
| kube1:~/webd-k8s# helm template my-ehwebd uni-webd-chart/ -f apps/ehwebd/values.yaml -f env.yaml | kube1:~/webd-k8s# helm template my-ehwebd uni-webd-chart/ -f apps/ehwebd/values.yaml -f env.yaml | ||
| </code> | </code> | ||
| + | |||
| ===== Модуль 3: Безопасность в DevOps ===== | ===== Модуль 3: Безопасность в DevOps ===== | ||
| * [[https://habr.com/ru/companies/dsec/articles/702652/|SAST для самых маленьких. Обзор open-source инструментов поиска уязвимостей для C/C++]] | * [[https://habr.com/ru/companies/dsec/articles/702652/|SAST для самых маленьких. Обзор open-source инструментов поиска уязвимостей для C/C++]] | ||
| + | Инструмент Semgrep | ||
| + | |||
| + | * [[Технология Docker#Установка]] Docker на client1 (у контейнеров на server есть проблемы с dns из-за freeipa) | ||
| + | * [[Язык программирования Python#Виртуальная среда Python]] | ||
| + | * Приложение на Python [[Язык программирования Python#Flask Gunicorn]] | ||
| + | * Dockerfile [[Технология Docker#Приложение python pywebd]] | ||
| * [[Инструмент Semgrep]] для статического анализа кода | * [[Инструмент Semgrep]] для статического анализа кода | ||
| - | * [[Сканер Trivy]] для анализ уязвимостей в контейнерах | + | |
| - | * Интеграция инструментов безопасности в CI/CD | + | Сканер Trivy |
| - | * [[Управление секретами в сети предприятия]] | + | |
| - | * [[Управление доступом в Kubernetes]] | + | * Разместить образ pywebd в gitlab |
| - | * Интеграция с внешними системами идентификации | + | * [[Сканер Trivy]] для анализа уязвимостей в контейнерах |
| - | * Использование IDS/IPS в Kubernetes | + | |
| + | CI | ||
| + | |||
| + | * Демонстрирует преподаватель | ||
| + | * [[Система Kubernetes#gitlab-runner kubernetes]] | ||
| + | * Интеграция инструментов безопасности в [[Инструмент GitLab#Пример CI с использованием контейнеров|CI]] (см. [[#Примеры конфигураций]]) | ||
| + | |||
| + | * Можно продемонстрировать [[Контроллер ArgoCD#Развертывание множества приложений через ApplicationSet]], приложения pywebd, (потребует [[Система Kubernetes#Добавление корпоративного корневого сертификата в кластер]]) | ||
| + | <code> | ||
| + | kube1:~/webd-k8s# mkdir apps/pywebd | ||
| + | |||
| + | kube1:~/webd-k8s# cp uni-webd-chart/values.yaml apps/pywebd/ | ||
| + | |||
| + | ... | ||
| + | |||
| + | kube1:~/webd-k8s# helm template my-pywebd uni-webd-chart/ -f apps/pywebd/values.yaml -f env.yaml | ||
| + | </code> | ||
| + | |||
| + | Vault | ||
| + | |||
| + | * [[Hashicorp Vault#Установка и подключение]] Hashicorp Vault на server | ||
| + | * Включение [[Hashicorp Vault#Transit secrets engine]] и создание ключей для pgcluster и keycloak | ||
| + | * Создание [[Hashicorp Vault#Vault policy]] для pgcluster и keycloak | ||
| + | * Создание [[Hashicorp Vault#Vault auth token role]] для pgcluster и keycloak | ||
| + | * Установка [[Mozilla Sops]] на kube1 | ||
| + | * [[Система Kubernetes#Kustomize]] для сокрытия чувствительных данных | ||
| + | * [[Система Kubernetes#Работа с чувствительными данными (секретами)]] в Helm | ||
| + | * Вебинар [[Управление секретами в сети предприятия]] | ||
| + | |||
| + | Управление доступом в Kubernetes | ||
| + | |||
| + | * [[Система Kubernetes#Инструмент командной строки kubectl]] на client1 | ||
| + | |||
| + | * [[Система Kubernetes#Использование сертификатов]] для [[Система Kubernetes#Создание файла конфигурации kubectl]] и [[Система Kubernetes#Предоставление полного доступа к Namespace]] | ||
| + | |||
| + | * [[Система Kubernetes#Предоставление полного доступа к Kubernetes Cluster|Cluster Roles]], [[Система Kubernetes#Создание и привязка ServiceAccount к ClusterRole]] (ns default), [[Система Kubernetes#Создание long-lived токена]] (ns default), [[Система Kubernetes#Создание файла конфигурации kubectl]] | ||
| + | * Устанавливаем [[Система Kubernetes#Kubernetes Dashboard]] с client1 | ||
| + | |||
| + | * Преподаватель демонстрирует интеграцию с внешними системами идентификации для [[Управление доступом в Kubernetes]] | ||
| + | |||
| + | SecurityContext/NetworkPolicy | ||
| + | |||
| + | * Обсудить [[Система Kubernetes#Использование SecurityContext]] | ||
| + | <code> | ||
| + | # kubectl run my-ubuntu --image=ubuntu -- "sleep" "infinity" | ||
| + | |||
| + | # kubectl exec -ti pods/my-ubuntu -- bash | ||
| + | </code> | ||
| + | * Проверяем доступ через [[Сервис PostgreSQL#Клиент psql]] в pod и telnet с узлов кластера ([[Сервис PostgreSQL#Подключение по сети]]) | ||
| + | * [[Система Kubernetes#Использование NetworkPolicy]] для управления доступом в NS кластера | ||
| + | |||
| + | |||
| + | Использование IDS/IPS в Kubernetes | ||
| + | |||
| + | * [[https://habr.com/ru/articles/813799/|DPI из подручных материалов]] | ||
| + | |||
| + | * Удаляем приложение в ArgoCD ([[Контроллер ArgoCD#Управление приложениями через kubectl]]) | ||
| + | * Разворачиваем [[Система Kubernetes#Gateway API]] [[Система Kubernetes#Envoy Gateway]] | ||
| + | * Правим DNS запись htwebd | ||
| + | * Разворачиваем htwebd из манифестов с Envoy в [[Система Kubernetes#Gateway]] и requestMirror в [[Система Kubernetes#HTTPRoute]] | ||
| + | <code> | ||
| + | # kubectl expose pod my-ubuntu --port=80 | ||
| + | |||
| + | kube1:~/webd-k8s# kubectl apply -f my-reference-grant.yaml | ||
| + | |||
| + | kube1:~/webd-k8s# kubectl apply -f my-webd-deployment.yaml,my-webd-service.yaml,my-gateway.yaml,my-httproute.yaml -n my-ns | ||
| + | </code> | ||
| + | * Разворачиваем основу для IDS | ||
| + | <code> | ||
| + | root@my-ubuntu:/# apt install netcat-traditional | ||
| + | |||
| + | root@my-ubuntu:/# while true; do nc -tlp 80; done # need listen port or was RST TCP | ||
| + | |||
| + | client1$ curl http://htwebd.corpX.un/root.exe | ||
| + | |||
| + | root@my-ubuntu:/# Ctrl-Z | ||
| + | |||
| + | root@my-ubuntu:/# jobs | ||
| + | |||
| + | root@my-ubuntu:/# kill -9 NNN | ||
| + | </code> | ||
| + | * Можно развернуть snort из статьи [[https://habr.com/ru/articles/813799/|DPI из подручных материалов]] | ||
| + | <code> | ||
| + | root@my-ubuntu:/# snort -i eth0 -S HOME_NET=[0.0.0.0/0] -c /etc/snort/snort.conf # -A console | ||
| + | </code> | ||
| ===== Модуль 4: Восстановление кластера после сбоев ===== | ===== Модуль 4: Восстановление кластера после сбоев ===== | ||
| - | * Мониторинг кластера Kubernetes | + | Мониторинг кластера |
| - | * Резервное копирование и восстановление данных приложений | + | |
| - | * Восстановление управляющих и рабочих узлов | + | |
| - | * Восстановление etcd | + | |
| + | * [[Система Kubernetes#Metrics Server]] | ||
| + | |||
| + | * Для получения уведомлений по email на server понадобится [[Сервис HTTP#Установка и запуск сервера Apache]] на порту 81 и [[Сервис Ansible]] | ||
| + | |||
| + | * [[Сервис VictoriaMetrics]] | ||
| + | * Вебинар: [[Мониторинг кластера Kubernetes]] | ||
| + | |||
| + | Резервное копирование и восстановление | ||
| + | |||
| + | * Резервное копирование и восстановление данных приложений с [[Система Kubernetes#Использование snapshot-ов]] longhorn (Вебинар: [[Работа с хранилищами в Kubernetes]]) | ||
| + | * [[Сервис PostgreSQL#Резервное копирование и восстановление]] PostgreSQL (Вебинар: [[Все что должен знать DevOps про PostgreSQL]]) | ||
| + | * [[Система Kubernetes#Отладка etcd]] | ||
| + | |||
| + | Восстановление кластера после сбоев | ||
| + | |||
| + | * Остановить кластер, сделать снапшоты | ||
| + | * Может понадобиться [[Инструмент GitLab#Проверка конфигурации и перезапуск]] GitLab | ||
| + | * [[Система Kubernetes#Поиск и удаление подов в нерабочем состоянии]] | ||
| + | |||
| + | * Выбор узла кластера для "аварии" (Проверить Pod Deletion Policy в Longhorn, выяснить где keycloak, gitlab и master cnpg кластера) | ||
| + | * Если будет выбран 1-й узел, можно сделать | ||
| + | <code> | ||
| + | kube1:~# rsync -avz /root/ kube2.corpX.un:/root/ | ||
| + | |||
| + | cmder> notepad .kube/config | ||
| + | </code> | ||
| + | * Выход из строя (выключение по питанию) | ||
| + | |||
| + | * Анализ работоспособности кластера ([[Система Kubernetes#Отладка etcd]]) | ||
| + | * Анализ работоспособности приложений ([[Сервис PostgreSQL#Проверка состояния кластера cnpg]]) | ||
| + | * Может понадобиться удаление pod-ов (keycloak) с <code>--grace-period=0 --force</code> | ||
| + | |||
| + | * [[Система Kubernetes#Удаление вышедшего из строя узла через kubespray]] | ||
| + | |||
| + | * Использование [[Система Kubernetes#Развертывание через Kubespray]] для добавления kube4 в качестве управляющего, рабочего и etcd узла | ||
| + | |||
| + | * Восстановление отказоустойчивости приложений (создание каталогов и установка ПО для [[Система Kubernetes#Dynamic Volume Provisioning]]) | ||
| + | * Может понадобиться [[Сервис PostgreSQL#Миграция с вышедшего из строя узла]] для кластера CloudNativePG | ||
| + | |||
| + | * Проверка состояния кластера и приложений | ||
| + | |||
| + | Обновление кластера | ||
| + | |||
| + | * [[Система Kubernetes#Обновление кластера через kubespray]] | ||
| + | |||
| + | ===== Примеры конфигураций ===== | ||
| + | <code> | ||
| + | stages: | ||
| + | - lint | ||
| + | - build | ||
| + | - scan | ||
| + | - push | ||
| + | |||
| + | variables: | ||
| + | KANIKO_REGISTRY_MIRROR: "mirror.gcr.io" | ||
| + | |||
| + | Build: | ||
| + | stage: build | ||
| + | image: | ||
| + | name: gcr.io/kaniko-project/executor:v1.9.0-debug | ||
| + | entrypoint: [""] | ||
| + | script: | ||
| + | - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json | ||
| + | - /kaniko/executor | ||
| + | --insecure --skip-tls-verify | ||
| + | --context "${CI_PROJECT_DIR}" | ||
| + | --dockerfile "${CI_PROJECT_DIR}/Dockerfile" | ||
| + | --destination "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}" | ||
| + | |||
| + | except: | ||
| + | - tags | ||
| + | tags: | ||
| + | - build | ||
| + | |||
| + | Push latest: | ||
| + | image: | ||
| + | name: gcr.io/go-containerregistry/crane:debug | ||
| + | entrypoint: [""] | ||
| + | variables: | ||
| + | GIT_STRATEGY: none | ||
| + | stage: push | ||
| + | only: | ||
| + | - main | ||
| + | script: | ||
| + | - crane auth login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY | ||
| + | - crane --insecure cp $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest | ||
| + | tags: | ||
| + | - build | ||
| + | |||
| + | Push tag: | ||
| + | image: | ||
| + | name: gcr.io/go-containerregistry/crane:debug | ||
| + | entrypoint: [""] | ||
| + | variables: | ||
| + | GIT_STRATEGY: none | ||
| + | stage: push | ||
| + | only: | ||
| + | - tags | ||
| + | script: | ||
| + | - crane auth login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY | ||
| + | - crane --insecure cp $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME | ||
| + | tags: | ||
| + | - build | ||
| + | |||
| + | semgrep: | ||
| + | stage: lint | ||
| + | image: semgrep/semgrep | ||
| + | script: semgrep --config=auto --error | ||
| + | variables: | ||
| + | SEMGREP_SRC_DIRECTORY: $CI_PROJECT_DIR | ||
| + | https_proxy: http://gate.isp.un:3128/ | ||
| + | no_proxy: localhost,127.0.0.1,un | ||
| + | except: | ||
| + | - tags | ||
| + | tags: | ||
| + | - build | ||
| + | |||
| + | trivy: | ||
| + | stage: scan | ||
| + | image: | ||
| + | name: ghcr.io/aquasecurity/trivy | ||
| + | entrypoint: [""] | ||
| + | variables: | ||
| + | #TRIVY_USERNAME: "$CI_REGISTRY_USER" | ||
| + | #TRIVY_PASSWORD: "$CI_REGISTRY_PASSWORD" | ||
| + | TRIVY_REGISTRY: "$CI_REGISTRY" | ||
| + | TRIVY_CACHE_DIR: ".trivycache/" | ||
| + | script: | ||
| + | - trivy image --exit-code 1 --severity HIGH --insecure $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA | ||
| + | cache: | ||
| + | paths: | ||
| + | - ".trivycache/" | ||
| + | except: | ||
| + | - tags | ||
| + | tags: | ||
| + | - build | ||
| + | </code> | ||
| ===== Черновик ===== | ===== Черновик ===== | ||
| Line 378: | Line 642: | ||
| update-ca-certificates | update-ca-certificates | ||
| systemctl reload docker | systemctl reload docker | ||
| - | </code> | ||
| - | |||
| - | * Добавляем корпоративный сертификат в кластер kubernetes | ||
| - | <code> | ||
| - | server# | ||
| - | |||
| - | bash -c ' | ||
| - | scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/usr/local/share/ca-certificates/ | ||
| - | ssh kube1 update-ca-certificates | ||
| - | ssh kube1 systemctl restart containerd | ||
| - | scp /opt/freeipa-data/etc/ipa/ca.crt kube2:/usr/local/share/ca-certificates/ | ||
| - | ssh kube2 update-ca-certificates | ||
| - | ssh kube2 systemctl restart containerd | ||
| - | scp /opt/freeipa-data/etc/ipa/ca.crt kube3:/usr/local/share/ca-certificates/ | ||
| - | ssh kube3 update-ca-certificates | ||
| - | ssh kube3 systemctl restart containerd | ||
| - | scp /opt/freeipa-data/etc/ipa/ca.crt kube4:/usr/local/share/ca-certificates/ | ||
| - | ssh kube4 update-ca-certificates | ||
| - | ssh kube4 systemctl restart containerd | ||
| - | ' | ||
| </code> | </code> | ||