Развертывание и масштабирование официального демонстрационного приложения Strapi «FoodAdvisor» с помощью Kubernetes и Docker

В этом руководстве вы узнаете, как использовать облачные технологии Docker и Kubernetes для развертывания официального демонстрационного приложения Strapi — приложения FoodAdvisor.

Автор: Вера Кови

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

Появление облачных вычислений привело к переходу на облачно-нативную модель разработки программного обеспечения. Cloud-native — это не просто использование облачного провайдера для обслуживания приложений, это подход «все в одном», который использует все преимущества модели облачных вычислений.

При развертывании cloud-native приложение ориентировано на микросервисы, и каждая часть приложения размещается на хостинге. Контейнеры упорядочиваются, чтобы обеспечить планирование их работы таким образом, чтобы оптимизировать использование ресурсов, что означает хорошую производительность приложения и сбалансированную нагрузку на пользователя. Такой подход отличается от традиционного монолитного приложения, которое приходится масштабировать и поддерживать вручную.

Docker — это открытая платформа для разработки, распространения и запуска приложений. Docker позволяет отделить приложения от инфраструктуры и быстро распространять программное обеспечение.

Kubernetes — это система оркестровки контейнеров, используемая для автоматического развертывания, масштабирования и управления контейнерами. Kubernetes упрощает запуск приложений с контейнерами. Несколько рабочих машин объединяются в кластер, и на каждой рабочей машине размещаются пулы, в которых запускаются различные контейнеры, связанные с приложением. Если вы новичок в Kubernetes, официальные руководства — отличное место для начала.

Предварительные условия

Чтобы следовать этому руководству, вам необходимо следующее:

  1. Базовое понимание Strapi [начните здесь],
  2. Node.js, загруженный и установленный,
  3. Понимание Docker,
  4. базовое понимание Kubernetes,
  5. Minikube, установленный локально [начать работу можно здесь],
  6. Знания о том, как использовать kubectl для управления кластерами Kubernetes, и
  7. (Необязательно) Знания о том, как использовать облачный провайдер, предлагающий услуги Kubernetes (Google’s GKE или Amazon’s EKS).

Что такое Strapi?

Strapi — это безголовая CMS с открытым исходным кодом. Она на 100% состоит из JavaScript и полностью настраивается. Чтобы убедиться в ее эффективности, Strapi предоставляет официальное демонстрационное приложение FoodAdvisor, которое можно предварительно просмотреть на сайте Strapi или развернуть локально или в облаке.

Приложение FoodAdvisor показывает список различных ресторанов и служит демонстрацией возможностей Strapi.

Использование Kubernetes с Headless CMS

Системы управления контентом (CMS) существуют уже давно. Традиционно это были монолитные приложения, обслуживающие контент, изображения, HTML, CSS и JavaScript из одного места. Это затрудняет повторное использование контента, поскольку он привязан к представлению.

Безголовая CMS использует другой подход и отделяет контент от представления. В безголовых CMS контент обслуживается через API, используемый несколькими клиентами, отвечающими за рендеринг контента. Такое разделение идеально подходит для облачно-нативных архитектур, поскольку отдельные компоненты могут содержаться и масштабироваться независимо друг от друга. В этом руководстве вы узнаете, как использовать Kubernetes для развертывания приложения FoodAdvisor.

Создание проекта Strapi

Создать новый проект Strapi очень просто, и он работает точно так же, как установка нового фронтенд-фреймворка. Для начала мы выполним следующие команды и протестируем их в нашем браузере по умолчанию.

    npx create-strapi-app strapi-api --quickstart
    # OR
    yarn create strapi-app strapi-api --quickstart
Войти в полноэкранный режим Выйти из полноэкранного режима

Команда выше создаст новый проект Strapi в указанной вами директории.

Далее выполните команды yarn build для создания приложения и yarn develop для запуска нового проекта, если он не запустится автоматически.

Последняя команда откроет новую вкладку со страницей для регистрации нового администратора системы. Заполните форму и нажмите на кнопку отправки, чтобы создать нового администратора.

Развертывание приложения FoodAdvisor с помощью Kubernetes

Запустите кластер minikube, выполнив следующую команду:

    minikube start
Войти в полноэкранный режим Выйти из полноэкранного режима

Minkube автоматически настроит kubectl для связи с этим локальным кластером, поэтому ручная настройка не требуется. Проверьте, запущен ли minikube, выполнив следующую команду:

    minikube status
Войти в полноэкранный режим Выйти из полноэкранного режима

После того как кластер Minikube запущен и работает, можно приступать к развертыванию приложения FoodAdvisor с помощью Kubernetes.

Подготовка образов Docker

В качестве первого шага вам необходимо клонировать GitHub-репо FoodAdvisor. В этом руководстве будет использоваться версия v4 приложения FoodAdvisor.

Клонируйте репозиторий, перейдите в каталог foodadvisor и перейдите к ветке v4:

    git clone https://github.com/strapi/foodadvisor.git
    cd foodadvisor
    git checkout v4
Войдите в полноэкранный режим Выйти из полноэкранного режима

В репозитории вы увидите две директории: api и client. В директории api находится внутренний сервер Strapi, а также демонстрационные данные. Каталог client содержит фронтенд, написанный на Next.js. Сервер использует локальный файл SQLite в качестве базы данных, поэтому вам не нужно устанавливать отдельную базу данных для запуска этого приложения.

После клонирования репозитория вы подготовите образы Docker для бэкенда и фронтенда. Вам понадобится учетная запись Docker Hub для размещения образов. Если вы не хотите создавать учетную запись, переходите к развертыванию бэкенда и используйте образы, которые я уже подготовил.

После создания учетной записи Docker Hub войдите в систему под своим именем пользователя и паролем, выполнив команду docker login.

В каталоге api создайте следующий Dockerfile:

    FROM node:16

    WORKDIR /app

    ADD ./package.json /app

    ADD ./yarn.lock /app

    RUN yarn install --frozen-lockfile

    ADD . /app

    RUN yarn seed

    EXPOSE 1337

    CMD ["yarn", "develop"]
Вход в полноэкранный режим Выход из полноэкранного режима

Отредактируйте файл .env.example и установите переменную CLIENT_URL в значение http://foodadvisor.client. Затем в том же каталоге выполните следующие команды:

    docker build -t <your-docker-hub-username>/foodadvisor-api .
    docker image push <your-docker-hub-username>/foodadvisor-api:latest
Войти в полноэкранный режим Выйти из полноэкранного режима

Не забудьте подставить имя пользователя Docker Hub. Теперь создайте следующий Dockerfile в каталоге client:

    FROM node:16

    WORKDIR /app

    ADD ./package.json /app

    ADD ./yarn.lock /app

    ADD ./.env.development /app

    RUN yarn install --frozen-lockfile

    ADD . /app

    EXPOSE 3000

    CMD ["yarn", "dev"]
Вход в полноэкранный режим Выйти из полноэкранного режима

Отредактируйте файл .env.development и установите NEXT_PUBLIC_API_URL в http://foodadvisor.backend и выполните следующие команды, заменив, конечно, имя пользователя Docker Hub:

    docker build -t <your-docker-hub-username>/foodadvisor-client .
    docker image push <your-docker-hub-username>/foodadvisor-client:latest
Войти в полноэкранный режим Выйти из полноэкранного режима

Развертывание бэкенда

Когда образы Docker готовы, вы можете приступить к развертыванию бэкенда на вашем кластере Kubernetes. Для взаимодействия с кластером будет использоваться команда kubectl. kubectl принимает файл YAML, в котором объявляются конфигурации, и они применяются к кластеру.

Сохраните следующую конфигурацию в deploy-backend.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: foodadvisor-backend
    spec:
      selector:
        matchLabels:
          app: foodadvisor
          component: backend
      template:
        metadata:
          labels:
            app: foodadvisor
            component: backend
        spec:
          containers:
          - name: foodadvisor-api
            image: faithkovi/foodadvisor-api
            ports:
              - containerPort: 1337
Войти в полноэкранный режим Выйти из полноэкранного режима

Если вы создали собственные образы Docker на предыдущем шаге, измените faithkovi/foodadvisor-api на <your-docker-hub-username>/foodadvisor-api.

YAML-файл устанавливает развертывание с именем foodadvisor-backend. Развертывание создает Pod, который запускает один контейнер с указанным вами образом Docker.

Теперь примените изменения:

    kubectl apply -f deploy-backend.yaml
Войдите в полноэкранный режим Выйти из полноэкранного режима

Вы можете проверить развертывание, выполнив следующую команду:

    kubectl get deployments
Войти в полноэкранный режим Выйти из полноэкранного режима

Бэкэнд теперь работает внутри кластера, но по умолчанию он изолирован от внешнего мира. Чтобы иметь возможность отправлять запросы на сервер извне кластера, необходимо открыть соответствующие порты. В данном случае это порт 1337, поскольку именно к этому порту прислушивается Strapi.

    kubectl expose deployment foodadvisor-backend --port 1337
Вход в полноэкранный режим Выйдите из полноэкранного режима

В результате будет создана служба, что можно проверить, выполнив следующую команду:

    kubectl get services foodadvisor-backend
Войти в полноэкранный режим Выйти из полноэкранного режима

Развертывание фронтенда

Следующим шагом будет развертывание фронтенда и подключение его к бэкенду. Сохраните следующее в deploy-frontend.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: foodadvisor-frontend
    spec:
      selector:
        matchLabels:
          app: foodadvisor
          component: frontend
      template:
        metadata:
          labels:
            app: foodadvisor
            component: frontend
        spec:
          containers:
          - name: foodadvisor-client
            image: faithkovi/foodadvisor-client
            ports:
              - containerPort: 3000
Вход в полноэкранный режим Выйти из полноэкранного режима

Опять же, если вы создали свой собственный образ Docker, замените faithkovi/foodadvisor-client на <your-docker-hub-username>/foodadvisor-client.

Как и для бэкенда, этот YAML создает развертывание, содержащее капсулу, которая запускает указанный образ Docker. Примените изменения для развертывания фронтенда:

    kubectl apply -f deploy-frontend.yaml
Войти в полноэкранный режим Выйдите из полноэкранного режима

Проверьте развертывание, выполнив приведенную ниже команду:

    kubectl get deployments
Войти в полноэкранный режим Выйти из полноэкранного режима

Аналогично бэкенду, вам нужно открыть порт 3000, чтобы вы могли использовать браузер для доступа к фронтенду.

    kubectl expose deployment foodadvisor-frontend --port 3000
Войти в полноэкранный режим Выход из полноэкранного режима

Проверьте работу службы, выполнив команду kubectl get services foodadvisor-frontend.

Создание входа

Наконец, вам нужно добавить Ingress в ваш кластер. Задача ingress — направлять входящие запросы на frontend или backend, в зависимости от URL, который вы используете.

Следующее правило ingress будет направлять все запросы, сделанные на http://foodadvisor.backend, на службу backend, созданную ранее, а все запросы, сделанные на http://foodadvisor.client, на службу frontend.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: main-ingress
    spec:
      rules:
      - host: foodadvisor.backend
        http:
          paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: foodadvisor-backend
                  port:
                    number: 1337
      - host: foodadvisor.client
        http:
          paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: foodadvisor-frontend
                  port:
                    number: 3000
Вход в полноэкранный режим Выход из полноэкранного режима

Сохраните YAML в ingress.yaml. Если вы впервые используете ingress на Minikube, вам необходимо включить аддон:

    minikube addons enable ingress
Войти в полноэкранный режим Выйдите из полноэкранного режима

Убедитесь, что контроллер NGINX Ingress запущен:

    kubectl get pods -n ingress-nginx
Войти в полноэкранный режим Выйти из полноэкранного режима

Этот шаг нужно выполнить только один раз. Наконец, примените вход:

    kubectl apply -f ingress.yaml
Войти в полноэкранный режим Выйти из полноэкранного режима

Последний шаг — сделать имена хостов http://foodadvisor.backend и http://foodadvisor.client известными вашей операционной системе, чтобы вы могли открыть их с помощью браузера. Для этого вам нужно знать IP-адрес кластера minikube:

    minikube ip
Войти в полноэкранный режим Выйдите из полноэкранного режима

Отредактируйте /etc/hosts и добавьте в конец следующие строки. Подставьте соответствующий IP-адрес из предыдущего вывода:

    192.168.49.2  foodadvisor.client
    192.168.49.2  foodadvisor.backend
Вход в полноэкранный режим Выйти из полноэкранного режима

С этими изменениями запросы к http://foodadvisor.backend и http://foodadvisor.client будут отправляться на ваш кластер minikube, где входящий контроллер заберет их и направит в соответствующие места назначения.

Протестируйте ваше приложение

Зайдите на http://foodadvisor.backend/admin, чтобы получить доступ к вашей панели администратора. Поскольку это первый раз, вам будет предложено создать пользователя admin.

После создания пользователя-администратора вы можете получить доступ к приборной панели Strapi и изучить предварительно заполненные образцы данных.

Чтобы получить доступ к фронтенду, посетите сайт http://foodadvisor.client. Вы должны увидеть главную страницу приложения Foodadvisor.

Поздравляем, вы успешно развернули Foodadvisor с помощью Kubernetes.

Заключение

Облачно-нативный подход, несомненно, станет стандартом де-факто для разработки приложений в ближайшем будущем. Этот подход устраняет необходимость в монолитном приложении и вместо этого разделяет приложение на масштабируемые, производительные микросервисы. В результате получается приложение, которое легко разрабатывать и управлять им, чего трудно добиться при традиционном развертывании.

В этом руководстве мы показали, как легко начать работу с Kubernetes для развертывания официального демо-приложения Strapi. Если вас это заинтересовало, посетите сайт Strapi, чтобы узнать больше о Headless CMS. Вы можете найти проект в репозитории Github, а образы docker для клиента и api — в репозитории docker.

Оцените статью
devanswers.ru
Добавить комментарий