Freigeben über


Standortübergreifendes Hosting mit Application Gateway für Container: Eingangs-API

Dieses Dokument hilft Ihnen beim Einrichten einer Beispielanwendung, welche die Eingangs-API verwendet, um das Hosten mehrerer Websites auf demselben Kubernetes Eingangsressourcen/Anwendungsgateway für Container-Frontend zu veranschaulichen. Es sind Schritte vorgesehen:

  • Erstellen Sie eine Eingangs-Ressource mit zwei Hosts.

Hintergrund

Application Gateway für Container ermöglicht das Hosting mehrerer Websites, indem Sie mehrere Webanwendungen für denselben Port konfigurieren können. Zwei oder mehr eindeutige Websites können mit eindeutigen Back-End-Diensten gehostet werden. Sehen Sie sich folgendes Beispielszenarien an:

A diagram showing multisite hosting with Application Gateway for Containers.

Voraussetzungen

  1. Wenn Sie die BYO-Bereitstellungsstrategie verwendet haben, müssen Sie Ihre Application Gateway für Container-Ressourcen und den ALB-Controller einrichten.

  2. Wenn Sie die Strategie der durch ALB verwalteten Bereitstellung verwendet haben, stellen Sie sicher, dass Ihr ALB-Controller und die Application Gateway für Container-Ressourcen über die benutzerdefinierte ApplicationLoadBalancer-Ressource bereitgestellt werden.

  3. Bereitstellen einer HTTP-Beispielanwendung:
    Wenden Sie die folgende Datei „deployment.yaml“ auf Ihrem Cluster an, um eine Beispielwebanwendung zur Veranschaulichung des pfad-, abfrage- und headerbasierten Routings zu erstellen.

    kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/examples/traffic-split-scenario/deployment.yaml
    

    Mit diesem Befehl wird Folgendes in Ihrem Cluster erstellt:

    • Ein Namespace namens test-infra
    • Zwei Dienste namens backend-v1 und backend-v2 im test-infra-Namespace
    • Zwei Bereitstellungen namens backend-v1 und backend-v2 im test-infra-Namespace

Bereitstellen der erforderlichen Eingangsressource

  1. Erstellen eines Eingangsmanifests
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-name: alb-test
    alb.networking.azure.io/alb-namespace: alb-test-infra
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v1
                port:
                  number: 8080
    - host: fabrikam.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v2
                port:
                  number: 8080
EOF

Nachdem die Eingangsressource erstellt wurde, stellen Sie sicher, dass der Status den Hostnamen Ihres Lastenausgleichs anzeigt und dass beide Ports auf Anforderungen lauschen.

kubectl get ingress ingress-01 -n test-infra -o yaml

Beispielausgabe einer erfolgreichen Eingangserstellung.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.networking.azure.io/alb-frontend: FRONTEND_NAME
    alb.networking.azure.io/alb-id: /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"alb.networking.azure.io/alb-frontend":"FRONTEND_NAME","alb.networking.azure.io/alb-id":"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz"},"name"
:"ingress-01","namespace":"test-infra"},"spec":{"ingressClassName":"azure-alb-external","rules":[{"host":"example.com","http":{"paths":[{"backend":{"service":{"name":"echo","port":{"number":80}}},"path":"/","pathType":"Prefix"}]}}],"tls":[{"hosts":["example.com"],"secretName":"listener-tls-secret"}]}}
  creationTimestamp: "2023-07-22T18:02:13Z"
  generation: 2
  name: ingress-01
  namespace: test-infra
  resourceVersion: "278238"
  uid: 17c34774-1d92-413e-85ec-c5a8da45989d
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v1
                port:
                  number: 8080
    - host: fabrikam.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v2
                port:
                  number: 8080
status:
  loadBalancer:
    ingress:
    - hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
      ports:
      - port: 80
        protocol: TCP

Testen des Zugriffs auf die Anwendung

Jetzt können wir über den FQDN, der dem Frontend zugewiesen ist, einige Datenverkehrsdaten an unsere Beispielanwendung senden. Verwenden Sie den folgenden Befehl, um den FQDN abzurufen.

fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

Als Nächstes geben Sie den Server-Namensindikator mit dem Befehl curl an, contoso.com denn der FQDN des Frontends sollte eine Antwort vom Backend-v1-Dienst zurückgeben.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com

Über die Antwort sollten wir Folgendes sehen:

{
 "path": "/",
 "host": "contoso.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "dcd4bcad-ea43-4fb6-948e-a906380dcd6d"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v1-5b8fd96959-f59mm"
}

Als Nächstes geben Sie den Server-Namensindikator mit dem Befehl curl an, fabrikam.com denn der FQDN des Frontends sollte eine Antwort vom Backend-v1-Dienst zurückgeben.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve fabrikam.com:80:$fqdnIp http://fabrikam.com

Über die Antwort sollten wir Folgendes sehen:

{
 "path": "/",
 "host": "fabrikam.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "adae8cc1-8030-4d95-9e05-237dd4e3941b"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v2-594bd59865-ppv9w"
}

Herzlichen Glückwunsch, Sie haben ALB Controller installiert, eine Back-End-Anwendung bereitgestellt und den Datenverkehr mithilfe verschiedener Hostnamen mit der Eingangs-API für Container an zwei verschiedene Back-End-Dienste weitergeleitet.