Эта статья была первоначально опубликована в моем личном блоге toonk.io
В эти выходные я решил сделать другой взгляд на StackPath, а также свои рабочие нагрузки вычислить функции. Это относительно новая особенность, на самом деле, я писал об этом в феврале 2109 Когда это было просто выпущено. Я помню, как быть совершенно энтузиазмом по поводу потенциала, но также наблюдал некоторые вещи, которые не хватало тогда. Сейчас полтора года спустя, кажется, большинство из них были решены, так что давайте посмотрим! Я решил поэкспериментировать с добавлением небольшого демонстрационного видео в эти блоги. Ниже вы найдете краткую демонстрацию всего 5 минут всей настройки. Поскольку эти видео являются новыми и немного экспериментом, дайте мне знать, если вам это нравится.
Демо: построение глобального сервиса Anycast в течение минуты
StackPath поддерживает два типа рабочих нагрузок (в дополнение к серверу), VM и развертыванию на основе контейнера. Оба могут быть организованы с использованием API и террафора. Terraform — это «инфраструктура в качестве кода». Вы просто указываете свое намерение с террафом, примените его, и вы хотите пойти. Я большой поклонник террафора, поэтому мы будем использовать это для нашего теста. Одна из прохладных вещей о StackPath заключается в том, что они имеют встроенную поддержку для Anlycast, как для их VM, так и для сервисов контейнера. Я собираюсь использовать эту функцию и сервис контейнера для создания этой высокотеченной, нижней латентной службы. Это супер легко, посмотрите на себя на мой Github здесь Отказ
Поскольку я собираюсь использовать контейнерную службу, нам нужно создать контейнер докеров для работы с. Это мой Dockerfile
FROM python:3 WORKDIR /usr/src/app COPY ./mywebserver.py . EXPOSE 8000 ENV PYTHONUNBUFFERED 1 CMD [ "python", "./mywebserver.py" ]
Программа MyWebserver.py — это простая веб-служба, которая печатает переменную среды хоста. Это поможет нам определить, какой узел обслуживает наш запрос, когда мы начнем наше тестирование. После того, как я построил контейнер, я загрузил его на мой Dockerhub repo Таким образом, эта упаковка может вытащить его оттуда.
Теперь пришло время определить нашу инфраструктуру с использованием террафора. Соответствующий код можно найти на Мой Github здесь . Я выделим несколько частей: На линии 17 мы начинаем с определения новой рабочей нагрузки, и я запрашиваю Anycast IP для этой рабочей нагрузки. Это означает, что StackPath будет загружать баланс (ECMP) между всеми узлами в моей рабочей нагрузке (который я определяю позже).
resource "stackpath_compute_workload" "my-anycast-workload" { name = "my-anycast-workload" slug = "my-anycast-workload" annotations = { # request an anycast IP "anycast.platform.stackpath.net" = "true" }
В строке 31 мы определяем тип рабочей нагрузки в этом случае контейнер. Как часть того, что мы открываем правильные порты, в моем корпусе 8000 для службы Python.
container { # Name that should be given to the container name = "app" port { name = "web" port = 8000 protocol = "TCP" enable_implicit_network_policy = true }
Далее мы определяем контейнер, который мы хотели бы развернуть (из Dockerhub)
# image to use for the container image = "atoonk/pythonweb:latest"
В разделе ресурсов мы определяем спецификации контейнера. В моем случае я собираюсь с небольшой спецификацией, одного CPU Core и 2G оперативной памяти.
resources { requests = { "cpu" = "1" "memory" = "2Gi" } }
Теперь мы добираемся до раздела, в котором мы определяем, сколько контейнеров мы хотели бы за токовым центром данных, и в каких ценнослужителях мы хотели бы, чтобы эта услуга была запущена. В приведенном ниже примере мы развертываем три контейнера в каждом центре обработки данных, с возможностью выращиваться до четырех как часть автоматического масштабирования. Мы развертываем это как в Сиэтле, так и в Далласе.
target { name = "global" min_replicas = 3 max_replicas = 4 scale_settings { metrics { metric = "cpu" # Scale up when CPU averages 50%. average_utilization = 50 } } # Deploy these instances to Dallas and Seattle deployment_scope = "cityCode" selector { key = "cityCode" operator = "in" values = [ "DFW", "SEA" ] } }
Теперь, когда мы определили наше намерение с Террафом, пришло время привести это. Правильный способ сделать это:
terraform init terraform plan terraform apply
После этого вы увидите, что контейнеры придумывают, и наш сервис Anycast Python станет доступен. Поскольку контейнеры поднимаются довольно быстро, у вас должны быть все шесть контейнеров в двух ценных столах вверх и запускаются в течение минуты.
Я развернул услугу как в Сиэтл, так и в Далласе, и, поскольку я базируюсь в Ванкувере Канада, я ожидаю ударить DataCenter Seattle, так как это самый близкий вагончик для меня.
$ for i in `seq 1 10`; do curl 185.85.196.41:8000 ; done my-anycast-workload-global-sea-2 my-anycast-workload-global-sea-0 my-anycast-workload-global-sea-2 my-anycast-workload-global-sea-0 my-anycast-workload-global-sea-1 my-anycast-workload-global-sea-1 my-anycast-workload-global-sea-2 my-anycast-workload-global-sea-1 my-anycast-workload-global-sea-2 my-anycast-workload-global-sea-0
Приведенные выше результаты показывают, что я действительно ударяю Cattle Catacenter, и что мои запросы нагрузки сбалансированы в течение трех экземпляров в Сиэтле, все как ожидалось.
В портале я могу видеть в журналах контейнера
По сравнению с Мой тест в прошлом году с StackPath , было хорошее количество прогресса. Здорово теперь иметь возможность делать все это только с файлом Terraform. Это своего рода захватывающее, что вы можете поднять полностью Anycast Service в течение минуты только с одной командой! Изменяя номер репликата в файле Terraform, мы также можем легко расти и сокращать наше развертывание, если это необходимо.
В этой статье мы смотрели только на контейнерную услугу, но то же самое возможно с виртуальными машинами, мой Github Reppo также имеет пример для этого. Наконец, не забудьте проверить демонстрацию демонстрации и дайте мне знать, если вы хотите увидеть больше видеоконтента.
Оригинал: «https://dev.to/atoonk/building-a-global-anycast-service-in-under-a-minute-2d9b»