3.8.1 · блок 3
Зачем Infrastructure as Code и Terraform
Зачем Infrastructure as Code и Terraform
Зачем это нужно
Kubernetes manifest описывает workloads внутри кластера. Но кто создал сами node'ы, сеть, балансировщик, DNS-зону, bucket MinIO до первого kubectl apply? Infrastructure as Code (IaC) — инфраструктура в версионируемых файлах, как код на Python. Terraform — один из главных инструментов: declarative конфиг → plan → apply → ресурсы в облаке или on-prem API.
ML-инженер на MDP редко пишет Terraform каждый день, но должен понимать: откуда берётся кластер, как связаны модули и почему «ручная кнопка в консоли» ломает воспроизводимость capstone.
Основные идеи
Declarative vs imperative. Вы описываете желаемое состояние («3 node, тип m5.xlarge»), Terraform вычисляет diff с реальностью. Не скрипт «создай VM, если нет» — state file помнит id созданных ресурсов.
Provider. Плагин к API: hashicorp/aws, hashicorp/kubernetes, rancher/rancher2, VMware, Yandex и т.д. Один Terraform project может держать и VPC, и K8s namespace (осторожно с blast radius).
Resource, data source, module.
resource "aws_s3_bucket" "ml_models" {
bucket = "mdp-ml-models-prod"
}
data "aws_availability_zones" "available" {}
module "eks" {
source = "./modules/eks"
version = "1.2.0"
node_count = 3
}
State. Файл terraform.tfstate (локально или remote в S3 + lock DynamoDB) — карта «адрес в коде → id в облаке». Не коммитьте state с secrets в публичный Git. Remote state + encryption — стандарт команды.
Plan / Apply.
terraform init # providers, modules
terraform plan # что изменится (dry-run)
terraform apply # применить после review
Idempotency. Повторный apply без изменений кода — «No changes» — как повторный kubectl apply без diff.
Modules. Переиспользуемые пакеты: module "longhorn_storage" инкапсулирует диски и StorageClass defaults. Platform team публикует modules; ML team потребляет outputs (kubeconfig, bucket name).
Terraform vs Helm vs Argo.
| Слой | Инструмент | Что описывает |
|------|------------|---------------|
| Metal/cloud | Terraform | VM, network, LB, IAM |
| Cluster apps | Helm | Deployment, Service, chart |
| GitOps sync | Argo CD | desired state в Git |
Drift. Админ изменил security group в UI — следующий plan покажет drift. IaC culture: править .tf, не консоль.
Как это выглядит на практике
Platform repo terraform-mdp/ (типичная структура):
environments/
dev/
main.tf
terraform.tfvars
prod/
modules/
kubernetes-cluster/
minio/
networking/
Output для ML-команды:
output "minio_endpoint" {
value = module.minio.endpoint
}
output "kubeconfig_path" {
value = module.cluster.kubeconfig
sensitive = true
}
Студент capstone получает endpoint MinIO и namespace — не root на Terraform.
Import существующих ресурсов. Legacy bucket создан руками → terraform import — приведение под управление IaC.
When things break. apply failed на полпути — state может быть inconsistent; нужен terraform refresh, ручной fix или terraform state rm (ops). Студентам — эскалировать platform, не чинить state вслепую.
Что сделать после занятия
- [ ] Прочитайте один
.tfфайл из учебного repo (если доступен) и найдите resource + provider. - [ ] Объясните, почему Helm chart не заменяет Terraform для создания Kubernetes-кластера.
- [ ] Выпишите три ресурса MDP, которые логично описывать Terraform (не Pod).