API7 Cloud integriert Kubernetes Service Discovery
Yong Qian
February 24, 2023
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
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
:
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
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
alsHost
/
alsPath 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:
Als nächstes haben wir eine /anything
-API in der Anwendung erstellt, um den Proxy zu testen:
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