Ответ
Immutable Infrastructure (Неизменяемая инфраструктура) — это парадигма, при которой развернутые компоненты (серверы, контейнеры) никогда не модифицируются после их создания. Вместо внесения изменений в работающую систему (патчи, обновления конфигов) развертывается полностью новый, предварительно собранный артефакт (образ, AMI), а старый уничтожается.
Почему это важно в DevOps? Главная цель — устранение дрейфа конфигурации (configuration drift), когда серверы в одном пуле со временем становятся разными из-за ручных или скриптовых изменений, что приводит к сложностям в отладке и недетерминированному поведению.
Как это реализуется на практике:
-
Сборка артефакта: Инструментами вроде 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" # Скрипт настройки ВНУТРИ образа } } - Развертывание через IaC: Инфраструктурный код (Terraform, CloudFormation) разворачивает новый экземпляр из этого образа.
resource "aws_instance" "app" { ami = "ami-abc123" # ID нового, неизменяемого образа instance_type = "t2.micro" tags = { Name = "app-server-v2" } } - Оркестрация: В Kubernetes эта концепция реализована нативно: Pod'ы неизменяемы. Для обновления приложения создается новый Pod с новым образом, а старый удаляется.
Преимущества:
- Надежность и предсказуемость: Каждое развертывание стартует с чистого, протестированного состояния.
- Упрощенный откат: Чтобы откатиться, нужно просто развернуть предыдущую версию образа.
- Безопасность: Уменьшается поверхность атаки, так как на работающих инстансах не выполняются скрипты.
- Идемпотентность: Развертывание всегда дает одинаковый результат.