API7 Cloud интегрируется с Kubernetes Service Discovery

Yong Qian

February 24, 2023

Products

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

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

Чтобы упростить этот процесс, API7 Cloud предлагает функцию обнаружения сервисов, которая напрямую подключается к Kubernetes API Server для получения данных о реальных Endpoints, помогая пользователям удобно проксировать приложения, развернутые в кластере Kubernetes.

Обнаружение сервисов в API7 Cloud

Обнаружение сервисов в API7 Cloud

Подготовка

Сначала нам нужно развернуть экземпляр APISIX через cloud-cli. Обратитесь к документации API7 Cloud: Развертывание экземпляра шлюза.

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

kubectl create namespace apisix cloud-cli deploy kubernetes \ --name my-apisix \ --namespace apisix \ --apisix-image apache/apisix:2.15.0-centos

Создание Service Account

Service Account — это ключевой ресурс для реализации RBAC (управление доступом на основе ролей) в Kubernetes. API7 Cloud должен иметь разрешения list и watch для ресурса Endpoints, чтобы получить список экземпляров вышестоящего сервиса.

Соответствующая конфигурация yaml выглядит следующим образом:

# rbac.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: apisix-k8s-sd-watcher rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: apisix-k8s-sd-watcher-binding subjects: - kind: ServiceAccount name: apisix-k8s-sd-sa namespace: apisix roleRef: kind: ClusterRole name: apisix-k8s-sd-watcher apiGroup: rbac.authorization.k8s.io --- apiVersion: v1 kind: ServiceAccount metadata: name: apisix-k8s-sd-sa namespace: apisix

Создайте Service Account и получите токен:

kubectl apply -f rbac.yaml SECRET_NAME=`kubectl get sa -n apisix apisix-k8s-sd-sa -ojsonpath='{.secrets[0].name}'` kubectl get secrets $SECRET_NAME -n apisix -ojsonpath='{.data.token}' | base64 -d

Создание реестра сервисов в API7 Cloud

Перейдите в Control Plane -> Settings -> Service Registry, используйте токен, полученный на предыдущем шаге, чтобы создать реестр сервисов типа Kubernetes в API7 Cloud (обратите внимание, что адрес API Server нужно заполнить в зависимости от вашего случая использования). В этом примере APISIX также развернут в целевом кластере Kubernetes, поэтому мы используем адрес API сервера kubernetes.default.svc.cluster.local:

Создание реестра сервисов в API7 Cloud

Развертывание сервисов в Kubernetes

Чтобы проверить эффективность обнаружения сервисов Kubernetes, мы развернули три реплики сервиса HTTPBin и создали соответствующий сервис.

kubectl create deployment httpbin --image=kennethreitz/httpbin:latest --replicas=3 -n apisix kubectl create service clusterip httpbin --tcp=80:80 -n apisix

Созданный сервис httpbin

Создание приложения и API в API7 Cloud

После развертывания тестового приложения перейдите на страницу API Management -> Applications в API7 Cloud и нажмите кнопку Create Application, чтобы создать новое приложение. Основная конфигурация выглядит следующим образом:

  • sd.httpbin.org в качестве Host
  • / в качестве Path prefix

Ключевая часть заключается в настройке вышестоящего сервиса для использования Kubernetes и реестра, который мы только что создали, для обнаружения сервисов вместо статического списка IP-адресов:

Обнаружение сервисов вместо статического списка IP-адресов

Затем мы создали API /anything в приложении для тестирования прокси:

API /anything

Тестирование прокси

Сначала сопоставьте HTTP-порт плоскости данных с локальной машиной через port-forward:

kubectl port-forward -n apisix svc/apisix-gateway 9080:80

Используйте curl для запроса целевого сервиса:

curl http://127.0.0.1:9080/anything -H 'Host: sd.httpbin.org' -i HTTP/1.1 200 OK Content-Type: application/json Content-Length: 373 Connection: keep-alive Date: Mon, 09 Jan 2023 08:33:44 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Server: APISIX
Tags: