![](https://habrastorage.org/webt/yu/yw/73/yuyw73vma1iva6orib-td5bi4cc.jpeg)
Привет, Хабр! В этой инструкции я покажу, как развернуть сайт в Kubernetes c помощью Terraform. Разберу интеграцию CRaaS с Managed Kubernetes, которая сократит ручную настройку и поможет публиковать образы контейнеров всего в несколько кликов.
Дисклеймер: мы не будем c нуля разбирать особенности работы с Terraform. Если вы не работали с этим инструментом, изучите сначала материал «Как развернуть свое приложение в Kubernetes».
Полезные ресурсы:
- документация Managed Kubernetes,
- Docker,
- Kubectl,
- Terraform,
- документация Terraform,
- репозиторий с инфраструктурами манифестами.
Создаем сервисного пользователя
Мы будем работать в панели управления my.selectel.ru.
Регистрируемся или авторизуемся в панели управления. Нажимаем справа сверху на аккаунт и во всплывающем меню выбираем Профиль и настройки. Далее переходим в Управление пользователями → Сервисные пользователи.
Создаем пользователя с ролями Администратор аккаунта и Администратор пользователей:
![](https://habrastorage.org/webt/na/fm/-d/nafm-dotauzn2n0eipdympmu7fy.png)
При работе с 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.
![](https://habrastorage.org/webt/cr/mp/lp/crmplpsrnwoy6arxv8xkwz3vo5m.png)
Репозитории Hashicorp могут блокировать запросы из России. Чтобы настроить зеркало можно создать следующий файл:
nano .terraformrc
И вставить в него следующее, чтобы использовать наши репозитории как зеркало:
provider_installation {
network_mirror {
url = "https://mirror.selectel.ru/3rd-party/terraform-registry/"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
}
}
Инициализируем Terraform в консоли:
terraform init
![](https://habrastorage.org/webt/9o/bk/gz/9obkgzz4qiqsd2tccjpyrnbl1-0.png)
Создаем инфраструктуру с указанием файла с секретными переменными:
terraform apply -var-file="secrets.tfvars"
![](https://habrastorage.org/webt/hz/tv/rb/hztvrbfgbigodg_dspxzsu1onqw.png)
При необходимости проверяем, что хочет создать Terraform. После пишем в консоли yes для подтверждения и нажимаем Enter.
Ждем, пока Terraform создаст все нужные для инфраструктуры ресурсы:
![](https://habrastorage.org/webt/kf/x6/ve/kfx6vexfs0kke50j3sz53ddlxug.png)
Создаем Container Registry
Возвращаемся в панель управления. Открываем Облачная платформа → Сontainer Registry → Реестры. Здесь должен лежать ваш проект. Мы для примера используем coffee-shop — простой лендинг кофейни.
![](https://habrastorage.org/webt/ho/ie/6x/hoie6xti447radrnkl5uqvd1488.png)
Далее необходимо подготовить образ, который позже добавим в Container Registry — затем из этого образа мы развернем наше приложение. Чтобы собрать образ и запушить в Container Registry, посмотрим данные для авторизации.
Открываем в панели управления Container Registry, переходим на вкладку Токены и нажимаем Сгенерировать токен.
![](https://habrastorage.org/webt/42/dl/oa/42dloa19mqcqknxglvhkkcc8yvm.png)
![](https://habrastorage.org/webt/mk/jd/5x/mkjd5xjmrf--vy8ssy_az2af0_g.png)
Копируем токен, а потом открываем консоль и вводим команду:
docker login cr.selcloud.ru -u token -p <скопированный_из_панели_токен>
Нажимаем Enter и пробуем залогиниться.
Теперь нужно собрать образ из нашего Docker-файла. Вводим в терминале команду:
docker build -t cr.selcloud.ru/<реестр>/<репозиторий> .
docker push cr.selcloud.ru/<реестр>/<репозиторий>
Собираем и пушим образ в Container Registry:
![](https://habrastorage.org/webt/4b/rt/xw/4brtxwtkvdceznjj3zxeo5xarw8.png)
Проверяем в панели управления:
![](https://habrastorage.org/webt/a6/yy/ci/a6yyciabhgmyrfg4otigkhdnk1k.png)
Кластер Kubernetes и реестр созданы.
Мы подготовили инфраструктуру, создали кластер и подготовили реестр: добавили образ, из которого будет запускаться приложение MKS — Managed Kubernetes.
Настраиваем интеграцию между MKS и Container Registry
Обычно, чтобы добавить приватный Registry в кластер Kubernetes, необходимо взять его креды данного и передать их секретом в этот кластер. В этом и заключается наша интеграция: мы идем в Container Registry, создаем токен и затем складываем его секретом в кластер. Что мы для этого делаем?
Сначала проверяем, что кластер перешел в статус Active:
![](https://habrastorage.org/webt/zm/he/d7/zmhed7qmkq89fgig-mglmhxohki.png)
Далее открываем Container Registry в панели управления и переходим в реестр coffee-shop. Жмем Доступ к реестру, выбираем Интеграция с Kubernetes:
![](https://habrastorage.org/webt/yc/-b/pl/yc-bpld6sqgx4_zemrtsyoekqlo.png)
Мы увидим список кластеров, которые находятся в том же проекте, где развернут реестр:
![](https://habrastorage.org/webt/ex/bw/bk/exbwbk6-igmfntj1z7_atstw2-u.png)
Выбираем наш кластер и нажимаем кнопку Интегрировать. Если интеграция пройдет успешно, вы увидите сообщение «Интегрирован с Kubernetes»:
![](https://habrastorage.org/webt/gq/mp/a3/gqmpa3mogqzakyspqc8h98zfhje.png)
Берем наш кластер и качаем конфигурационный файл:
![](https://habrastorage.org/webt/4q/ih/to/4qihtoocgoydv2rd9u3jx1ox29c.png)
Копируем путь до этого файла и делаем экспорт:
export KUBECONFIG=<полный_путь_до_файла>
Проверяем ошибки. Смотрим, какие ноды есть в кластере:
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
![](https://habrastorage.org/webt/1t/bx/7g/1tbx7ggq1jfhhg2srnpdgs9orsy.png)
Делаем приложение доступным в интернете
Выпускаем сертификат
Выпустим для домена SSL-сертификат и используем его на балансировщике нагрузки.
Открываем в панели управления Менеджер секретов и выпускаем новый сертификат:
![](https://habrastorage.org/webt/jo/rb/82/jorb82u9s1v6fqrdazvan_evcpg.png)
Есть разные варианты, мы используем сертификат от Let’s Encrypt. Вводим имя и выбираем домен:
![](https://habrastorage.org/webt/hw/2i/0r/hw2i0r3cqfs3awfufx7bvmm_yra.png)
Здесь yourname11.ru — имя вашего домена, который также указан в ingress.yaml.
![](https://habrastorage.org/webt/f2/dy/id/f2dyidde2yu0pdmbwtxxx8jk9ig.png)
После того как новый сертификат стал активен, скопируем его uuid, чтобы указать потом в Helm-чарте ingress-контроллера.
![](https://habrastorage.org/webt/ph/dp/bu/phdpbumnatemdgnl3icbrndh27u.png)
Важно: сертификат можно выпускать не более пяти раз в неделю.
Устанавливаем облачный балансировщик и 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: "<certificate_uuid>"
}
values.yaml. <certificate_uuid> — скопированный ранее uuid сертификата из менеджера секретов.
![](https://habrastorage.org/webt/hi/a-/32/hia-32ojb7d2tifmca0bhubco-s.png)
Важно: в этом же блоке, 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
Возвращаемся в панель управления и открываем раздел Балансировщики. Видим, что балансировщик появился, а к нему добавились два слушателя:
![](https://habrastorage.org/webt/5g/og/-j/5gog-j_gzuzggscdqdl3mhafwos.png)
Когда балансировщик перейдет в статус Active, обновим страницу и скопируем его внешний IP-адрес:
![](https://habrastorage.org/webt/y-/6d/2m/y-6d2mdyezixm4ln5k56ilipz-a.png)
Далее устанавливаем этот IP-адрес в А-записи домена: Сетевые сервисы → ДНС-хостинг → Домены → Изменить → Редактировать запись.
![](https://habrastorage.org/webt/h2/l0/ss/h2l0sscom_fywsosqd0c5rgt-y0.png)
Работа с услугой DNS-хостинг также описана в нашей документации. Готово!
![](https://habrastorage.org/webt/8f/nz/ur/8fnzurrfryiowjhamwdxn3wi8_e.png)
Возможно, эти тексты тоже вас заинтересуют:
→ Китайская компания Intellifusion представила 14-нм ИИ-процессор. Что это за чип и для чего он нужен?
→ Python, JavaScript или C++? Рассказываем, какие языки программирования изучать в 2024 году
→ Бэкапы для самых маленьких и матерых