API7 Cloud integriert Kubernetes Service Discovery

Yong Qian

February 24, 2023

Products

Kosteneinsparungen, Anpassungsfähigkeit, Skalierbarkeit, Zuverlässigkeit – der Aufschwung der Cloud-Technologien und Containerisierung hat viele Vorteile gegenüber der traditionellen monolithischen Architektur gebracht. Diese Vorteile machen sie bei vielen Unternehmensnutzern beliebt.

Mit dieser Veränderung der Architektur kommen jedoch auch neue Herausforderungen. Traditionell war die Liste der Upstream-Forwarding-IPs für das Reverse-Proxy oft unverändert und konnte direkt in der statischen Konfigurationsdatei festgelegt werden. In der Ära der Cloud und Containerisierung ändert sich die IP-Liste jedes Upstream-Dienstes jedoch ständig. Die Pflege der Konfigurationsdateien wird zum Albtraum, wenn man weiterhin statische Konfigurationsdateien verwendet. Da die Aktualität der Konfigurationsdatei-Updates den Datenverkehr direkt beeinflusst, müssen Nutzer zusätzliche Software einführen, um die automatische Aktualisierung der Konfigurationsdateien zu handhaben, was die Komplexität der Architektur erheblich erhöht.

Um den Prozess zu vereinfachen, bietet API7 Cloud eine Service Discovery-Funktion, die direkt mit dem Kubernetes API Server verbunden ist, um Echtzeit-Endpoints-Daten zu erhalten. Dies hilft Nutzern, Anwendungen, die im Kubernetes-Cluster bereitgestellt sind, bequem zu proxyen.

Service Discovery in API7 Cloud

API7 Cloud’s Service Discovery

Vorbereitung

Zuerst müssen wir eine APISIX-Instanz über cloud-cli bereitstellen. Siehe die API7 Cloud-Dokumentation: Bereitstellen einer Gateway-Instanz.

In diesem Beispiel verwenden wir die Kubernetes-Bereitstellungsrichtlinien aus dem Dokument, um verschiedene Ressourcen im apisix-Namespace zu erstellen, den wir im Voraus anlegen müssen:

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

Service Account erstellen

Service Account ist die Kernressource für Kubernetes, um RBAC (Role-based access control) zu implementieren. API7 Cloud benötigt die list- und watch-Berechtigungen für die Endpoints-Ressource, um die Instanzliste des Upstream-Service zu erhalten.

Die entsprechende yaml-Konfiguration sieht wie folgt aus:

# 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 erstellen und ein Token erhalten:

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

Service Registry in API7 Cloud erstellen

Gehen Sie zu Control Plane -> Settings -> Service Registry und verwenden Sie das Token aus dem vorherigen Schritt, um eine Service Registry vom Typ Kubernetes in API7 Cloud zu erstellen (beachten Sie, dass die API Server-Adresse basierend auf Ihrem Anwendungsfall ausgefüllt werden muss). In diesem Beispiel ist APISIX ebenfalls im Ziel-Kubernetes-Cluster bereitgestellt, daher verwenden wir die API-Server-Adresse kubernetes.default.svc.cluster.local:

Service Registry in API7 Cloud erstellen

Dienste in Kubernetes bereitstellen

Um die Wirksamkeit der Kubernetes-Service-Discovery zu überprüfen, haben wir drei Replikate des HTTPBin-Dienstes bereitgestellt und einen entsprechenden Service erstellt.

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

Erstellter httpbin-Service

Anwendung und API in API7 Cloud erstellen

Nach der Bereitstellung der Testanwendung gehen Sie zur Seite API Management -> Applications von API7 Cloud und klicken Sie auf die Schaltfläche Create Application, um eine neue Anwendung zu erstellen. Die grundlegende Konfiguration ist wie folgt:

  • sd.httpbin.org als Host
  • / als Path prefix

Der kritische Teil besteht darin, den Upstream so zu konfigurieren, dass Kubernetes und die gerade erstellte Registry für die Service-Discovery verwendet werden, anstatt einer statischen Liste von IPs:

Service Discovery statt statischer IP-Liste

Als nächstes haben wir eine /anything-API in der Anwendung erstellt, um den Proxy zu testen:

/anything API

Proxy testen

Zuerst den HTTP-Port der Datenebene über port-forward auf den lokalen Rechner mappen:

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

Verwenden Sie curl, um den Zielservice anzufordern:

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: