Инфраструктура для учебного проекта Momo Store — пельменной по курсу "DevOps для эксплуатации и разработки".
Проект демонстрирует применение Terraform, GitLab CI, Helm и GitOps-подхода при развёртывании приложения в Яндекс Облаке.
Инфраструктура создаётся полностью с помощью Terraform и включает:
| Компонент | Назначение |
|---|---|
| VPC (сеть + подсеть) | Виртуальная частная сеть для компонентов Kubernetes |
| Service Accounts (4) | Для доступа S3 бакет, создания инфраструктуры, SA для master и worker-нод |
| IAM роли | Доступ к VPC, Compute, Registry и управлению кластером |
| Kubernetes Cluster | Managed Service for Kubernetes (STABLE release channel) |
| Node Group | Группа нод с авто-масштабированием (1–3 ноды) |
| S3 Bucket | Object Storage для хранения изображений и Terraform state |
| Static Upload | Автоматическая загрузка файлов из ./images в бакет |
| Outputs | Вывод cluster_id Managed Kubernetes Cluster |
- Terraform — инфраструктура как код
- Yandex Cloud — облачная платформа (Managed K8s, Object Storage, IAM)
momo-store-infrastructure/
├── Terraform/
├──── backend.tf # Настройки удалённого хранения state в Object Storage
├──── k8s.tf # Создание Kubernetes кластера и node group
├──── main.tf # Определение провайдеров Terraform
├──── network.tf # Создание VPC и подсети
├──── outputs.tf # Вывод полезных данных
├──── providers.tf # Подключение Yandex Cloud провайдера
├──── service_accounts.tf # Сервисные аккаунты и IAM роли
├──── static-backet.tf # Создание S3-бакета и загрузка изображений
├──── terraform.tfvars # Значения переменных
├──── variables.tf # Переменные Terraform
└──── images/ # Локальные файлы для загрузки в Object Storage
Установить зависимости (Устанавливаем утилиты yc, terraform):
curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash source ~/.bashrc wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list sudo apt update && sudo apt install terraform
Перед запуском Terraform необходимо создать два сервисных аккаунта (SA):
| Сервисный аккаунт | Назначение | Необходимые роли |
|---|---|---|
| terraform-admin | используется Terraform для создания ресурсов (VPC, кластер, сервисные аккаунты и т.д.) | editor, vpc.admin, compute.admin, iam.admin, k8s.clusters.admin, storage.admin |
| terraform-state-sa | используется Terraform для доступа к Object Storage (S3 backend) | storage.admin |
# Авторизация в облаке (если не выполнена) yc init # Создаём SA для Terraform yc iam service-account create --name tf-admin --description "Admin SA for Terraform" # Создаём SA для хранения state yc iam service-account create --name terraform-backend-sa --description "SA for Terraform S3 backend" # Назначаем роли (замените <FOLDER_ID> на ваш) FOLDER_ID=<your-folder-id> # Terraform backend SA yc resource-manager folder add-access-binding $FOLDER_ID \ --role storage.admin \ --subject serviceAccount:$(yc iam service-account get terraform-backend-sa --format json | jq -r .id) # Terraform admin SA yc resource-manager folder add-access-binding $FOLDER_ID \ --role admin \ --subject serviceAccount:$(yc iam service-account get tf-admin --format json | jq -r .id)
yc iam access-key create --service-account-name terraform-backend-sa
В ответе появятся поля access_key.id и secret, сохраните их в переменные окружения:
export AWS_ACCESS_KEY_ID="<идентификатор_ключа>" export AWS_SECRET_ACCESS_KEY="<секретный_ключ>"
yc iam key create \ --service-account-name terraform-admin \ --output key.json
Файл key.json должен находиться в корне проекта и добавлен в .gitignore.
Клонируйте репозиторий и перейдите в директорию с кодом:
git clone https://gitlab.praktikum-services.ru/std-ext-019-01/momo-store-infrastructure.git
cd momo-store-infrastructure/terraformИнициализируйте и примените конфигурацию:
terraform init terraform plan terraform apply
После успешного выполнения Terraform создаст:
- сеть и подсеть VPC;
- сервисные аккаунты с нужными IAM-ролями;
- Managed Kubernetes-кластер с нод-группой;
- публичный бакет для статики (
dbykovski-momo-storage).
| Переменная | Описание | Default |
|---|---|---|
cloud_id |
ID облака Yandex Cloud | — |
folder_id |
ID каталога | — |
sa_key_file |
Путь к JSON-ключу сервисного аккаунта | — |
default_zone |
Зона размещения ресурсов | ru-central1-a |
network_name |
Имя VPC сети | momo-network |
subnet_a_cidr |
CIDR подсети | 10.128.0.0/24 |
cluster_name |
Имя Kubernetes кластера | momo-k8s |
node_group_name |
Имя группы нод | momo-nodes |
node_vm_type |
Тип ВМ для нод | standard-v2 |
node_cores |
Количество CPU на ноду | 2 |
node_memory |
Количество памяти (ГБ) | 2 |
node_disk_size |
Размер диска (ГБ) | 64 |
node_count_min |
Минимум нод | 1 |
node_count_max |
Максимум нод | 3 |
static_bucket_name |
Имя Object Storage бакета | dbykovski-momo-storage |
После выполнения terraform apply создаётся публичный бакет:
https://storage.yandexcloud.net/dbykovski-momo-storage/
куда автоматически загружаются файлы из папки ./images.
Права доступа:
- ✅ чтение — публичное
- 🚫 листинг содержимого — запрещён
-
Тип: Managed Service for Kubernetes
-
Release Channel: STABLE
-
Master — публичный доступ
-
Node Group:
- Автомасштабирование: 1–3 ноды
- Тип:
standard-v2 - 2 CPU, 2 GB RAM, 64 GB HDD
-
Автоматически создаются:
- Service Accounts для Master и Nodes
- IAM роли (
editor,compute.admin,container-registry.images.puller,vpc.publicAdmin)
- JSON-ключ сервисного аккаунта не хранится в Git, путь задаётся переменной
sa_key_file - Доступы к Terraform backend через IAM и GitLab CI/CD Variables (если автоматизация)
- Object Storage настроен на публичное чтение только статических файлов
# Проверить текущее состояние terraform state list # Удалить инфраструктуру terraform destroy # Получить kubeconfig повторно yc managed-kubernetes cluster get-credentials momo-k8s --external --force
После успешного развёртывания инфраструктуры и деплоя приложения
проект доступен по адресу:
🔗 https://momo.dbykovski.ru
- Дмитрий Быковский, std-ext-019-01
- Проект по курсу «DevOps для эксплуатации и разработки»
- Ноябрь 2025