Delen via


Hosten van meerdere sites met Application Gateway for Containers - Ingress-API

Dit document helpt u bij het instellen van een voorbeeldtoepassing die gebruikmaakt van de Ingress-API om te demonstreren hoe meerdere sites gehost kunnen worden op dezelfde Kubernetes Ingress-resource / Application Gateway voor Containers-frontend. Er worden stappen gegeven voor:

Achtergrond

Met Application Gateway for Containers kunt u meerdere sites hosten door meer dan één webtoepassing op dezelfde poort te configureren. Twee of meer unieke sites kunnen worden gehost met behulp van unieke back-endservices. Zie het volgende voorbeeldscenario:

Een diagram met hosting voor meerdere locaties met Application Gateway for Containers.

Vereiste voorwaarden

  1. Als u de BYO-implementatiestrategie hebt gebruikt, moet u ervoor zorgen dat u uw Application Gateway for Containers-resources en ALB Controller instelt.

  2. Als u de door ALB beheerde implementatiestrategie hebt gebruikt, moet u ervoor zorgen dat uw ALB-controller en de Application Gateway for Containers-resources worden ingericht via de aangepaste applicationLoadBalancer-resource.

  3. Voorbeeld-HTTP-toepassing implementeren:
    Pas het volgende bestand deployment.yaml toe op uw cluster om een voorbeeldwebtoepassing te maken om pad-, query- en headergebaseerde routering te demonstreren.

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
    

    Met deze opdracht maakt u het volgende op uw cluster:

    • Een naamruimte met de naam test-infra
    • Twee services genaamd backend-v1 en backend-v2 in de test-infra naamruimte
    • Twee deployments genaamd backend-v1 en backend-v2 in de test-infra namespace

De vereiste Ingress-resource implementeren

  1. Een Ingress aanmaken
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

Zodra de ingress resource is gemaakt, controleert u of de status de hostnaam van uw load balancer weergeeft en of beide poorten op aanvragen wachten.

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

Voorbeeld van een geslaagde uitvoer van het maken van een Ingress.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.networking.azure.io/alb-frontend: FRONTEND_NAME
    alb.networking.azure.io/alb-id: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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

Toegang tot de toepassing testen

Nu zijn we klaar om verkeer naar onze voorbeeldtoepassing te verzenden, via de FQDN die is toegewezen aan de front-end. Gebruik de volgende opdracht om de FQDN op te halen.

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

Geef vervolgens de servernaamindicator op met behulp van de curl-opdracht. contoso.com Voor de front-end-FQDN moet een antwoord worden geretourneerd van de back-end-v1-service.

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

Via het antwoord moeten we het volgende zien:

{
 "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"
}

Geef vervolgens de servernaamindicator op met behulp van de curl-opdracht, fabrikam.com voor de front-end-FQDN moet een antwoord van de back-end-v1-service worden geretourneerd.

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

Via het antwoord moeten we het volgende zien:

{
 "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"
}

Gefeliciteerd, u hebt de ALB Controller geïnstalleerd, een achterliggende toepassing geïmplementeerd en verkeer doorgestuurd naar twee verschillende achterliggende services door gebruik te maken van verschillende hostnamen via de Ingress API op Application Gateway for Containers.