Как автоматизировать масштабирование вашего веб-приложения в DigitalOcean Ubuntu 16.04 Droplets

Вступление

В этом руководстве мы продемонстрируем, как использовать DigitalOcean API для горизонтального масштабирования настройки сервера с помощьюDOProxy, сценария Ruby, который после настройки предоставляет интерфейс командной строки для масштабирования уровня сервера приложений HTTP вверх или вниз.

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

DOProxy выполняет три основные функции:

  • Создает капли и добавляет их в балансировщик нагрузки

  • Удаляет капли и удаляет их из балансировщика нагрузки

  • Содержит инвентарь созданных капель, пока они не будут удалены

DOProxy create

[.note] #Note: Основная цель этого руководства - обучить минимально необходимым концепциям, необходимым для программного масштабирования архитектуры вашего сервера DigitalOcean с помощью API. Вы не должны запускать DOProxy в производственной среде, поскольку он не был разработан с учетом требований отказоустойчивости и выполняет только самую простую проверку ошибок. С учетом сказанного, знакомство с этим скриптом - отличный способ начать изучение горизонтального масштабирования через API DigitalOcean.
#

Предпосылки

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

Поскольку DOProxy написан на Ruby, знание Ruby может быть полезным. Чтобы лучше познакомиться с Ruby, вы можете прочитать нашу серию статей оHow To Code in Ruby. Если вы менее знакомы с Ruby, мы предоставляем псевдокод, чтобы объяснить суть кода DOProxy. Чтобы упростить наши вызовы API, мы используемDropletKit, который является официальной оболочкой DigitalOcean Ruby.

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

Давайте теперь установим DOProxy на Ubuntu 16.04 Droplet.

Установить DOProxy

Сначала создайте Ubuntu 16.04 Droplet в регионе NYC3, который по умолчанию использует регион DOProxy. Если вы хотите использовать другой регион, вам нужно будет настроить переменнуюregion в файлеdoproxy.yml после установки DOProxy. Эта капля будет запускать балансировщик нагрузки HAProxy и сценарий масштабирования DOProxy, поэтому выберите размер, который, по вашему мнению, будет соответствовать желаемому потенциалу масштабирования. Поскольку это руководство является базовой демонстрацией масштабирования без ожидаемого реального трафика, вероятно, достаточно 512 МБ.

В этом документе мы будем называть эту каплюDOProxy server.

Затем войдите на сервер и следуйте разделамInstallation иConfiguration (включаяdoproxy config иUserdata) вDOProxy GitHub repository README, чтобы установить DOProxy на этом сервере. Обязательно замените значенияYOUR_DO_API_TOKEN иYOUR_SSH_KEY_FINGERPRINT в файле конфигурации DOproxy, иначе сценарий не будет работать.

Теперь, когда на вашем сервере установлены DOProxy и HAProxy, давайте попробуем масштабировать среду.

Запустите DOProxy

Войдите на свой сервер DOProxy какroot и перейдите в каталог, в который вы клонировали DOProxy.

Запустите DOProxy без аргументов:

ruby doproxy.rb

Это должно распечатать доступные команды:

OutputCommands:
doproxy.rb print                   # Print backend Droplets in inventory file
doproxy.rb create                  # Create a new backend Droplet and reload
doproxy.rb delete     # Delete a Droplet and reload
doproxy.rb reload                  # Generate HAProxy config and reload HAProxy
doproxy.rb generate                # Generate HAProxy config based on inventory

На данный момент DOProxy еще не создал ни одной капли. Давайте создадим некоторые из них, чтобы подключить наш HTTP-сервис к сети, и расширять его.

Scale Up (Создать)

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

ruby doproxy.rb create

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

Как только скрипт будет выполнен, вы должны увидеть сообщение об успешном завершении, содержащее идентификатор капли:

OutputSuccess: 4202645 created and added to backend.

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

Когда вы будете готовы продолжить, посетите публичный IP-адрес вашего сервера DOProxy в веб-браузере. Вы должны увидеть страницу со спискомhostname,id иpublic IP address вашей новой капли.

Мы будем использовать DOProxy для создания еще двух капель, всего три. Не стесняйтесь создавать больше, если вы хотите:

ruby doproxy.rb create
ruby doproxy.rb create

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

Если вам случится заглянуть в панель управления DigitalOcean, вы заметите, что эти новые капли будут перечислены там (вместе с остальными каплями):

Droplets in Control Panel

Давайте внимательнее посмотрим на капли, которые были созданы, посмотрев на инвентарь DOProxy.

Инвентаризация печати

DOProxy предоставляет командуprint, которая распечатает все капли, входящие в его инвентарь:

ruby doproxy.rb print

Вы должны увидеть результат, который выглядит примерно так:

Output0) auto-nginx-0  (pvt ip: 192.0.2.175, status: active, id: 4202645)
1) auto-nginx-1  (pvt ip: 192.0.2.176, status: active, id: 4205587)
2) auto-nginx-2  (pvt ip: 192.0.2.172, status: active, id: 4205675)

В выходных данных примера мы видим информацию о трех созданных нами дроплетах, включая их имена хостов, статус и идентификаторы дроплетов. Имена и идентификаторы хостов должны совпадать с тем, что вы видели в веб-браузере при доступе к балансировщику нагрузки HAProxy (через публичный IP-адрес DOProxy).

Как вы могли заметить, DOProxy печатал только информацию о созданных каплях. Это потому, что он поддерживает инвентарь капель, которые он создает.

Теперь проверьте содержимое файлаinventory:

cat inventory

Вы должны увидеть идентификатор каждой капли, по одному на строку. Каждый раз, когда создается капля, ее идентификатор сохраняется в этом файле инвентаря.

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

Следует отметить, что хранение инвентаризации вашего сервера в одном файле - не лучшее решение, его легко можно повредить или удалить, но оно демонстрирует простую реализацию, которая работает. Распределенное хранилище значений ключей, такое какetcd, было бы лучшим решением. Вы также хотели бы сохранить в инвентаре не только идентификатор капли (поэтому вам не нужно совершать вызовы API каждый раз, когда вы хотите просмотреть определенную информацию капли).

Уменьшить (Удалить)

DOProxy также имеет командуdelete, которая позволяет вам удалять капли из вашего инвентаря. Командаdelete требует, чтобы вы указали номер строки удаляемой капли (как показано командойprint).

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

ruby doproxy.rb print

Так, например, если вы хотите удалить третью каплю, вы должны указать2 в качестве номера строки:

ruby doprorxy.rb delete 2

Через некоторое время вы увидите подтверждающее сообщение:

OutputSuccess: 4205675 deleted and removed from backend.

Командаdelete удаляет каплю через API, удаляет ее из конфигурации HAProxy и удаляет ее из инвентаря. Не стесняйтесь проверить, что капля была удалена с помощью команды печати DOProxy или проверки панели управления DigitalOcean. Вы также заметите, что он больше не является частью балансировщика нагрузки.

Конфигурация HAProxy

Последний фрагмент DOProxy, который мы еще не обсуждали, - это настройка HAProxy.

Когда вы запускаете командуcreate илиdelete DOProxy, информация для каждой капли в инвентаризации извлекается, и некоторая информация используется для изменения файла конфигурации HAProxy. В частности, идентификатор капли и частный IP-адрес используются для добавления каждой капли в качестве внутреннего сервера.

Посмотрите на последние несколько строк сгенерированного файлаhaproxy.cfg следующим образом:

tail haproxy.cfg

Вы должны увидеть что-то вроде этого:

хвост haproxy.cfg

    frontend www-http
       bind 203.0.113.43:80
       reqadd X-Forwarded-Proto:\ http
       default_backend www-backend

    backend www-backend

       server www-4202645 192.0.2.175:80 check # id:4202645, hostname:auto-nginx-0
       server www-4205587 192.0.2.176:80 check # id:4205587, hostname:auto-nginx-1

Разделfrontend должен содержать общедоступный IP-адрес вашего сервера DOProxy, а разделbackend должен содержать строки, которые относятся к каждой из созданных капель.

[.note] #Note: На этом этапе вы можете удалить оставшиеся капли, созданные с помощью DOProxy (ruby doproxy.rb delete 0, пока все серверы не исчезнут).
#

Теперь, когда вы увидели масштабирование DOProxy в действии, давайте подробнее рассмотрим код.

Код DOProxy

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

Поскольку вы клонировали репозиторий на свой сервер, вы можете просмотреть файлы там или файлы в репозитории DOProxy(https://github.com/scanevari/doproxy).

Важные файлы:

  • doproxy.rb: сценарий DOProxy Ruby. Предоставляет интерфейс командной строки и логику DOProxy

  • doproxy.yml: файл конфигурации DOProxy. Содержит токен API и определяет параметры создания Droplet

  • haproxy.cfg.erb: шаблон конфигурации HAProxy. Используется для генерации конфигурации балансировщика нагрузки с правильной информацией внутреннего сервера

  • inventory: файл инвентаризации капли. Хранит идентификаторы созданных капель

  • user-data.yml: файл пользовательских данных. Файл облачной конфигурации, который будет запускаться на новой капле при ее создании.

Давайте сначала погрузимся в файлы конфигурации.

doproxy.yml

Это важные строки вdoproxy.yml:

doproxy.yml

token: YOUR_DO_API_TOKEN
ssh_key_ids:
  - YOUR_SSH_KEY_FINGERPRINT
...
droplet_options:
  hostname_prefix: auto-nginx
  region: nyc3
  size: 1gb
  image: ubuntu-16-04-x64

Свойствоtoken должно содержать ваш токен APIread and write.

Другие строки определяют параметры, которые будут использоваться, когда DOProxy создаст новую каплю. Например, установка указанного ключа SSH (по идентификатору или отпечатку пальца) и префикс имени хоста с помощью «auto-nginx».

Более подробную информацию о допустимых параметрах дроплета можно найти вDigitalOcean API documentation.

user-data.yml

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

Пример файла пользовательских данных содержит простой сценарий bash, который устанавливает Nginx на сервер Ubuntu и заменяет его файл конфигурации по умолчанию именем хоста, идентификатором и общедоступным IP-адресом Droplet:

user-data.yml

#!/bin/bash

apt-get -y update
apt-get -y install nginx
export DROPLET_ID=$(curl http://169.254.169.254/metadata/v1/id)
export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
echo Droplet: $HOSTNAME, ID: $DROPLET_ID, IP Address: $PUBLIC_IPV4 > /var/www/html/index.html

Эти командыcurl получают информацию о капле (имя хоста, идентификатор и IP-адрес) с помощью службы метаданных DigitalOcean.

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

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

haproxy.cfg.erb

Шаблон конфигурации HAProxy содержит большую часть конфигурации балансировщика нагрузки, с некоторым кодом Ruby, который будет заменен информацией о бэкэнде Droplet.

Мы просто посмотрим на раздел Ruby, который генерирует конфигурацию сервера:

haproxy.cfg.erb

backend www-backend
   <% @Droplets.each_with_index do |droplet, index| %>
   server www-<%= droplet.id %> <%= droplet.private_ip %>:80 check # id:<%= droplet.id %>, hostname:<%= droplet.name -%>
   <% end %>

Этот код перебирает каждую каплю в инвентаре и добавляет новую запись бэкэнда HAProxy для каждой из них (на основе частного IP-адреса).

Например, такая строка будет создана для каждой капли:

haproxy.cfg

server www-4202645 192.0.2.175:80 check # id:4202645, hostname:auto-nginx-0

Каждый раз, когда капля создается или удаляется, DOProxy генерирует новый файл конфигурации HAProxy, содержащий изменения.

doproxy.rb

Этот сценарий Ruby состоит в основном из класса DOProxy, который содержит методы, которые выполняют создание и удаление капель, управление запасами и генерацию конфигурации HAProxy.

Если вы разбираетесь в Ruby, посмотрите файл на GitHub:https://github.com/scanevari/doproxy/blob/master/doproxy.rb.

Если вы не понимаете Ruby, вот несколько упрощенныхpseudocode, объясняющих каждый метод. Может быть полезно сравнить это с реальным кодом Ruby, чтобы помочь вам понять, что происходит.

def initialize

Выполняется каждый раз, когда DOProxy запускается с любыми допустимыми аргументами:

  • Прочтите файл конфигурацииdoproxy.yml и получите токен API и параметры Droplet.

def get\_inventory

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

  • Прочитать файл инвентаря (который содержит идентификаторы капель)

  • Для каждого идентификатора капли используйте API для получения информации о капле

def print\_inventory

Этот метод печатает информацию о капле для каждого из идентификаторов капли в файле инвентаря. Он вызывается командойdoproxy.rb print.

  • Для каждой капли в инвентаре выведите имя хоста, частный IP-адрес, статус и идентификатор

def create\_server

При вызове с помощью командыdoproxy.rb create этот метод создает новую каплю и добавляет ее в файл инвентаризации. Затем он вызываетreload_haproxy для повторного создания файла конфигурации HAProxy и перезагрузки балансировщика нагрузки.

  • Прочитайте файл userdata

  • Используйте API для создания капли на основе предоставленных пользовательских данных и параметров

  • Подождите, пока статус капли не станет «активным» - используйте API для получения информации капли каждые 15 секунд, пока статус не изменится

  • Когда статус «активен», добавьте идентификатор капли в файл инвентаря

  • Вызовreload_haproxy для повторного создания файла конфигурации HAProxy и перезагрузки балансировщика нагрузки.

def delete\_server(line\_number)

Когда используется командаdoproxy.rb delete, этот метод удаляет указанную каплю и удаляет ее идентификатор из файла инвентаризации. Затем он вызываетreload_haproxy для повторного создания файла конфигурации HAProxy и перезагрузки балансировщика нагрузки.

  • Удалить указанную строку из файла инвентаризации (удалить идентификатор капли)

  • Используйте API для удаления капли по ее идентификатору

  • Вызовreload_haproxy, чтобы повторно сгенерировать файл конфигурации HAProxy и перезагрузить балансировщик нагрузки.

def generate\_haproxy\_cfg

Это вспомогательный метод, который создает новые файлы конфигурации HAProxy на основе капель в инвентаре.

  • Откройте шаблон конфигурации HAProxy (haproxy.cfg.erb)

  • Для каждой капли в инвентаре добавьте соответствующую запись внутреннего сервера

  • Записать полученный файлhaproxy.cfg на диск

def reload\_haproxy

Это еще один метод поддержки, который копирует файл конфигурации HAProxy в нужное место и перезагружает HAProxy. Это зависит отgenerate_haproxy_cfg.

  • Скопируйте файл конфигурации HAProxyhaproxy.cfg в место, где HAProxy будет искать его при перезагрузке.

  • Перезагрузить HAProxy

Вот и весь важный код, который заставляет работать DOProxy. Последнее, что мы обсудим, - это DropletKit, оболочка API, которую мы использовали в DOProxy.

DropletKit Gem

DOProxy используетDropletKit gem, который является официальной оболочкой Ruby для DigitalOcean API v2, которая упрощает вызовы API DigitalOcean. DropletKit позволяет нам легко писать программы на Ruby, которые выполняют такие вещи, как:

  • Создать новые капли

  • Удалить существующие капли

  • Получите информацию о существующих каплях, таких как статус, IP-адрес, идентификатор капли, регион и т. Д.

Это руководство сфокусировано на этих конкретных конечных точках API, но имейте в виду, что есть много других конечных точек, которые могут помочь в программном управлении вашей серверной инфраструктурой DigitalOcean.

Заключение

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

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

Related