В этом руководстве вы узнаете, как использовать облачные технологии Docker и Kubernetes для развертывания официального демонстрационного приложения Strapi — приложения FoodAdvisor.
Автор: Вера Кови
С постоянным ростом числа интернет-пользователей спрос на создание масштабируемых веб-приложений находится на небывало высоком уровне. Прошли те времена, когда предприятия запускали свои серверы на самоуправляемом оборудовании.
Появление облачных вычислений привело к переходу на облачно-нативную модель разработки программного обеспечения. Cloud-native — это не просто использование облачного провайдера для обслуживания приложений, это подход «все в одном», который использует все преимущества модели облачных вычислений.
При развертывании cloud-native приложение ориентировано на микросервисы, и каждая часть приложения размещается на хостинге. Контейнеры упорядочиваются, чтобы обеспечить планирование их работы таким образом, чтобы оптимизировать использование ресурсов, что означает хорошую производительность приложения и сбалансированную нагрузку на пользователя. Такой подход отличается от традиционного монолитного приложения, которое приходится масштабировать и поддерживать вручную.
Docker — это открытая платформа для разработки, распространения и запуска приложений. Docker позволяет отделить приложения от инфраструктуры и быстро распространять программное обеспечение.
Kubernetes — это система оркестровки контейнеров, используемая для автоматического развертывания, масштабирования и управления контейнерами. Kubernetes упрощает запуск приложений с контейнерами. Несколько рабочих машин объединяются в кластер, и на каждой рабочей машине размещаются пулы, в которых запускаются различные контейнеры, связанные с приложением. Если вы новичок в Kubernetes, официальные руководства — отличное место для начала.
Предварительные условия
Чтобы следовать этому руководству, вам необходимо следующее:
- Базовое понимание Strapi [начните здесь],
- Node.js, загруженный и установленный,
- Понимание Docker,
- базовое понимание Kubernetes,
- Minikube, установленный локально [начать работу можно здесь],
- Знания о том, как использовать kubectl для управления кластерами Kubernetes, и
- (Необязательно) Знания о том, как использовать облачный провайдер, предлагающий услуги 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.