Wie man externe Dienste im Apache APISIX Ingress Controller proxied
Yeqi Peng
January 13, 2023
In diesem Tutorial werden wir vorstellen, wie man externe Dienste in ApisixUpstream-Ressourcen konfiguriert.
Dies ist nützlich, wenn Ihr Dienst von einem Drittanbieterdienst oder einem Dienst aus einem anderen K8s-Cluster abhängt. Es bietet auch eine Möglichkeit, Ihre ApisixRoute mit gemeinsam genutzten ExternalName-Diensten zu verwalten, ohne eine große Anzahl von ApisixRoutes zu ändern, wenn der referenzierte Dienstname aktualisiert wird.
Voraussetzungen
- Ein verfügbarer Kubernetes-Cluster
- Eine verfügbare APISIX- und APISIX Ingress Controller-Installation
Wir gehen davon aus, dass Ihr APISIX im Namespace apisix
installiert ist.
Einführung
APISIX Ingress unterstützt die Konfiguration von externen Diensten als Backends, sowohl für K8s ExternalName-Dienste als auch für direkte Domains.
In diesem Fall konfigurieren wir das Feld backends
nicht in der ApisixRoute-Ressource. Stattdessen verwenden wir das Feld upstreams
, um auf eine ApisixUpstream-Ressource zu verweisen, in der das Feld externalNodes
konfiguriert ist.
Zum Beispiel:
# httpbin-route.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: httpbin-route
spec:
http:
- name: rule1
match:
hosts:
- local.httpbin.org
paths:
- /*
# backends: # Wir werden das Feld `backends` nicht verwenden
# - serviceName: httpbin
# servicePort: 80
upstreams:
- name: httpbin-upstream
Diese Konfiguration teilt dem Ingress-Controller mit, dass er die Upstream-Hosts nicht über die K8s-Dienste auflösen soll, sondern die Konfiguration verwendet, die in der referenzierten ApisixUpstream definiert ist.
Die referenzierte ApisixUpstream MUSS das Feld externalNodes
konfiguriert haben. Zum Beispiel:
# httpbin-upstream.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
name: httpbin-upstream
spec:
externalNodes:
- type: Domain
name: httpbin.org
In diesem YAML-Beispiel haben wir httpbin.org
als Backend konfiguriert. Der Typ Domain
gibt an, dass es sich um einen Drittanbieterdienst handelt, und hier wird jeder Domainname unterstützt.
Wenn Sie einen ExternalName-Dienst im K8s-Cluster verwenden möchten, sollte der Typ Service
sein und der Name sollte der Dienstname sein. Durch die Konfiguration von ApisixUpstream mit dem Typ Service
verfolgt der Ingress-Controller automatisch den Inhalt des ExternalName-Dienstes und dessen Änderungen.
Externe Domain-Upstream
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: httpbin-route
spec:
http:
- name: rule1
match:
hosts:
- local.httpbin.org
paths:
- /*
upstreams:
- name: httpbin-upstream
---
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
name: httpbin-upstream
spec:
externalNodes:
- type: Domain
name: httpbin.org
Nachdem Sie die obige Konfiguration angewendet haben, können wir versuchen, direkt über APISIX auf httpbin.org
zuzugreifen.
kubectl exec -it -n apisix APISIX_POD_NAME -- curl -i -H "Host: local.httpbin.org" http://127.0.0.1:9080/get
Wenn alles funktioniert, werden Sie ein Ergebnis wie dieses sehen:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 321
Connection: keep-alive
Date: Thu, 15 Dec 2022 10:47:30 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX/3.0.0
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "local.httpbin.org",
"User-Agent": "curl/7.29.0",
"X-Amzn-Trace-Id": "Root=xxxxx",
"X-Forwarded-Host": "local.httpbin.org"
},
"origin": "127.0.0.1, xxxxxxxxx",
"url": "http://local.httpbin.org/get"
}
Der Header Server: APISIX/3.0.0
zeigt an, dass die Anfrage von APISIX gesendet wurde. Und die Antwort enthält X-Amzn-Trace-Id
, was darauf hinweist, dass die Anfrage vom Online-httpbin-Dienst verarbeitet wurde.
External Name Service Upstream
Lassen Sie uns eine einfache httpbin-App im Namespace test
als Backend für den ExternalName-Dienst bereitstellen, den wir später erstellen werden.
kubectl create ns test
kubectl -n test run httpbin --image-pull-policy IfNotPresent --image=kennethreitz/httpbin --port 80
kubectl -n test expose pod/httpbin --port 80
Verwenden Sie dann die folgende Konfiguration, um einen ExternalName-Dienst im Namespace apisix
zu erstellen.
apiVersion: v1
kind: Service
metadata:
name: ext-httpbin
spec:
type: ExternalName
externalName: httpbin.test.svc
Jetzt können wir eine ExternalName-Dienst-ApisixRoute und ApisixUpstream erstellen.
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: ext-route
spec:
http:
- name: rule1
match:
hosts:
- ext.httpbin.org
paths:
- /*
upstreams:
- name: ext-upstream
---
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
name: ext-upstream
spec:
externalNodes:
- type: Service
name: ext-httpbin
Sobald die Konfigurationen synchronisiert sind, versuchen Sie, mit dem folgenden Befehl darauf zuzugreifen.
Das einzige Argument, das sich ändert, ist der Header, den wir übergeben.
kubectl exec -it -n apisix APISIX_POD_NAME -- curl -i -H "Host: ext.httpbin.org" http://127.0.0.1:9080/get
Die Ausgabe sollte wie folgt aussehen:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 234
Connection: keep-alive
Date: Thu, 15 Dec 2022 10:54:21 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX/3.0.0
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "ext.httpbin.org",
"User-Agent": "curl/7.29.0",
"X-Forwarded-Host": "ext.httpbin.org"
},
"origin": "127.0.0.1",
"url": "http://ext.httpbin.org/get"
}
Wir können sehen, dass die Antwort der vorherigen ähnlich ist, aber einige Felder fehlen. Das liegt daran, dass die Anfrage an unseren lokalen httpbin-Dienst gesendet wurde und nicht an den Online-Dienst.
Domain in External Name Service
Der ExternalName-Dienst kann auch jede Domain außerhalb des K8s-Clusters enthalten.
Lassen Sie uns die Konfiguration des externen Dienstes, die wir im vorherigen Abschnitt angewendet haben, aktualisieren.
apiVersion: v1
kind: Service
metadata:
name: ext-httpbin
spec:
type: ExternalName
externalName: httpbin.org
Versuchen Sie, erneut darauf zuzugreifen, und die Ausgabe sollte mehrere origin
und einen X-Amzn-Trace-Id
-Header enthalten, was bedeutet, dass wir auf den Online-httpbin.org
-Dienst zugreifen.
Fazit
In diesem Tutorial erweitern wir die funktionalen Grenzen des APISIX Ingress Controllers, indem wir Anfragen an externe Dienste weiterleiten. Es ermöglicht Benutzern, einfach Drittanbieterdienste wie Authentifizierungsdienste oder clusterübergreifende Dienste zu integrieren.
Weitere Informationen über API-Gateways finden Sie in unseren Blogs oder kontaktieren Sie uns.