API7 Cloud интегрируется с Kubernetes Service Discovery
Yong Qian
February 24, 2023
Экономия затрат, адаптируемость, масштабируемость, надежность — взрыв облачных технологий и контейнеризации принес множество преимуществ по сравнению с традиционной монолитной архитектурой. Эти преимущества делают их предпочтительными для многих корпоративных пользователей.
Однако вместе с изменением архитектуры возникают и новые вызовы. Например, традиционно список IP-адресов для обратного проксирования часто остается неизменным и может быть напрямую записан в статический конфигурационный файл. В эпоху облачных технологий и контейнеризации список IP-адресов каждого вышестоящего сервиса постоянно меняется. Поддержка конфигурационных файлов становится кошмаром, если продолжать использовать статические конфигурации. Поскольку своевременность обновления конфигурационных файлов напрямую влияет на маршрутизацию трафика, пользователям приходится внедрять дополнительное программное обеспечение для автоматического обновления конфигурационных файлов, что значительно увеличивает сложность архитектуры.
Чтобы упростить этот процесс, API7 Cloud предлагает функцию обнаружения сервисов, которая напрямую подключается к Kubernetes API Server для получения данных о реальных Endpoints, помогая пользователям удобно проксировать приложения, развернутые в кластере Kubernetes.
Обнаружение сервисов в 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:

Развертывание сервисов в 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

Создание приложения и API в API7 Cloud
После развертывания тестового приложения перейдите на страницу API Management -> Applications в API7 Cloud и нажмите кнопку Create Application, чтобы создать новое приложение. Основная конфигурация выглядит следующим образом:
sd.httpbin.orgв качествеHost/в качествеPath prefix
Ключевая часть заключается в настройке вышестоящего сервиса для использования Kubernetes и реестра, который мы только что создали, для обнаружения сервисов вместо статического списка IP-адресов:

Затем мы создали 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