логотип PurpleSchool
логотип PurpleSchool

Terraform и Kubernetes инфраструктура как код

Автор

Олег Марков

Введение

Автоматизация инфраструктуры — ключ ко многим современным практикам DevOps. В прошлом настройка серверов, сетей и окружений занимала недели и была подвержена ошибкам. Сейчас вы можете управлять инфраструктурой как обычным кодом. Это сокращает ручной труд, ускоряет релизы и повышает стабильность систем. Terraform и Kubernetes — два ярких представителя этого подхода. Каждый решает разные задачи, но вместе они обеспечивают полный цикл управления современными облачными сервисами.

В этой статье я подробно рассказываю о том, как Terraform позволяет описывать инфраструктуру с помощью кода, а Kubernetes — управлять развертыванием и масштабированием приложений. Вы узнаете, как эти инструменты взаимодействуют, и увидите на примерах, как автоматизировать развертывание облачных сервисов и приложений с минимальными усилиями.

Основные понятия: инфраструктура как код (IaC)

Что такое инфраструктура как код

Инфраструктура как код (Infrastructure as Code, IaC) — подход, при котором все элементы инфраструктуры (серверы, сети, балансировщики, роли доступа и др.) описываются в виде исходного кода. Это облегчает автоматизацию, тестирование, версионирование и переносимость окружений.

Я хочу выделить основные плюсы IaC:

  • Повторяемость: Один и тот же код — одинаковая инфраструктура в любом месте.
  • Быстрая масштабируемость: Вы можете разворачивать нужное количество ресурсов по запросу.
  • Контроль версий: История изменений инфраструктуры хранится в системах контроля версий (Git).
  • Быстрое восстановление после сбоев: В случае неудачного обновления, возвращаетесь к предыдущей версии кода.

Как Terraform и Kubernetes относятся к IaC

  • Terraform создает ресурсы облачной инфраструктуры: виртуальные машины, базы данных, сети, балансировщики и т.д.
  • Kubernetes управляет развертыванием контейнерных приложений в уже созданной инфраструктуре, автоматизируя масштабирование и обновления.
  • Вместе они позволяют автоматизировать запуск цикл: от создания физических ресурсов до деплоймента и скейлинга приложений.

Terraform — автоматизация инфраструктуры

Что такое Terraform

Terraform — инструмент с открытым исходным кодом от компании HashiCorp. Он позволяет с помощью декларативных конфигураций автоматизировать создание, изменение и удаление инфраструктурных ресурсов в разных облаках (AWS, Yandex.Cloud, Google Cloud, Azure, DigitalOcean и др.), а также локальных и виртуализированных инфраструктурах.

Конфигурационные файлы Terraform пишутся на языке HCL (HashiCorp Configuration Language), который простой и легко читается даже новичками.

Основные функции Terraform

  • Декларативное описание инфраструктуры (что хотим получить, а не как это сделать)
  • Провайдеры для разных облаков и сервисов
  • Управление зависимостями между ресурсами
  • Планирование изменений (terraform plan)
  • Применение, удаление и откат изменений (terraform apply, terraform destroy)
  • Хранение состояния инфраструктуры в файлах (state)

Этапы работы с Terraform

Покажу типовой рабочий процесс:

  1. Пишем конфигурацию
provider "aws" {
  region = "eu-central-1"
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0" // ID образа
  instance_type = "t2.micro"
  tags = {
    Name = "ExampleInstance"
  }
}

Этот код создает EC2-инстанс в AWS. Провайдер указывает регион, а ресурс — параметры виртуальной машины.

  1. Инициализация
terraform init
  • Загружает провайдеры и модули.
  1. Планирование изменений
terraform plan
  • Показывает, какие изменения будут внесены в инфраструктуру.
  1. Применение изменений
terraform apply
  • Реально создает или обновляет инфраструктуру.
  1. Удаление ресурсов
terraform destroy
  • Очищает все созданное этой конфигурацией.

Управление зависимостями между ресурсами

Terraform автоматически выстраивает порядок создания ресурсов на основании ссылок. Например, если виртуальной машине нужно сначала создать сеть, Terraform выполнит это.

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "subnet1" {
  vpc_id     = aws_vpc.main.id // Явная зависимость
  cidr_block = "10.0.1.0/24"
}

Terraform State — важный компонент

После каждого применения изменений Terraform сохраняет текущее состояние инфраструктуры в специальном файле terraform.tfstate. Храните этот файл в защищенном месте. Для командной работы обычно используют облачное хранилище (например, AWS S3).

Обратите внимание: потери или несовпадения файлов состояния приводят к нежелательным изменениям инфраструктуры.

Модули Terraform

Модули — это переиспользуемые куски конфигураций, которые можно подключать как библиотеки. Это помогает не дублировать код, например, при создании одинаковых сетей или групп безопасности.

Пример использования собственного модуля:

module "vpc" {
  source = "./modules/vpc"
  cidr_block = var.vpc_cidr
}

Kubernetes — управление приложениями в виде кода

Что такое Kubernetes

Kubernetes — это система оркестрации контейнеров с открытым исходным кодом, помогающая автоматизировать развертывание, масштабирование и управление приложениями. Она работает поверх облаков, физических или виртуальных серверов.

В Kubernetes вы описываете желаемое состояние приложений и кластерных ресурсов в YAML-файлах. После этого Kubernetes поддерживает соответствие реального состояния с описанным в файлах.

Основные сущности и объекты Kubernetes

  • Pod — минимальная исполняемая единица (может содержать 1 или несколько контейнеров)
  • Deployment — контроллер, управляющий обновлениями и масштабированием Pod’ов
  • Service — стабильная точка доступа для приложения (абстракция над Pod’ами)
  • Ingress — управление входящим HTTP(S) трафиком
  • ConfigMap и Secret — хранение параметров и чувствительных данных

Пример: создание Deployment

Смотрите, как выглядит простой Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2                 # Сколько Pod будет создано
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1   # Docker-образ
        ports:
        - containerPort: 80

Этот манифест гарантирует, что всегда запущено 2 Pod’а с образом nginx.

Применение и управление манифестами

Вы используете утилиту kubectl для работы со своими объектами.

kubectl apply -f deployment.yaml   # Применить конфигурацию
kubectl get pods                   # Посмотреть запущенные Pod'ы
kubectl describe deployment nginx-deployment  # Подробности о Deployment

Автоматизация масштабирования и обновлений

С помощью секции replicas Kubernetes автоматически добавляет или убирает Pod’ы. Для обновления образа измените тег в манифесте и примените его снова — Kubernetes плавно обновит контейнеры до новой версии.

Хранение и управление конфигурацией

ConfigMap и Secret используются для передачи переменных окружения, паролей и токенов в Pod’ы. Давайте посмотрим пример ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_HOST: postgres.local
  DATABASE_PORT: "5432"

Вы можете использовать данные из ConfigMap в контейнере:

envFrom:
- configMapRef:
    name: app-config

Helm — пакетный менеджер для Kubernetes

Helm позволяет собирать манифесты в переиспользуемые Chart’ы, управлять сложными приложениями как пакетами. Применение Helm резко упрощает развертывание типовых решений (например, баз данных, систем мониторинга) и их настройку.

Интеграция Terraform и Kubernetes: общий сценарий

Чаще всего Terraform используется для подготовки «фундамента» — кластеров, сетей, сервисных учетных записей, после чего в Kubernetes автоматически деплоятся приложения.

Примерный рабочий процесс выглядит так:

  1. Создание облачных ресурсов с Terraform: например, кластер Kubernetes, балансировщик нагрузки, облачные диски.
  2. Экспорт ключей доступа и параметров в Kubernetes через Terraform output.
  3. Деплой приложений в Kubernetes через манифесты, Helm либо Terraform Kubernetes Provider.

Пример: разворачивание кластера и деплоймент приложения

1. Описание в Terraform создания кластера Kubernetes (AWS EKS):
provider "aws" {
  region = "eu-central-1"
}

module "eks" {
  source          = "terraform-aws-modules/eks/aws"
  cluster_name    = "dev-cluster"
  subnets         = ["subnet-123456", "subnet-abcdef"]
  vpc_id          = "vpc-0dc1bxxx"
  node_groups = {
    eks_nodes = {
      desired_capacity = 2
      max_capacity     = 4
      min_capacity     = 1

      instance_type    = "t3.medium"
    }
  }
}
2. Экспортируем kubeconfig через output:
output "kubeconfig" {
  value = module.eks.kubeconfig
}
3. После применения (terraform apply), используем сгенерированный kubeconfig для подключения к кластеру и развертывания приложений:
export KUBECONFIG=$(terraform output -raw kubeconfig)
kubectl apply -f my-app/deployment.yaml

Если вы хотите полностью автоматизировать развертывание сервисов в terraform-скриптах, можно использовать Kubernetes Provider для Terraform:

provider "kubernetes" {
  config_path = "./kubeconfig.yaml"
}

resource "kubernetes_deployment" "nginx" {
  metadata {
    name = "nginx"
    labels = {
      app = "nginx"
    }
  }
  spec {
    replicas = 2
    selector {
      match_labels = {
        app = "nginx"
      }
    }
    template {
      metadata {
        labels = {
          app = "nginx"
        }
      }
      spec {
        container {
          image = "nginx:1.17.1"
          name  = "nginx"
          port {
            container_port = 80
          }
        }
      }
    }
  }
}

Практика: частые сценарии и советы

Разделение конфигураций

Советую разделять конфигурации Terraform и Kubernetes. Храните инфраструктурный код отдельно от кода приложений. Это упрощает поддержку и позволяет быстрее находить ошибки.

Переменные и секреты

Используйте переменные Terraform для передачи секретов, но ни в коем случае не храните пароли и токены в открытом виде. Для безопасного хранения используйте HashiCorp Vault, AWS Secrets Manager или Kubernetes Secret.

Отладка и ошибки

  • Если terraform apply выдает ошибку — смотрите лог, чаще всего опечатка в именовании ресурсов или отсутствие нужных прав.
  • Если приложение не запускается в Kubernetes — начните с команд kubectl describe pod и kubectl logs. Обычно проблема в параметрах контейнера или переменных окружения.
  • Используйте terraform plan для проверки необдуманных изменений до применения.

Мониторинг и аудит

Обеспечьте аудит изменений файлов состояния (terraform) и журналов событий (kubernetes). Это помогает быстро находить причину инцидентов.

CI/CD для IaC

Храните код инфраструктуры в git. Реализуйте автоматическую проверку и применение изменений через CI/CD (Jenkins, GitLab CI, GitHub Actions). Пример пайплайна:

  1. Проверка синтаксиса
  2. Применение terraform plan
  3. Код-ревью
  4. Деплой через terraform apply

Это снижает риск ошибок и ускоряет работу команды.

Заключение

Terraform и Kubernetes стали неотъемлемой частью современного DevOps. Они покрывают полную цепочку — от создания и поддержки инфраструктуры до эффективного развертывания приложений. Освоив эти инструменты, вы сможете автоматизировать почти любые задачи вокруг инфраструктуры и обслуживания сервисов. Практика показывает: минимизация ручных операций, стандартизация и контроль через код — залог надежных и быстро разворачиваемых систем.

Частозадаваемые технические вопросы

Как безопасно хранить secrets/ключи в Terraform и Kubernetes?

Не используйте открытый текст в репозиториях кода. В Terraform используйте внешние хранилища секретов: Vault, AWS Secrets Manager. В Kubernetes храните секреты через Secret объекта, используйте шифрование at rest и RBAC для ограничения доступа.

Как синхронизировать состояние кластера Kubernetes с Terraform при ручных изменениях?

Лучше всего избегайте внесения изменений вручную. Если такое произошло — выполните команду terraform refresh, чтобы актуализировать состояние, и затем перепроверьте terraform plan. Избыток ручных изменений может привести к конфликтам.

Как откатить неудачный деплой приложения в Kubernetes?

Воспользуйтесь командой kubectl rollout undo deployment/<имя-деплоймента>, чтобы вернуться к предыдущей версии. Kubernetes хранит историю деплоев, что позволяет делать быстрый rollback без ручных изменений манифестов.

Можно ли управлять несколькими окружениями (dev/stage/prod) в Terraform?

Да — для этого используют рабочие пространства (workspaces) или отдельные конфигурационные файлы/директории для каждого окружения. Можно также применять разные переменные (-var-file=dev.tfvars).

Как сделать инфраструктуру Terraform более модульной и поддерживаемой?

Выделяйте повторяемые куски в модули, используйте переменные для конфигураций, давайте осмысленные имена ресурсам. Документируйте интерфейсы модулей и поддерживайте структуру репозитория — это упростит сопровождение и развитие кода.

Настройка и использование Runners в KubernetesСтрелочка вправо

Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!

Kubernetes — часть карты развития DevOps

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Kubernetes

Terraform и Kubernetes инфраструктура как кодНастройка и использование Runners в KubernetesНастройка и деплой PostgreSQL в KubernetesСравнение и интеграция Openshift и KubernetesПримеры интеграции GitHub Actions и KubernetesDeploy приложений в Kubernetes - пошаговое руководство для начинающих и не толькоКак настроить CD в KubernetesИнтеграция Ansible в KubernetesИнтеграция CI/CD с Jenkins и KubernetesИнтеграция Kubernetes с GitLab - Автоматизация CI CD в облачной инфраструктуреГайд по DevOps инструментам в KubernetesОсобенности платформы Deckhouse в Kubernetes
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Kubernetes и Helm

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Микросервисы

Антон Ларичев
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий