Wie man externe Dienste im Apache APISIX Ingress Controller proxied

Yeqi Peng

January 13, 2023

Products

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.

Tags: