Как Amazon EKS и APISIX Ingress Controller работают вместе для управления сложным трафиком

API7.ai

February 7, 2021

Ecosystem

Предыстория

Как менеджер по трафику, иногда даже когда вы готовы к неожиданностям, трудно остановить непредвиденное. Создание четырехстороннего API-шлюза крайне важно! Вот как Amazon EKS + Ingress APISIX! может помочь в этом сегодня.

Введение

Kubernetes — это открытая система для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями. Amazon Elastic Kubernetes Service (Amazon EKS) как управляемый сервис Kubernetes позволяет легко запускать нагрузки Kubernetes на облачных технологиях Amazon без необходимости установки и обслуживания плоскости управления или узлов.

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

Ingress APISIX может использоваться как контроллер входа для Kubernetes, внедряя лучшие функции Apache APISIX в Kubernetes. Это может быть реализовано с помощью хорошо спроектированных компонентов Controller, чтобы помочь вам удовлетворить сложные потребности в управлении трафиком.

Техническая архитектура apisix-ingress-controller

Как настроить и запустить Ingress APISIX на Amazon Elastic Kubernetes Service

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

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

У вас должен быть инструмент kubectl в вашей среде, установите контекст на ваш кластер Amazon EKS, выполнив следующую команду:

aws eks update-kubeconfig --name --region

После того как кластер Kubernetes будет готов, создайте пространство имен с именем ingress-apisix, где будут созданы все ресурсы, которые будут использоваться.

kubectl create namespace ingress-apisix

Мы будем использовать Helm для развертывания всех компонентов Ingress APISIX (Apache APISIX и apisix-ingress-controller), поэтому также следуйте руководству по установке, чтобы установить Helm. Helm-чарты для Apache APISIX и apisix-ingress-controller находятся в apache/apisix-helm-chart и apache/apisix-ingress-controller, пожалуйста, клонируйте эти пути, чтобы получить соответствующие чарты.

Установка Apache APISIX

Apache APISIX действует как прокси-плоскость для apisix-ingress-controller и должен быть развернут заранее.

cd /path/to/apisix-helm-chart helm repo add bitnami https://charts.bitnami.com/bitnami helm dependency update . /chart/apisix helm install apisix . /chart/apisix \ --set gateway.type=LoadBalancer \ --set allow.ipList="{0.0.0.0/0}" \ --namespace ingress-apisix kubectl get service --namespace ingress-apisix

Вышеуказанная команда создаст два ресурса Kubernetes Service: apisix-gateway, который обрабатывает реальный трафик, и apisix-admin, который действует как плоскость управления и обрабатывает все изменения конфигурации. Здесь мы создаем apisix-gateway как сервис типа LoadBalancer, который может быть открыт для Интернета с помощью Amazon Network Load Balancer. Мы можем найти имя хоста балансировщика нагрузки с помощью следующей команды:

kubectl get service apisix-gateway \ --namespace ingress-apisix \ -o jsonpath='{.status.loadBalancer.ingress[].hostname}'

Также обратите внимание: поле allow.ipList должно быть адаптировано к диапазонам CIDR EKS в вашем кластере Amazon EKS, чтобы apisix-ingress-controller мог быть авторизован Apache APISIX (для передачи ресурсов).

См. value.yaml для получения дополнительной информации обо всех элементах конфигурации, если есть другие требования.

Установка apisix-ingress-controller

После успешного развертывания Apache APISIX пришло время установить компонент Controller.

cd /path/to/apisix-ingress-controller # установка базовых ресурсов, например, ServiceAccount. helm install ingress-apisix-base -n ingress-apisix . /charts/base # установка apisix-ingress-controller helm install ingress-apisix . /charts/ingress-apisix \ --set ingressController.image.tag=dev \ --set ingressController.config.apisix.baseURL=http://apisix-admin:9180/apisix/admin \ --set ingressController.config.apisix.adminKey={YOUR ADMIN KEY} \ --namespace ingress-apisix

Чарт ingress-apisix-base установит некоторые базовые зависимости для apisix-ingress-controller, такие как ServiceAccount и его собственные CRD.

Чарт ingress-apisix проведет нас через установку самого Controller, мы можем изменить тег образа на желаемый релиз и можем изменить значение ingressController.config.apisix.adminKey в вышеуказанной команде, Эти конфигурации могут быть скорректированы в соответствии с фактическими сценариями (и убедитесь, что ключ Admin, используемый здесь, совпадает с ключом, используемым в развертывании Apache APISIX). Если у вас есть другие требования, вы можете обратиться к value.yaml, чтобы узнать больше обо всех элементах конфигурации.

Затем попробуйте открыть консоль Amazon EKS, выберите свой кластер и нажмите на вкладку Workloads, и вы увидите, что все Pods, etcd и apisix-ingress-controller для Apache APISIX готовы.

Начало тестирования

На этом этапе мы развернули все компоненты Ingress APISIX, поэтому убедитесь, что все работает правильно. Затем мы развернем сервис httpbin и попросим Apache APISIX маршрутизировать все запросы к хосту "local.httpbin.org" на этот сервис.

Для этого нам сначала нужно создать рабочую нагрузку httpbin и открыть ее.

kubectl run httpbin --image kennethreitz/httpbin --port 80 kubectl expose pod httpbin --port 80

Для того чтобы Apache APISIX правильно маршрутизировал запросы, нам нужно создать ресурс ApisixRoute для управления этим процессом.

# ar-httpbin.yaml apiVersion: apisix.apache.org/v1 kind: ApisixRoute metadata: name: httpserver-route spec: rules: - host: local.httpbin.org http: paths: - backend: serviceName: httpbin servicePort: 80 path: /*

Ресурс ApisixRoute выше позволит Apache APISIX маршрутизировать запросы с заголовком хоста "local.httpbin.org" на бэкенд httpbin (который мы только что создали).

Затем применяем эту настройку, но обратите внимание, что сервис и ресурс ApisixRoute должны находиться в одном и том же пространстве имен, и apisix-ingress-controller не может пересекать пространства имен.

kubectl apply -f ar-httpbin.yaml

Проверьте результаты с помощью простого вызова curl из любого места, которое может достичь сервиса Apache APISIX.

$ curl http://{apisix-gateway-ip}:{apisix-gateway-port}/headers -s -H 'Host: local.httpbin.org' { "headers": { "Accept": "*/*", "Host": "httpbin.org", "User-Agent": "curl/7.64.1", "X-Amzn-Trace-Id": "Root=1-5ffc3273-2928e0844e19c9810d1bbd8a" } }

Если тип сервиса — ClusterIP, вам нужно войти в Pod в кластере Amazon EKS и затем использовать ClusterIP или FQDN сервиса для доступа к Apache APISIX. Если сервис уже открыт (либо через NodePort, либо через LoadBalancer), то можно напрямую получить доступ к доступному внешнему конечному узлу.

Примечание: Эта статья перепечатана с публичного сайта WeChat aws.

Tags: