User Tools

Site Tools


devsecops_и_промышленные_решения

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
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+kube1update-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>​
  
devsecops_и_промышленные_решения.1773890004.txt.gz · Last modified: 2026/03/19 06:13 by val