Рубрики
Uncategorized

Создание мультитенантного GRPC Платформа разработки с послом и AWS EKS

В начале 2020 года команде PlaceExchange SRE было предложено получить поддержку первого GRPC компании … Tagged с SRE, Kubernetes, DevOps, Grpc.

В начале 2020 года команде PlaceExchange SRE было предложено получить поддержку первого приложения компании GRPC, которое будет работать на сервисе Amazon Elastic Kubernetes (EKS). Наше использование сторонних API геокодирования начало превышать стоимость реализации наших собственных услуг, и поэтому мы решили построить один с интерфейсом GRPC. Мы уже работали в течение нескольких месяцев с услугами Restful и чувствовали себя уверенно в нашей способности доставлять платформу, способную размещать несколько экземпляров API для наших разработчиков одновременно. Учитывая наше широкое использование среды для каждого разработчика (пространства имен) и приверженность инфраструктуре в качестве модели кода, казалось естественным расширить этот шаблон для поддержки услуг GRPC.

Когда мы начали оценивать варианты полностью программного преимущества, стек Ambassador Edge привлек наш взгляд по двум причинам; Он поддержал определения пользовательских ресурсов Kubernetes (CRDS) для определения сложных правил маршрутизации, и он был построен на прокси -последовательности Anvoy, проверенном в битве. Естественно, у нас было много вопросов, а именно, как поддержать прекращение TLS и HTTP/2 без обременения команды DEV с чрезмерной сложностью. К счастью, посол обладает поддержкой обоих, и вооружена теми знаниями, которые мы намеревались расширить наши EKS PAAS, чтобы поддержать День 1 GRPC.

Мы собрали руководство, чтобы продемонстрировать нашу топологию, отмечая наши знания на этом пути. Мы надеемся, что эта статья полезна всем командам, стремящимся принять GRPC, и что это займет некоторую загадку для работы с этими типами услуг.

Архитектура

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

Этот шаблон может быть использован, чтобы дать каждому разработчику свою «стадию» для работы. Чтобы ваша команда работала одновременно, вы можете назначить одно пространство имен и субдомен каждому разработчику, как описано в этом учебнике.

Картирование объектов — это просто возможность посла о функции «виртуально -хост», которая существует во всех инструментах обратного прокси. Ключевое отличие здесь заключается в том, что посол хранит эту взаимосвязь маршрутизации в качестве нативного CRD Kubernetes, который расширяет полезность инструментов развертывания, таких как Kubectl и Helm.

Цели

  • Развернуть свой собственный кластер посла
  • Обеспечить поддержку HTTP/2 и TLS на всех уровнях стека
  • Строите и развертывание приложения GRPC с помощью завершения TLS и поддержки HTTP/2
  • Развернуть второй экземпляр одного и того же приложения GRPC в другом домене

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

Перво -наперво, клонировать пример репозитория из GitHub , вам понадобится прилагаемые манифесты Docker и K8s завершить шаги ниже.

PlaceExchange/GRPC-пример

Файлы семинара для развертывания услуг с несколькими аттенантами GRPC с Ambassador

Если вы только начинаете с посла и GRPC, проверьте их Документация Для базового учебника о том, как проводить один сервис GRPC по небезопасным или безопасным каналам.

Требования

  • Кластер Kubernetes в AWS (рекомендуется EKS)
  • Кластерные привилегии для применения CRD, пространств имен и развертываний
  • Внешний DNS Или возможность создавать хостированные записи DNS
  • Три субдомена, один для посла и по одному для каждого разработчика
    • т.е. Edge.example.com, grpc.subdomain.example.com, grpc.subdomain2.example.com
  • Необязательно: реестр Docker Если вы не хотите использовать встроенное изображение

ПРИМЕЧАНИЕ. Хотя этот урок использует субдомены, он должен работать с любым типом доменного имени. Также не требуется, чтобы все записи использовали один и тот же корневой домен.

1. Установка посла

Если вы не установили Ambassador, вам нужно будет развернуть его в кластере перед началом работы. Если у вас уже есть существующее развертывание посла, «метод быстрого начала» описывает, как редактировать существующее развертывание.

Хотя документация по умолчанию не включена по умолчанию, посол рекомендует использовать NLBS при прекращении TLS в Ambassador. Из Документы :

При завершении TLS в Ambassador вам следует развернуть балансировщик сетевой нагрузки L4 (NLB) с протоколом прокси, который позволил получить наилучшую производительность из вашего балансировщика нагрузки, при этом сохраняя IP -адрес клиента.

Любой метод установки описывает, как развернуть посла с помощью NLB.

1A Метод быстрых начала

Чтобы установить посла, следуйте Быстрый старт инструкции. Для целей этого урока мы настоятельно рекомендуем использовать метод YAML, чтобы вы могли увидеть модификации, необходимые для обеспечения автоматической поддержки DNS и HTTP/2.

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

$ kubectl edit service -n ambassador ambassador

Здесь вы можете использовать редактор для добавления следующей аннотации, заменив «Edge.Example.com» на ваш предпочтительный домен:

metadata:
  annotations:
    external-dns.alpha.kubernetes.io/hostname: edge.example.com
    service.beta.kubernetes.io/aws-load-balancer-type: nlb

Это будет обучать ваш Внешний DNS развертывание для создания записи, указывающей на NLB. Это также создаст новый балансировщик сетевой нагрузки для этой службы.

1B Manifest Метод

В качестве альтернативы, вы можете использовать упакованные манифесты, расположенные в Kube/Ambassador каталог. Этот каталог содержит оригинал aes-crds.yaml От посла с модифицированным aes.yaml (Источник версии 1.4.3). Этот модифицированный манифест включает аннотацию в службе для создания записи для балансировщика нагрузки (NLB).

aes.yaml

...
---
apiVersion: v1
kind: Service
metadata:
  name: ambassador
  namespace: ambassador
  labels:
    product: aes
    app.kubernetes.io/component: ambassador-service
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
    external-dns.alpha.kubernetes.io/hostname: edge.example.com
...

Используйте поиск/заменить в своем редакторе, чтобы заменить Edge.Example.com с вашим предпочтительным названием DNS для API Gateway. Это будет использоваться любыми услугами, которая не предоставляет Хост: или : Authority: Ключ в своем картировании. Как только это будет завершено, вы можете развернуть aes-crds.yaml и aes.yaml манифесты

$ kubectl apply -f kube/ambassador/aes-crds.yaml
$ kubectl apply -f kube/ambassador/aes.yaml

2. Настройка хоста по умолчанию

Редактировать aes-host.yaml проявить и использовать поиск/заменить, чтобы заменить Edge.Example.com с вашим предпочтительным названием DNS для API Gateway. Это должно быть то же имя хоста, которое вы только что предоставили в aes.yaml Сервисная аннотация. Это имя хоста будет использоваться для доступа к любой услуге, которая не предоставляет Хост: или : Authority: Ключ в своем картировании, который не Используется в этом уроке, но полезен для устранения неполадок.

Вы также должны потратить минутку, чтобы найти/заменить registration@example.com с действительным электронным письмом для вашей организации.

Для Splup NLB может потребоваться несколько минут, чтобы внешние DNS создали новую запись, указывающую на нее. Как только ваш домен решается, вы можете развернуть aes-host.yaml Чтобы создать новый хост и TLSContext для посла. Это запрашивает сертификат от LetsEncrypt и обеспечит прекращение TLS для этого домена для любой службы без A Хост: или : Authority: Ключ в своем картировании.

Примечание. Если у вас нет внешних DNS, развернутых в вашем кластере, вы можете создать запись, указывающую на вашу NLB вручную, она все равно будет работать. Просто помните, что вам нужно будет обновить запись, если вы удалите или воссоздаете Service/NLB по любой причине.

$ kubectl apply -f kube/ambassador/aes-host.yaml

Вы можете проверить статус запроса ACME в любое время:

$ kubectl get host -n ambassador

Вы должны увидеть, что сертификат выдается, и хост CRD готов.

NAME   HOSTNAME                    STATE   PHASE COMPLETED   PHASE PENDING   AGE
edge   edge.example.com            Ready                                     11d

Если состояние не готово, вы можете использовать Kubectl опишите хост -n Ambassador Чтобы увидеть недавние события и устранение неполадок. Общие проблемы включают задержки для распространения DNS и ограничение скорости LETSERRYPT.

Необязательно: построить изображение

Если вы не хотите использовать предварительно построенное изображение, размещенное на Dockerhub, вы можете построить и подтолкнуть свой собственный реестр.

$ docker build ./docker -t /grpc-demo
$ docker push /grpc-demo

Обязательно обновите Изображение: значение в grpc-demo.yaml и grpc2-demo.yaml Подготовиться к развертыванию.

3. Создайте CNAME для поддоменов обслуживания

Чтобы направить внешний трафик для каждой службы в NLB посол, вам необходимо будет создать CNAME для каждого поддомена, которые решают рекорд Ambassador. После создания записей ваша среда должна выглядеть примерно так.

CNAME grpc.subdomain.example.com -> A edge.example.com
CNAME grpc.subdomain2.example.com -> A edge.example.com

Как только это будет сделано, найдите все/замените Все grpc.subdomain.example.com с вашим первым поддоменом обслуживания и grpc.subdomain2.example.com со своим вторым поддоменом.

Внешний DNS в этом сценарии не полезен, поскольку единственная служба типа LoadBalancer управляется послом. Ты мог Добавить несколько доменов в службу Внешние dns.alpha.kubernetes.io/hostname Аннотация, но это становится громоздким в фактическом поступлении в то время, когда ваш инструмент для развертывания должен поддерживать анализ/приложение.

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

4. Проверьте прекращение TLS

На этом этапе посол настроен, и вы готовы развернуть сервис Restful, чтобы дважды проверить все, что работает с TLS. Отладка TLS с помощью сервиса GRPC является сложной, поэтому эта услуга поможет сдать любые проблемы с запросами на сертификаты и DNS.

Развернуть демо и Demo2 Пространства имен

$ kubectl apply -f kube/grpc-example/namespace.yaml

В настоящее время развернуть приложение «Цитата»

$ kubectl apply -f kube/grpc-example/quote.yaml

QUOTE.YAML Manifest развернет спокойный сервис, доступный из https://grpc.subdomain.example.com/backend/ . Возможно, вам придется подождать несколько мгновений, когда посол запрашивает и получит сертификат от LetsEncrypt.

Этот манифест содержит объекты услуги, развертывание, хост, картирование и объекты TLSContext. Хост и TLSContext позволит посолу прекратить TLS для grpc.subdomain.example.com Анкет

Включенное отображение будет направлять запросы на /Backend/ к Цитата Сервис, размещенная на порту POD 8080 Анкет

QUOTE.YAML

...
---
apiVersion: getambassador.io/v2
kind: Mapping
metadata:
  name: quote-backend
  namespace: demo
spec:
  host: grpc.subdomain.example.com
  prefix: /quote/
  service: personal:8080
...

Если вы перейдете к этой конечной точке в браузере, вы увидите некоторые цитаты из команды DataWire. Если у вас есть тайм -аут или предупреждение SSL, проверьте запись хоста в демо Пространство имен и убедитесь, что ваши стручки здоровы.

5. Развернуть первую услугу GRPC

После подтверждения завершения TLS вы можете развернуть первую службу GRPC:

$ kubectl apply -f kube/grpc-example/grpc-demo.yaml

Этот манифест содержит услуги, развертывание, картирование объектов. Поскольку вы уже развернули хост и TLSContext для службы, которую вы хотите проводить на хосте grpc.subdomain.example.com как часть QUOTE.YAML Нет необходимости развернуть их как часть этого манифеста.

Вы можете увидеть, что grpc Маркировки используют немного другой синтаксис

grpc-demo.yaml

...
---
apiVersion: getambassador.io/v2
kind: Mapping
metadata:
  name: grpc-mapping
  namespace: demo
spec:
  headers:
    :authority: grpc.subdomain.example.com
  grpc: True
  prefix: /helloworld.Greeter/
  rewrite: /helloworld.Greeter/
  service: grpc-example:50051

Теперь пришло время проверить ваш сервис. Изображение Docker включает клиента, который общается через TLS только :

$ docker run --rm -it -e BACKEND=grpc.subdomain.example.com placeexchange/grpc-demo python greeter_client.py
Greeter client received: Hello, you!

6. Развернуть вторую услугу GRPC

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

grpc2-demo.yaml

...
---
apiVersion: getambassador.io/v2
kind: Mapping
metadata:
  name: grpc-mapping
  namespace: demo2
spec:
  headers:
    :authority: grpc.subdomain2.example.com
  grpc: True
  prefix: /helloworld.Greeter/
  rewrite: /helloworld.Greeter/
  service: grpc-example:50051

Это должно продемонстрировать, что вы могли бы иметь n Количество субдоменов/пространств имен, по одному для каждого разработчика в вашей команде.

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

$ docker run --rm -it -e BACKEND=grpc.subdomain2.example.com placeexchange/grpc-demo python greeter_client.py
Greeter client received: Hello, you!

Теперь у вас есть два пространства имен разработчиков, которые позволяют индивидуально экспериментации и развертывание с полным прекращением TLS.

Прощальные слова

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

До скорого!

Оригинал: «https://dev.to/place-exchange/building-a-multi-tenant-grpc-development-platform-with-ambassador-and-aws-eks-58hk»