Как развернуть сайт c помощью Terraform
Привет, Хабр! В этой инструкции я покажу, как развернуть сайт в Kubernetes c помощью Terraform. Разберу интеграцию CRaaS с Managed Kubernetes, которая сократит ручную настройку и поможет публиковать образы контейнеров всего в несколько кликов.
Дисклеймер: мы не будем c нуля разбирать особенности работы с Terraform. Если вы не работали с этим инструментом, изучите сначала материал «Как развернуть свое приложение в Kubernetes».
Полезные ресурсы:
Создаем сервисного пользователя
Мы будем работать в панели управления my.selectel.ru.
Регистрируемся или авторизуемся в панели управления. Нажимаем справа сверху на аккаунт и во всплывающем меню выбираем Профиль и настройки. Далее переходим в Управление пользователями → Сервисные пользователи.
Создаем пользователя с ролями Администратор аккаунта и Администратор пользователей:
При работе с Terraform мы будем использовать двух провайдеров: Selectel и OpenStack. Этого сервисного пользователя создаем для Selectel. Пользователя для провайдера OpenStack добавим через Terraform.
Клонируем репозиторий с примерами Terraform:
git clone https://github.com/selectel/terraform-examples
И переходим в директорию:
cd terraform-examples/examples/mks/cluster_one_nodegroup_with_net_infra
Создаем отдельный файл для чувствительных данных, где будут храниться: номер аккаунта, имена пользователей и их паролей.
nano secrets.tfvars
Обязательно измените пароли из примера! Вносим в него следующие данные (с указанием ваших данных соответственно):
# Данные для провайдера Selectel
# Задаются в личном кабинете my.selectel.ru
domain_name = "163638"
username = "webinar21"
password = "MJ77FsFE"
# Данные для провайдера OpenStack
# Модуль Terraform автоматически создаст этого пользователя
project_name = "demo11"
project_user_name = "webinar22"
user_password = "lVNH1v+w"
cluster_name = "Demo"
taints = []
labels = {}
- domain_name — номер аккаунта (или номер договора) в my.selectel.ru;
- username — имя пользователя, созданного ранее в панели my.selectel.ru;
- project_name — название проекта в облачной платформе, который создаст Terraform;
- project_user_name — имя пользователя, который создаст Terraform.
Чувствительные данные хранить в файле не безопасно без какого-то ограничения доступа или шифрования, но зато удобно, видно все и сразу.
Также можно задать такие данные через переменные окружения в консоли. Специальные переменные описаны на этих страницах:
Работа с Terraform
В файле vars.tf задаются основные характеристики для будущего кластера. Значения можно переопределить как в vars.tf, так и в secrets.tfvars.
По умолчанию будет создан кластер с двумя worker-нодами (nodes_count=2). Также по умолчанию установлены характеристики для самих worker-нод: cpus=2, ram_mb=4096, volume_gb=32.
Инициализируем Terraform в консоли:
terraform init
Создаем инфраструктуру с указанием файла с секретными переменными:
terraform apply -var-file="secrets.tfvars"
При необходимости проверяем, что хочет создать Terraform. После пишем в консоли yes для подтверждения и нажимаем Enter.
Ждем, пока Terraform создаст все нужные для инфраструктуры ресурсы:
Создаем Container Registry
Возвращаемся в панель управления. Открываем Облачная платформа → Сontainer Registry → Реестры. Здесь должен лежать ваш проект. Мы для примера используем coffee-shop — простой лендинг кофейни.
Далее необходимо подготовить образ, который позже добавим в Container Registry — затем из этого образа мы развернем наше приложение. Чтобы собрать образ и запушить в Container Registry, посмотрим данные для авторизации.
Открываем в панели управления Container Registry, переходим на вкладку Токены и нажимаем Сгенерировать токен.
Копируем токен, а потом открываем консоль и вводим команду:
docker login cr.selcloud.ru -u token -p <скопированный_из_панели_токен>
Нажимаем Enter и пробуем залогиниться.
Теперь нужно собрать образ из нашего Docker-файла. Вводим в терминале команду:
docker build -t cr.selcloud.ru/<реестр>/<репозиторий> .
docker push cr.selcloud.ru/<реестр>/<репозиторий>
Собираем и пушим образ в Container Registry:
Проверяем в панели управления:
Кластер Kubernetes и реестр созданы.
Мы подготовили инфраструктуру, создали кластер и подготовили реестр: добавили образ, из которого будет запускаться приложение MKS — Managed Kubernetes.
Настраиваем интеграцию между MKS и Container Registry
Обычно, чтобы добавить приватный Registry в кластер Kubernetes, необходимо взять его креды данного и передать их секретом в этот кластер. В этом и заключается наша интеграция: мы идем в Container Registry, создаем токен и затем складываем его секретом в кластер. Что мы для этого делаем?
Сначала проверяем, что кластер перешел в статус Active:
Далее открываем Container Registry в панели управления и переходим в реестр coffee-shop. Жмем Доступ к реестру, выбираем Интеграция с Kubernetes:
Мы увидим список кластеров, которые находятся в том же проекте, где развернут реестр:
Выбираем наш кластер и нажимаем кнопку Интегрировать. Если интеграция пройдет успешно, вы увидите сообщение «Интегрирован с Kubernetes»:
Берем наш кластер и качаем конфигурационный файл:
Копируем путь до этого файла и делаем экспорт:
export KUBEСONFIG=<полный_путь_до_файла>
Проверяем ошибки. Смотрим, какие ноды есть в кластере:
kubectl get nodes
Инструкция по установке kubectl доступна на официальной странице.
Устанавливаем приложение в Kubernetes
Опишем, как разместить приложение в кластере Kubernetes.
Клонируем репозиторий командой:
git clone https://gitlab.com/cr-mks-webinar/infra.git
Переходим в директорию с манифестами Kubernetes:
cd infra/k8s/coffee-shop/
В файле deployment.yaml изменяем название секрета, который будет приходить в кластер интеграции:
imagePullSecrets:
- name: craas-auth
И меняем URL образа на актуальный:
containers:
- name: coffee-shop
image: cr.selcloud.ru/coffee-shop/coffee-shop:latest
В файле ingress.yaml меняем домен, по которому будет работать лендинг:
ingressClassName: nginx
rules:
- host: coffee-shop.yourname11.ru
Можно указать используемый вами домен.
Создаем неймспейс, в котором будут находиться абстракции Kubernetes:
kubectl create namespace webinar
Разворачиваем приложение в кластере:
kubectl apply -f .
Смотрим список подов. Проверяем, что все находятся в статусе Running:
kubectl get pods -n webinar
Делаем приложение доступным в интернете
Выпускаем сертификат
Выпустим для домена SSL-сертификат и используем его на балансировщике нагрузки.
Открываем в панели управления Менеджер секретов и выпускаем новый сертификат:
Есть разные варианты, мы используем сертификат от Let«s Encrypt. Вводим имя и выбираем домен:
Здесь yourname11.ru — имя вашего домена, который также указан в ingress.yaml.
После того как новый сертификат стал активен, скопируем его uuid, чтобы указать потом в Helm-чарте ingress-контроллера.
Важно: сертификат можно выпускать не более пяти раз в неделю.
Устанавливаем облачный балансировщик и Ingress-controller
Далее устанавливаем Ingress-контроллер. При его разворачивании мы укажем uuid сертификата, чтобы он был добавлен на Облачный балансировщик.
Переходим по ссылке на инструкцию в нашей документации.
Выбираем вкладку c настройкой балансировщика нагрузки.
Так выглядит генерация values.yaml файла:
helm inspect values ingress-nginx/ingress-nginx > values.yaml
В инструкции по ссылке выше из пункта 4 открываем сгенерированный values.yaml.
И в аннотации сервиса балансировщика указываем uuid сертификата:
annotations: {
loadbalancer.openstack.org/default-tls-container-ref: ""
}
values.yaml. — скопированный ранее uuid сертификата из менеджера секретов.
Важно: в этом же блоке, service, немного ниже нужно изменить порт назначения с HTTPS на HTTP:
targetPorts:
# -- Port of the ingress controller the external HTTP listener is mapped to.
http: http
# -- Port of the ingress controller the external HTTPS listener is mapped to.
https: http # Здесь сделали замену https -> http
Устанавливаем ингресс-контроллер, пишем в консоли:
helm install ingress-nginx/ingress-nginx --generate-name -f values.yaml
Возвращаемся в панель управления и открываем раздел Балансировщики. Видим, что балансировщик появился, а к нему добавились два слушателя:
Когда балансировщик перейдет в статус Active, обновим страницу и скопируем его внешний IP-адрес:
Далее устанавливаем этот IP-адрес в А-записи домена: Сетевые сервисы → ДНС-хостинг → Домены → Изменить → Редактировать запись.
Работа с услугой DNS-хостинг также описана в нашей документации. Готово!
Возможно, эти тексты тоже вас заинтересуют:→ Китайская компания Intellifusion представила 14-нм ИИ-процессор. Что это за чип и для чего он нужен?
→ Python, JavaScript или C++? Рассказываем, какие языки программирования изучать в 2024 году
→ Бэкапы для самых маленьких и матерых