Как развернуть сайт в Kubernetes и использовать CRaaS

Как развернуть сайт в Kubernetes и настроить интеграцию с CraaS

По шагам разберем, как создать в Terraform кластер Kubernetes и реестр для хранения образов, выпустить сертификат и добавить его в Load Balancer, а затем опубликовать приложение в сети.

В этой инструкции мы не будем 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 — номер аккаунта (или номер договора) в панели управления.

username — имя пользователя, созданного ранее в панели.

project_name — название проекта в облачной платформе, который создаст Terraform.

project_user_name — имя пользователя, который создаст Terraform.

Чувствительные данные хранить в файле небезопасно без какого-то ограничения доступа или шифрования, но зато удобно, видно все и сразу.

Также можно задать такие данные через переменные окружения в консоли. Специальные переменные описаны на этих страницах: 

  • [Openstack](https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs);

[Selectel](https://docs.selectel.ru/terraform/selectel-provider-reference/authentication/);

Работа с 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:

Пушим образ.

Проверяем в панели управления:

Открываем панель управления.

Итак, мы подготовили инфраструктуру, создали кластер и подготовили реестр: добавили образ, из которого будет запускаться приложение Managed Kubernetes.

Настраиваем интеграцию между Managed Kubernetes и 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. Вводим имя и выбираем домен:

Выбираем Let’s Encrypt.

Здесь yourname11.ru — имя вашего домена, который также указан в ingress.yaml.

Указываем имя сертификата и основной домен.

Когда новый сертификат станет активным, скопируем его uuid, чтобы указать потом в helm-чарте ingress-contoller:

Копируем UUID.

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

Устанавливаем облачный балансировщик и 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>"
}

Где <certificate_uuid> — скопированный ранее uuid сертификата из Менеджера секретов.

Указываем 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.

Далее устанавливаем этот IP-адрес в А-записи домена: Сетевые сервисыДНС-хостингДоменыИзменитьРедактировать запись.

Добавляем запись.

Работа с услугой DNS-хостинг также описана в нашей документации.

Готово!

Видим опубликованную страницу.