Что такое декларативный подход в DevOps?

«Что такое декларативный подход в DevOps?» — вопрос из категории Архитектура и DevOps-практики, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Декларативный подход — это парадигма, при которой я описываю желаемое конечное состояние инфраструктуры или конфигурации, а инструмент (Terraform, Kubernetes, Ansible) сам определяет и выполняет последовательность действий для достижения этого состояния.

Контраст с императивным подходом:

  • Императивный (как сделать): "Запусти скрипт, который создаст 3 ВМ, установит на них Nginx и настроит балансировщик". Это последовательность команд.
  • Декларативный (что должно быть): "В инфраструктуре должно быть 3 ВМ с установленным Nginx за балансировщиком". Это описание цели.

Почему в DevOps это стало стандартом:

  1. Идемпотентность: Многократное применение конфигурации даёт один и тот же результат. Не страшно запустить terraform apply дважды.
  2. Версионность и код как инфраструктура (IaC): Конфигурационный файл можно хранить в Git, ревьюить, тегировать.
  3. Самодокументируемость: По файлам Terraform или Kubernetes манифестам легко понять, что развёрнуто.
  4. Упрощение коллаборации и CI/CD: Процесс развёртывания инфраструктуры становится частью пайплайна.

Примеры декларативных инструментов:

1. Terraform (инфраструктура):

# main.tf - Описываем, что в облаке AWS должна быть VPC и две подсети.
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  tags = { Name = "Production VPC" }
}

resource "aws_subnet" "public" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
  availability_zone = "us-east-1a"
}

resource "aws_subnet" "private" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.2.0/24"
  availability_zone = "us-east-1b"
}

Запуск: terraform apply. Terraform сам рассчитает, что нужно создать VPC, затем подсети.

2. Kubernetes (оркестрация контейнеров):

# deployment.yaml - Описываем, что в кластере должен быть деплоймент из 3 реплик нашего приложения.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3 # ЖЕЛАЕМОЕ состояние: 3 пода
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app-container
        image: myregistry/app:v1.2.3
        ports:
        - containerPort: 8080

Применение: kubectl apply -f deployment.yaml. Если один под упадёт, Kubernetes автоматически создаст новый, чтобы соответствовать декларации (replicas: 3).

3. Ansible (в декларативном режиме):

# site.yml - Описываем, что на серверах должна быть установлена последняя версия nginx и он должен быть запущен.
- hosts: webservers
  tasks:
    - name: Ensure nginx is at the latest version
      ansible.builtin.apt:
        name: nginx
        state: latest
    - name: Ensure nginx is running
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: yes

Итог: Декларативный подход — это фундамент современного DevOps, позволяющий управлять сложной, масштабируемой и воспроизводимой инфраструктурой предсказуемым образом.