MLOps Path

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 конфиг → planapply → ресурсы в облаке или 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 вслепую.

Что сделать после занятия

Официальные материалы

Открыть интерактивную версию