DevOps & CI/CD

GitOps / IaC

IaC — описание инфраструктуры кодом вместо ручной настройки; GitOps — доставка этого кода в кластер автоматически из Git-репозитория.

Что такое IaC

IaC (Infrastructure as Code, инфраструктура как код) — подход, при котором серверы, сети, кластеры и их конфигурация описываются текстовыми файлами и создаются автоматически, а не настраиваются руками через панель или SSH.

Что это меняет: инфраструктура становится обычным кодом. Она лежит в Git, проходит code review, имеет историю изменений и воспроизводится с нуля одной командой. Ответ на вопрос «почему на проде не так, как на staging» перестаёт быть археологией — достаточно сравнить два файла.

Главная проблема, которую IaC лечит, — дрейф конфигурации: сервер, который полгода правили вручную, становится уникальным снежинкой. Его нельзя воспроизвести, его страшно трогать, а после отказа диска восстановление превращается в расследование.

# Terraform: три идентичных сервера вместо трёх заявок и кликов
resource "example_server" "web" {
  count  = 3
  name   = "web-0${count.index + 1}"
  cpu    = 4
  memory = 8192
  image  = "ubuntu-24.04"
}

Декларативно и императивно

Императивно Декларативно
Что описываете Шаги: «установи, скопируй, запусти» Результат: «должно быть три сервера»
Повторный запуск Может сломать Ничего не делает, если всё совпадает
Пример bash-скрипт Terraform, манифесты Kubernetes

Ключевое свойство декларативного подхода — идемпотентность: применяете конфиг десять раз — состояние не меняется после первого. Именно поэтому IaC-инструменты вытеснили самописные скрипты развёртывания. Ansible формально описывает шаги, но его модули идемпотентны и приводят систему к заданному состоянию.

Инструменты

Инструмент Слой Задача
Terraform / OpenTofu Провижининг Создать серверы, сети, диски у провайдера
Ansible Конфигурация Настроить ОС и приложения на существующих машинах
cloud-init Первый запуск Пользователи, SSH-ключи, пакеты при старте ВМ
Packer Образы Собрать образ ВМ с уже установленным софтом
Helm Kubernetes Шаблонизация манифестов
Argo CD / Flux GitOps Синхронизация кластера с Git

Типовая связка: Terraform создаёт облачные серверыcloud-init делает первичную настройку → Ansible доводит до рабочего состояния → приложение выкатывает CI/CD.

Что такое GitOps

GitOps — способ применения IaC, в котором Git является единственным источником истины о состоянии системы, а специальный агент внутри кластера непрерывно сводит фактическое состояние к описанному в репозитории.

Отличие от обычного CI/CD принципиальное и называется push vs pull:

  • Push (классический CI/CD): пайплайн снаружи ходит в кластер и выполняет kubectl apply. Значит, у CI-сервера есть учётные данные с правами на production.
  • Pull (GitOps): агент (Argo CD, Flux) живёт внутри кластера, сам следит за репозиторием и применяет изменения. Наружу доступ не нужен, ключей от кластера у CI нет.

Второе свойство — непрерывная сверка. Если кто-то поправит replicas вручную через kubectl, агент увидит расхождение с Git и вернёт как было (или подсветит дрейф). Ручные правки на проде становятся физически бессмысленными.

Отсюда практические следствия: откат — это git revert, аудит — git log, а окружение восстанавливается на пустом кластере из репозитория.

Разработчик → PR в infra-repo → review → merge в main
                                            ↓
                              Argo CD (внутри кластера) видит коммит
                                            ↓
                              применяет манифесты, сверяет состояние

Как это устроено на практике

Репозитории обычно разделяют: код приложения отдельно, манифесты инфраструктуры отдельно. Пайплайн приложения собирает образ, кладёт его в registry и делает один коммит в infra-репозиторий — меняет тег образа. Дальше работает GitOps-агент.

# infra-repo/apps/api/deployment.yaml — единственная строка, которую меняет CI
spec:
  template:
    spec:
      containers:
        - name: api
          image: registry.example.com/api:2f1a9c4   # ← новый тег

Секреты

Главный вопрос к GitOps: пароли в Git класть нельзя, а состояние должно быть полным. Рабочие ответы: шифрование в репозитории (SOPS, Sealed Secrets — в Git лежит только шифротекст) или внешнее хранилище (HashiCorp Vault), из которого агент подтягивает значения при применении. Что нельзя — коммитить открытый .env: попавший в историю секрет скомпрометирован навсегда.

Чего IaC не даёт бесплатно

Состояние (Terraform state) нужно где-то хранить и блокировать, иначе два инженера одновременно снесут друг другу инфраструктуру. Ошибка в декларации применяется так же быстро и надёжно, как правильная конфигурация, — поэтому terraform plan и review обязательны. И порог входа реален: для одного сервера IaC избыточен, окупается он на десятках.

Связанные термины

  • Ansible — конфигурация серверов как код
  • Kubernetes — декларативная платформа, где GitOps раскрывается полностью
  • Git — источник истины в GitOps
  • CI/CD — как GitOps соотносится с классическим пайплайном
  • cloud-init — первичная настройка машин при создании
  • DevOps — культура, частью которой является IaC

Готовы запустить GPU-задачу?

Запустить GPU-сервер