Рубрики
Uncategorized

Создание глобального сервиса Anycast в течение минуты

Эта статья была первоначально опубликована в моем личном блоге Toonk.io в эти выходные, я решил взять … Tagged с учебником, Linux, Docker, Devops.

Эта статья была первоначально опубликована в моем личном блоге 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»