Поиск по сайту:

Развертывание экспресс-приложения в кластере Kubernetes


Автор выбрал Girst Who Code для получения пожертвования в рамках программы Write for DOnations.

Введение

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

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

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

В этом руководстве вы создадите и протестируете пример приложения Express локально на своей машине разработки. Затем вы поместите свое приложение в контейнер с помощью Docker, развернете его в кластере Kubernetes и создадите балансировщик нагрузки, который будет служить общедоступной точкой доступа к вашему приложению.

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

Прежде чем приступить к этому уроку, вам понадобится следующее:

  • Сервер разработки или локальный компьютер, на котором вы будете развертывать приложение. Хотя инструкции в этом руководстве в основном подходят для большинства операционных систем, в этом руководстве предполагается, что у вас есть доступ к системе Ubuntu 22.04, настроенной с использованием пользователя без полномочий root с привилегиями sudo, как описано в нашем руководстве по начальной настройке сервера для Ubuntu 22.04.

  • Инструмент командной строки Docker, установленный на вашем компьютере разработки. Чтобы установить это, выполните шаги 1 и 2 нашего руководства «Как установить и использовать Docker в Ubuntu 22.04».

  • Инструмент командной строки kubectl, установленный на вашей машине разработки. Чтобы установить это, следуйте этому руководству из официальной документации Kubernetes.

  • Бесплатная учетная запись в Docker Hub, в которую вы сможете перенести свой образ Docker. Чтобы настроить это, посетите веб-сайт Docker Hub, нажмите кнопку Начать Начать в правом верхнем углу страницы и следуйте инструкциям по регистрации.

  • Кластер Kubernetes. Вы можете подготовить кластер DigitalOcean Kubernetes, следуя нашему краткому руководству по Kubernetes. Где бы вы ни приобрели кластер, настройте файл конфигурации и убедитесь, что вы можете подключиться к кластеру с вашего сервера разработки.

Шаг 1. Настройка примера экспресс-приложения

На этом этапе вы создадите пример приложения Express с использованием Node.js. После того как вы закрепите это приложение с помощью Docker, оно будет обслуживать приложение Express Hello World в ответ на запросы к IP-адресу вашего сервера через порт 8080.

Начните с обновления списков пакетов вашего сервера, если вы еще не делали этого в последнее время:

$ sudo apt update

Затем загрузите ключ GPG Node.js в каталог /etc/apt/keyrings.

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg

Затем добавьте репозиторий NodeSource в список источников APT.

$ echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

После этого обновите индекс репозитория и установите Node.js, выполнив приведенные ниже команды в терминале/командной строке.

sudo apt update -y
sudo apt install -y nodejs

Затем убедитесь, что вы находитесь в своем домашнем каталоге, и создайте новый каталог, который будет содержать все файлы вашего проекта:

$ cd && mkdir express-app

Затем перейдите в этот новый каталог:

$ cd express-app

Используйте nano или предпочитаемый вами текстовый редактор, чтобы создать файл с именем package.json для определения метаданных о проекте и его зависимостях:

$ nano package.json

Добавьте следующие строки:

{
  "name": "simple-express-app",
  "version": "1.0.0",
  "description": "Express Hello World Application",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "4.17.1"
  }
}

Краткое объяснение приведенного выше кода показано ниже:

  • имя: «simple-express-app» — в этом поле указывается имя приложения Node.js. В данном случае оно называется «simple-express-app». »

  • версия: «1.0.0» — в этом поле указывается номер версии приложения.

  • описание: «Приложение Express Hello World» — в этом поле содержится краткое описание приложения. В данном случае оно описывается как «Приложение Express Hello World». »

  • main: «index.js» — основное поле определяет точку входа приложения, т. е. основной файл, который будет выполняться при запуске приложения. В этом примере для точки входа установлено значение «index.js. »

  • скрипты: – в этом разделе определяются пользовательские сценарии, которые можно выполнять с помощью npm. В этом случае существует сценарий с именем «start», определенный в разделе «scripts».

  • «start»: «node index.js»: — этот скрипт сообщает npm выполнить команду node index.js при запуске команды npm start. По сути, он запускает приложение, запуская файл index.js.

  • зависимости: – в этом разделе перечислены внешние пакеты (зависимости), от которых зависит проект.

  • «express»: «4.17.1»: — это указывает, что приложение зависит от версии Express.js 4.17.1. Express.js — это популярная платформа веб-приложений для Node.js.

Сохраните и закройте этот файл. Если вы создали этот файл с помощью nano, нажмите CTRL + X, Y, затем ENTER.

Затем создайте файл с именем index.js, который будет содержать код вашего приложения Express:

$ nano index.js

Добавьте следующий код:

'use strict';

const express = require('express');

const PORT = process.env.PORT || 8080;

const app = express();

app.get('/', function(req, res) {

    res.send('Express Hello World Application!\n');

});

app.listen(PORT);

console.log('Running on http://localhost:' + PORT);

Краткое объяснение приведенного выше кода показано ниже:

  • use strict; — этот оператор активирует строгий режим в JavaScript. Строгий режим помогает выявить распространенные ошибки кодирования и предотвращает использование определенных функций, подверженных ошибкам. В современных приложениях JavaScript рекомендуется использовать строгий режим.

  • const express=require(’express’); — эта строка импортирует платформу Express.js в приложение. Требуемая функция — это обычная функция Node.js, используемая для импорта модулей.

  • const PORT =process.env.PORT || 8080; — эта строка устанавливает порт, который будет прослушивать приложение Express.js. Он использует переменную средыprocess.env.PORT, если она доступна, которая обычно используется в облачных средах. Если переменная среды не установлена, по умолчанию используется порт 8080.

  • const app=express(); — эта строка создает экземпляр приложения Express. Функция express() используется для создания объекта приложения Express, который затем можно использовать для определения маршрутов и обработки HTTP-запросов.

  • app.get('/', function (req, res) { res.send('Express Hello World Application!\n'); }); — этот блок определяет маршрут для обработки HTTP GET запросы к корневому пути ('/'). Когда пользователь обращается к корневому пути приложения, выполняется предоставленная функция обратного вызова. В этом случае в качестве ответа он отправляет строку “Express Hello World Application!\n”.

  • app.listen(PORT); — эта строка запускает приложение Express.js и заставляет его прослушивать входящие запросы на указанный порт (PORT). Приложение будет продолжать работать и обрабатывать входящие HTTP-запросы до тех пор, пока оно не будет прекращено вручную.

  • console.log('Running on http://localhost:' + PORT); — эта строка выводит на консоль сообщение, указывающее, что сервер работает. Он включает URL-адрес (http://localhost:) и порт, который прослушивает сервер.

Сохраните и закройте этот файл.

Затем установите все необходимые зависимости, выполнив:

$ npm install

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

$ npm start

Выход.

simple-express-app@1.0.0 start
node index.js
Running on http://localhost:8080

Этот вывод подтверждает, что приложение работает должным образом. Однако он будет работать бесконечно, поэтому закройте его, нажав CTRL + C.

Шаг 2. Докеризация вашего экспресс-приложения

Ваше приложение Express создано и работает только на вашем сервере разработки. Теперь вы портируете это приложение с помощью Docker. Чтобы он мог работать на любой машине, поддерживающей контейнеры Docker.

Первым шагом к докеризации вашего приложения Express является создание Dockerfile. Dockerfile — это скрипт, который определяет ряд команд и настроек, определяющих, как должен быть создан образ Docker.

Давайте создадим новый файл с именем Dockerfile:

$ nano Dockerfile

Добавьте следующую конфигурацию:

FROM node:18-alpine as builder
ENV NODE_ENV="production"

Скопируйте исходный код приложения в каталог /app.

COPY . /app

Каталог приложения будет рабочим каталогом.

WORKDIR /app

Установите зависимости Node.js, определенные в «/app/package.json»:

RUN npm install
FROM node:18-alpine
ENV NODE_ENV="production"
COPY --from=builder /app /app
WORKDIR /app
ENV PORT 8080
EXPOSE 8080

Запустите приложение:

CMD ["npm", "start"]

Краткое объяснение вышеуказанной конфигурации показано ниже:

  • FROM node:18-alpine as builder — устанавливает базовый образ для первого этапа процесса сборки. В качестве отправной точки он использует официальный образ Node.js 18, основанный на Alpine Linux.

  • ENV NODE_ENV=“production” — устанавливает для переменной среды Node значение “production. »

  • КОПИРОВАТЬ . /app — копирует исходный код приложения из локального каталога (где находится Dockerfile) в каталог /app внутри образа.WORKDIR /app — устанавливает рабочий каталог для последующие команды для /app.

  • RUN npm install — устанавливает зависимости Node.js, указанные в файле package.json. Этот шаг имеет решающее значение для подготовки приложения к запуску в производственной среде.

  • FROM node:18-alpine — устанавливает базовый образ для второго этапа, который представляет собой облегченный образ Node.js 18 на базе Alpine Linux. Этот этап будет финальным изображением.

  • COPY --from=builder /app /app — копирует весь каталог /app со стадии сборки в каталог /app окончательного образа. Это гарантирует, что в окончательное изображение будут включены только необходимые артефакты со стадии компоновщика.

  • WORKDIR /app — устанавливает рабочий каталог /app.

  • ENV PORT 8080 — устанавливает для переменной среды PORT значение 8080.

  • EXPOSE 8080 — сообщает Docker, что приложение внутри контейнера будет использовать порт 8080. Это скорее функция документации, и на самом деле она не публикует порт.

  • CMD [“npm”, “start”] — указывает команду, которая будет выполняться при запуске контейнера из этого образа. В этом случае оно запускает приложение с помощью команды npm start.

Сохраните и закройте файл после добавления этих строк.

На данный момент этот Dockerfile находится в корне вашего проекта. Далее вы создадите образ Docker с помощью команды docker build. Эта команда включает флаг -t, который при передаче значения express-app присваивает образу Docker имя express-app и помечает его. .

Последний аргумент, который вы передадите, — это путь: .. Это указывает, что вы хотите создать образ Docker из содержимого текущего рабочего каталога. Кроме того, обязательно обновите имя пользователя Sammy до вашего Docker Hub:

$ docker build -t sammy/express-app .

Выход.

Successfully built 131274ef59g1
Successfully tagged express-app:latest

Затем запустите команду docker images, чтобы увидеть вновь созданный образ.

$ docker images

Выход.

REPOSITORY              TAG         IMAGE ID       CREATED         SIZE
sammy/express-app   latest      780373988b65   3 minutes ago   179MB

Затем создайте и запустите контейнер, используя только что созданный образ.

$ docker run -it --name express-container -p 8080:8080 sammy/express-app

Теперь вы можете увидеть приложение в действии, открыв браузер и перейдя по следующему URL-адресу:

http://your_server_ip:8080

После проверки приложения в браузере остановите его, нажав CTRL + C в терминале.

Шаг 3. Отправка образа Docker в реестр Docker Hub

Затем вам необходимо отправить образ Docker вашего приложения Express в реестр Docker Hub, чтобы вы могли получить образ из централизованного расположения.

Выполните следующую команду, чтобы войти в репозиторий образов Docker Hub.

$ docker login

Вам будет предложено ввести имя пользователя и пароль Docker Hub. После их правильного ввода вы увидите «Вход успешен» в выводе команды.

Login Succeeded

После успешного входа в систему отправьте новый образ в Docker Hub с помощью команды docker push:

$ docker push sammy/express-app:latest

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

На этом этапе вы поместили свое приложение Express в реестр Docker Hub. Теперь вы готовы развернуть свое приложение в кластере Kubernetes.

Шаг 4 — Настройка kubectl

Перед развертыванием приложения в кластере Kubernetes вам необходимо скачать файл конфигурации Kubernetes и настроить Kubectl для его использования. По умолчанию, когда вы запускаете команды с помощью инструмента командной строки kubectl, вам необходимо указать путь к файлу конфигурации кластера Kubernetes, используя флаг –kubeconfig. В этом случае вам нужно будет загрузить и сохранить файл конфигурации Kubernetes по адресу ~/.kube/config, чтобы можно было запускать команду kubectl без –kubeconfig. Флаг , указывающий на это.

Сначала создайте новый каталог под названием ~/.kube:

$ mkdir ~/.kube

Затем переместите файл конфигурации кластера в этот каталог и переименуйте его в config:

$ mv clusterconfig.yaml ~/.kube/config

Теперь запустите команду kubectl, чтобы проверить подключение кластера Kubernetes.

$ kubectl get nodes

Эта команда отобразит все узлы, находящиеся в вашем кластере Kubernetes.

NAME                           STATUS   ROLES    AGE   VERSION
express-cluster-02ffa7d2b32a   Ready    <none>   25m   v1.28.3
express-cluster-537ffda09c7d   Ready    <none>   25m   v1.28.3
express-cluster-cfc99499b42b   Ready    <none>   25m   v1.28.3

После настройки kubectl вы готовы развернуть свое приложение в кластере Kubernetes.

Шаг 5. Создание развертывания Kubernetes

На этом этапе вы создадите файл манифеста Kubernetes для развертывания. Этот файл манифеста будет содержать все сведения о конфигурации, необходимые для развертывания приложения Express в кластере.

Создайте новый файл с именем deployment.yaml в корневом каталоге вашего проекта: express-app/.

$ nano deployment.yaml

Добавьте следующую конфигурацию.

kind: Deployment
apiVersion: apps/v1
metadata:
  name: express-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: express-app
  template:
    metadata:
      labels:
        app: express-app
    spec:
      containers:
        - name: express-app
          image: 'sammy/express-app:latest'
          ports:
            - containerPort: 80

Краткое объяснение вышеуказанного файла показано ниже:

  • kind и apiVersion: определяет тип ресурса Kubernetes и версию API. В данном случае это развертывание из API приложений/v1.

  • метаданные. Содержит метаданные о развертывании, включая имя.

  • спецификация: описывает желаемое состояние развертывания.

  • replicas: 3: Указывает, что желаемое количество реплик (модулей) для этого развертывания равно 3. Kubernetes обеспечит постоянную работу трех модулей.

  • селектор. Определяет, как развертывание определяет, какими модулями оно управляет.

  • matchLabels:: Указывает, что модули, управляемые этим развертыванием, должны иметь метку app: express-app.

  • шаблон: описывает шаблон модуля, который служит основой для создания новых модулей, управляемых развертыванием.

  • Метаданные. Определяет метки для модулей, созданных на основе этого шаблона. В данном случае метка — app: express-app.

  • спецификация. Описывает характеристики модуля.

  • контейнеры. Указывает контейнеры, которые должны работать в модуле.

  • имя: express-app: Устанавливает имя контейнера «express-app. »

  • image: sammy/express-app:latest: Указывает образ Docker (sammy/express-app:latest) для контейнера. Вероятно, это изображение содержит приложение Express.js.

  • порты. Указывает порты, которые нужно открыть в контейнере.

  • containerPort: 80: Устанавливает порт контейнера на 80. Это указывает на то, что приложение внутри контейнера прослушивает порт 80.

Сохраните и закройте этот файл.

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

$ kubectl apply -f deployment.yaml

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

$ kubectl get deployment

Выход.

NAME          READY   UP-TO-DATE   AVAILABLE   AGE
express-app   3/3     3            3           12s

Шаг 6. Создание службы Kubernetes

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

Давайте создадим новый файл с именем service.yaml:

$ nano service.yaml

Добавьте следующие конфигурации:

apiVersion: v1
kind: Service
metadata:
  name: load-balancer
  labels:
    app: express-app
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: express-app

Краткое объяснение приведенного выше файла конфигурации службы показано ниже:

  • apiVersion и kind: указывает тип ресурса Kubernetes и версию API. В данном случае это Сервис из API v1.

  • метаданные. Содержат метаданные о Сервисе, включая название.

  • labels:: Присваивает Службе метки. Назначается метка app: express-app, которая соответствует меткам, используемым в связанных модулях.

  • спецификация. Описывает желаемое состояние Службы.

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

  • ports:: Определяет массив сопоставлений портов.

  • порт: 80: определяет, что служба должна быть доступна извне через порт 80.

  • targetPort: 8080: Указывает, что служба должна перенаправлять входящий трафик через порт 80 на порт 8080 модулей. Это порт, который прослушивает приложение внутри модулей.selector:: Указывает набор меток, используемых для идентификации модулей, на которые Служба будет перенаправлять трафик.

  • app: express-app: Этот селектор указывает, что Служба должна перенаправлять трафик в модули с меткой app: express-app. Это соответствует метке, используемой в соответствующем развертывании.

Сохраните и закройте этот файл.

Затем примените эту конфигурацию службы к вашему кластеру Kubernetes:

$ kubectl apply -f service.yaml

Эта команда создаст новый балансировщик нагрузки и послужит общедоступной точкой входа для вашего приложения Express, работающего в кластере.

Чтобы получить доступ к вашему приложению, вам необходимо найти IP-адрес нового балансировщика нагрузки. Вы можете найти его, выполнив следующую команду:

$ kubectl get svc

Выход.

NAME            TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
kubernetes      ClusterIP      10.96.0.1       <none>         443/TCP        32m
load-balancer   LoadBalancer   10.105.40.232   203.0.113.21   80:32244/TCP   2m55s

В приведенном выше выводе найдите столбец EXTERNAL-IP и скопируйте IP-адрес, связанный с балансировщиком нагрузки. В этом примере выходных данных этот IP-адрес — 203.0.113.21. Затем вставьте IP-адрес в строку URL-адреса вашего браузера, чтобы просмотреть приложение, работающее в вашем кластере Kubernetes.

http://203.0.113.21

Заключение

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

Статьи по данной тематике: