Что такое Immutable Infrastructure?

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

Ответ

Immutable Infrastructure (Неизменяемая инфраструктура) — это парадигма, при которой развернутые компоненты (серверы, контейнеры) никогда не модифицируются после их создания. Вместо внесения изменений в работающую систему (патчи, обновления конфигов) развертывается полностью новый, предварительно собранный артефакт (образ, AMI), а старый уничтожается.

Почему это важно в DevOps? Главная цель — устранение дрейфа конфигурации (configuration drift), когда серверы в одном пуле со временем становятся разными из-за ручных или скриптовых изменений, что приводит к сложностям в отладке и недетерминированному поведению.

Как это реализуется на практике:

  1. Сборка артефакта: Инструментами вроде Packer создается виртуальный образ (AWS AMI, Docker Image, Vagrant Box) со всей необходимой конфигурацией и ПО.

    # Пример Packer для создания AWS AMI
    source "amazon-ebs" "web-server" {
      ami_name = "my-app-{{timestamp}}"
      instance_type = "t2.micro"
      source_ami = "ami-0c55b159cbfafe1f0"
    }
    
    build {
      sources = ["source.amazon-ebs.web-server"]
      provisioner "shell" {
        script = "setup.sh" # Скрипт настройки ВНУТРИ образа
      }
    }
  2. Развертывание через IaC: Инфраструктурный код (Terraform, CloudFormation) разворачивает новый экземпляр из этого образа.
    resource "aws_instance" "app" {
      ami           = "ami-abc123" # ID нового, неизменяемого образа
      instance_type = "t2.micro"
      tags = {
        Name = "app-server-v2"
      }
    }
  3. Оркестрация: В Kubernetes эта концепция реализована нативно: Pod'ы неизменяемы. Для обновления приложения создается новый Pod с новым образом, а старый удаляется.

Преимущества:

  • Надежность и предсказуемость: Каждое развертывание стартует с чистого, протестированного состояния.
  • Упрощенный откат: Чтобы откатиться, нужно просто развернуть предыдущую версию образа.
  • Безопасность: Уменьшается поверхность атаки, так как на работающих инстансах не выполняются скрипты.
  • Идемпотентность: Развертывание всегда дает одинаковый результат.