Статьи

Развертывание распределенных приложений с помощью Kubernetes и MongoDB Atlas

Эта статья была первоначально опубликована на mongoDB . Спасибо за поддержку партнеров, которые делают возможным использование SitePoint.

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

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

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

Давайте поговорим о том, как развернулось типичное развертывание программного обеспечения:

  1. Разработчик отправит заявку с просьбой о развертывании
  2. Разработчик и я договоримся о времени для развертывания последней версии программного обеспечения
  3. Мы изменили бы существующий bash-скрипт с соответствующей информацией о версии git-репозитория.
  4. Нам нужно вручную создать резервную копию старого развертывания
  5. Нам нужно вручную создать резервную копию нашей текущей базы данных
  6. Мы бы наблюдали, как скрипт bash выполняет это «развертывание» на шести серверах параллельно.
  7. Помахать мертвой курицей над моей клавиатурой

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

В конце концов я перешел на позицию, которая дала мне возможность лучше понять, что другие команды разработчиков, особенно те, кто работает с открытым исходным кодом, делают для развертывания программного обеспечения. Я заметил это — сюрприз! — люди больше не были заинтересованы в том, чтобы делать одну и ту же работу снова и снова.

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

Что такое Kubernetes?

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

Google Kubernetes Engine встроен в облачную платформу Google и помогает быстро развертывать приложения в контейнерах.

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

Почему Атлас с Kubernetes?

Совместное использование этих инструментов для вашего приложения MongoDB позволяет быстро создавать и развертывать приложения, не беспокоясь об управлении инфраструктурой. Atlas предоставляет вам постоянное хранилище данных для ваших приложений без необходимости управлять фактическим программным обеспечением базы данных, репликацией, обновлениями или мониторингом. Все эти функции поставляются «из коробки», что позволяет быстро создавать и развертывать их.

В этом руководстве я создам кластер MongoDB Atlas, в котором наши данные будут храниться в простом приложении Node.js. Затем я превращу приложение и данные конфигурации для Atlas в готовый контейнер с Docker.

MongoDB Atlas доступен в большинстве регионов GCP, поэтому независимо от того, где находится ваше приложение, вы можете хранить свои данные рядом (или распределять) в облаке.

Рисунок 1: MongoDB Atlas работает в большинстве регионов GCP

Требования

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

Сначала я скачаю репозиторий для кода, который буду использовать. В данном случае это базовое приложение для ведения учета с использованием MongoDB, Express, React и Node ( MERN ).

bash-3.2$ git clone [email protected]:cefjoeii/mern-crud.git
Cloning into 'mern-crud'...
remote: Counting objects: 326, done.
remote: Total 326 (delta 0), reused 0 (delta 0), pack-reused 326
Receiving objects: 100% (326/326), 3.26 MiB | 2.40 MiB/s, done.
Resolving deltas: 100% (137/137), done.

cd mern-crud

Далее я установлю npm install

 > [email protected] install /Users/jaygordon/work/mern-crud/node_modules/uws
> node-gyp rebuild > build_log.txt 2>&1 || exit 0

Выбор региона GCP для Atlas

Каждый регион GCP включает в себя определенное количество независимых зон. Каждая зона имеет плоскости питания, охлаждения, сети и управления, которые изолированы от других зон. Для регионов, имеющих как минимум три зоны (3Z), Atlas развертывает кластеры в трех зонах. Для регионов, которые имеют только две зоны (2Z), Atlas развертывает кластеры в двух зонах.

Форма Atlas Add New Cluster помечает области, которые поддерживают кластеры 3Z, как рекомендуемые , поскольку они обеспечивают более высокую доступность. Если в вашем предпочтительном регионе есть только две зоны, рассмотрите возможность включения межрегиональной репликации и размещения члена набора реплик в другом регионе, чтобы повысить вероятность того, что ваш кластер будет доступен во время частичных отключений региона.

Количество зон в регионе не влияет на количество узлов MongoDB, которые Atlas может развернуть. Кластеры MongoDB Atlas всегда состоят из наборов реплик с минимум тремя узлами MongoDB.

Для получения общей информации о регионах и зонах GCP см. Документацию Google по регионам и зонам .

Создать кластер и добавить пользователя

На приведенном ниже изображении вы можете видеть, что я выбрал провайдера облака «Google Cloud Platform». Затем я выбрал размер экземпляра, в данном случае M10. Развертывания с использованием экземпляров M10 идеально подходят для разработки. Если бы мне пришлось немедленно запустить это приложение в производство, я мог бы рассмотреть возможность использования развертывания M30. Поскольку это демо, M10 достаточно для нашего приложения. Для полного просмотра всех размеров кластера, посетите страницу цен Atlas . Выполнив эти шаги, я могу нажать кнопку «Подтвердить и развернуть». Атлас ускорит мое развертывание автоматически через несколько минут.

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

  • Нажмите «Безопасность» вверху страницы.
  • Нажмите «Пользователи MongoDB»
  • Нажмите «Добавить нового пользователя»
  • Нажмите «Показать дополнительные параметры»
  • Затем мы добавим пользователя « mernusermern-crudmern-crud Мы определим привилегии readWrite для этого пользователя:

Нажмите «Добавить пользователя»:

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

Строка подключения

Получите строку подключения, нажав «Кластеры», а затем «ПОДКЛЮЧИТЬ» рядом с информацией о вашем кластере в административной панели Atlas. После выбора подключения вам будет предложено несколько вариантов подключения к кластеру. Нажмите «подключить приложение».

Опции для 3.6 или 3.4 версий драйвера MongoDB приведены. Я собрал свой, используя драйвер 3.4, поэтому я просто выберу строку подключения для этой версии.

Обычно я вставляю это в редактор, а затем изменяю информацию, чтобы она соответствовала моим учетным данным приложения и имени моей базы данных:

Теперь я добавлю это в файл конфигурации базы данных приложения и сохраню его.

Затем я запакую это в изображение с помощью Docker и отправлю в Google Kubernetes Engine!

Докер и Google Kubernetes Engine

Начните с создания учетной записи в Google Cloud, а затем выполните быстрый старт для создания проекта Google Kubernetes .

Как только ваш проект создан, вы можете найти его в панели управления Google Cloud Platform:

Пришло время создать контейнер на вашей локальной рабочей станции:

Установите переменную среды PROJECT_ID

 export PROJECT_ID="jaygordon-mongodb"
gcloud config set project $PROJECT_ID
gcloud config set compute/zone us-central1-b

Затем поместите Dockerfile

 FROM node:boron

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . /usr/src/app

EXPOSE 3000

CMD [npm, start]

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

 bash-3.2$ docker build -t gcr.io/${PROJECT_ID}/mern-crud:v1 .
Sending build context to Docker daemon  40.66MB
Successfully built b8c5be5def8f
Successfully tagged gcr.io/jgordon-gc/mern-crud:v1

Загрузите образ контейнера в Реестр контейнеров, чтобы мы могли развернуть его:

 Successfully tagged gcr.io/jaygordon-mongodb/mern-crud:v1
bash-3.2$ gcloud docker -- push gcr.io/${PROJECT_ID}/mern-crud:v1The push refers to repository [gcr.io/jaygordon-mongodb/mern-crud]

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

 docker run --rm -p 3000:3000 gcr.io/${PROJECT_ID}/mern-crud:v1
> [email protected] start /usr/src/app
> node server
Listening on port 3000

Отлично — указание моего браузера на http: // localhost: 3000 приводит меня на сайт. Теперь пришло время создать кластер Kubernetes и развернуть на нем наше приложение.

Создайте свой кластер с помощью Google Kubernetes Engine

Я буду использовать Google Cloud Shell в панели управления Google Cloud для управления своим развертыванием. Облачная оболочка поставляется со всеми необходимыми приложениями и инструментами, установленными для того, чтобы вы могли развернуть образ Docker, который я загрузил в реестр образов, без установки какого-либо дополнительного программного обеспечения на моей локальной рабочей станции.

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

Сначала настройте нашу среду:

 export PROJECT_ID="jaygordon-mongodb"
gcloud config set project $PROJECT_ID
gcloud config set compute/zone us-central1-b

Запустить кластер

 gcloud container clusters create mern-crud --num-nodes=3

Когда вы закончите, у вас на панели управления будет виден трехузловой кластер Kubernetes. Через несколько минут консоль ответит следующим выводом:

 Creating cluster mern-crud...done.
Created [https://container.googleapis.com/v1/projects/jaygordon-mongodb/zones/us-central1-b/clusters/mern-crud].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-b/mern-crud?project=jaygordon-mongodb
kubeconfig entry generated for mern-crud.
NAME       LOCATION       MASTER_VERSION  MASTER_IP       MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
mern-crud  us-central1-b  1.8.7-gke.1     35.225.138.208  n1-standard-1  1.8.7-gke.1   3          RUNNING

Осталось всего несколько шагов. Теперь мы развернем наше приложение с kubectl в нашем кластере из Google Cloud Shell:

 kubectl run mern-crud --image=gcr.io/${PROJECT_ID}/mern-crud:v1 --port 3000

Результат после завершения должен быть:

 jay_gordon@jaygordon-mongodb:~$ kubectl run mern-crud --image=gcr.io/${PROJECT_ID}/mern-crud:v1 --port 3000
deployment "mern-crud" created

Теперь просмотрите статус развертывания приложения:

 jay_gordon@jaygordon-mongodb:~$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
mern-crud-6b96b59dfd-4kqrr   1/1       Running   0          1m
jay_gordon@jaygordon-mongodb:~$

Мы создадим балансировщик нагрузки для трех узлов в кластере, чтобы они могли правильно обслуживаться в Интернете для нашего приложения:

 jay_gordon@jaygordon-mongodb:~$ kubectl expose deployment mern-crud --type=LoadBalancer --port 80 --target-port 3000 
service "mern-crud" exposed

Теперь получите IP-адрес loadbalancer, чтобы при необходимости его можно было привязать к DNS-имени, и вы можете начать работу!

 jay_gordon@jaygordon-mongodb:~$ kubectl get service
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
kubernetes   ClusterIP      10.27.240.1              443/TCP        11m
mern-crud    LoadBalancer   10.27.243.208   35.226.15.67   80:30684/TCP   2m

Быстрый тест локона показывает, что мое приложение онлайн!

 bash-3.2$ curl -v 35.226.15.67
* Rebuilt URL to: 35.226.15.67/
*   Trying 35.226.15.67...
* TCP_NODELAY set
* Connected to 35.226.15.67 (35.226.15.67) port 80 (#0)
> GET / HTTP/1.1
> Host: 35.226.15.67
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< X-Powered-By: Express

Я добавил некоторые тестовые данные, и, как мы видим, это часть моего развернутого приложения через Kubernetes для GCP и хранения моих постоянных данных в MongoDB Atlas.

Когда я закончу работать с кластером Kubernetes, я могу легко его уничтожить:

gcloud container clusters delete mern-crud

Что дальше?

Теперь у вас есть все инструменты для создания чего-то ОГРОМНОГО с MongoDB Atlas и Kubernetes.

Ознакомьтесь с остальными руководствами по движку Google Kubernetes для получения дополнительной информации о том, как создавать приложения с Kubernetes. Для получения дополнительной информации о MongoDB Atlas, нажмите здесь .

Есть еще вопросы? Присоединяйтесь к сообществу MongoDB Slack !

Продолжайте учиться с помощью высококачественных технических докладов, семинаров и практических занятий. Присоединяйтесь к нам в MongoDB World.