Этот репозиторий демонстрирует полный автоматизированный цикл развертывания веб-приложения. Проект охватывает создание облачной инфраструктуры, управление конфигурациями, контейнеризацию и полностью автоматизированный CI/CD пайплайн для доставки кода в кластер Kubernetes.
- Облачный провайдер: Yandex Cloud (Compute Cloud, VPC)
- Infrastructure as Code (IaC): Terraform (Создание 2 ВМ: GitLab Runner и k3s Master Node)
- Управление конфигурациями: Ansible (Базовая настройка ОС, установка Docker и k3s)
- Хранилище образов: GitLab Container Registry
- Оркестрация: Kubernetes (легковесный дистрибутив k3s)
- CI/CD: GitLab CI/CD
Пайплайн .gitlab-ci.yml состоит из двух основных стадий:
- Сборка (
build_image): Использует технологию Docker-in-Docker (DinD) для сборки образа приложения и отправки его в GitLab Container Registry. - Деплой (
deploy_to_k8s): Запускает легковесный Alpine-контейнер с SSH-клиентом. Робот подключается к узлу K8s по SSH (используя Deploy Key), применяет манифесты (deployment.yaml,service.yaml) и инициируетrollout restartдля обновления подов.
В процессе настройки пайплайна были решены следующие инженерные задачи:
- Защита Terraform State: Настроен строгий
.gitignore, предотвращающий утечку файловterraform.tfstateс облачными секретами и IP-адресами в публичный репозиторий. - Ошибка TLS в DinD: При сборке образа возникала ошибка подключения к демону Docker (
tcp://docker:2375). Проблема решена отключением проверки TLS-сертификатов (DOCKER_TLS_CERTDIR: "") и переводом GitLab Runner в привилегированный режим (privileged = true). - Автоматизация SSH доступов: Деплой блокировался запросом пароля от личного SSH-ключа. Решение: генерация выделенного беспарольного Deploy Key (
ed25519) и безопасная передача его приватной части в пайплайн через Masked Variables в настройках GitLab.
Для развертывания инфраструктуры в вашем облаке Yandex Cloud:
- Создание инфраструктуры:
cd terraform
terraform init && terraform apply- Настройка серверов:
Обновите файл
ansible/inventory.iniновыми IP-адресами и выполните:
ansible-playbook -i ansible/inventory.ini ansible/playbook.yml- Запуск пайплайна:
Отправьте код (git push) в GitLab. Убедитесь, что переменная
SSH_PRIVATE_KEYкорректно задана в настройках CI/CD вашего репозитория.