03 · Платформа: DevOps, k8s, сеть, хранилище3.8 · Terraform и IaC3.8.1сложный

Зачем 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 вслепую.

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

  • Прочитайте один .tf файл из учебного repo (если доступен) и найдите resource + provider.

  • Объясните, почему Helm chart не заменяет Terraform для создания Kubernetes-кластера.

  • Выпишите три ресурса MDP, которые логично описывать Terraform (не Pod).

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