Зачем это нужно
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).