Hostování více webů se službou Application Gateway pro kontejnery – rozhraní API brány

Tento dokument vám pomůže nastavit ukázkovou aplikaci, která používá prostředky z rozhraní API brány k předvedení hostování více lokalit ve stejném prostředku brány Kubernetes Gateway / front-endu služby Application Gateway pro kontejnery. K dispozici jsou následující kroky:

Pozadí

Služba Application Gateway pro kontejnery umožňuje hostování více webů tím, že umožňuje nakonfigurovat více než jednu webovou aplikaci na stejném portu. Dva nebo více jedinečných webů je možné hostovat pomocí jedinečných back-endových služeb. Podívejte se na následující ukázkový scénář:

Obrázek znázorňující hostování ve více lokalitách se službou Application Gateway pro kontejnery

Požadavky

  1. Pokud jste použili strategii nasazení BYO, ujistěte se, že jste nastavili prostředky služby Application Gateway pro kontejnery a řadič ALB.

  2. Pokud jste použili strategii nasazení spravovaného ALB, ujistěte se, že prostřednictvím vlastního prostředku ApplicationLoadBalancer zřídíte kontroler ALB a službu Application Gateway for Containers.

  3. Nasazení ukázkové aplikace HTTP:
    Pomocí následujícího souboru deployment.yaml v clusteru vytvořte ukázkovou webovou aplikaci pro předvedení cesty, dotazu a směrování na základě hlaviček.

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

    Tento příkaz vytvoří v clusteru následující:

    • Obor názvů s názvem test-infra
    • Dvě volané backend-v1 služby a backend-v2 v test-infra oboru názvů
    • Volali backend-v1 se dvě nasazení a backend-v2 v test-infra oboru názvů

Nasazení požadovaných prostředků rozhraní API brány

  1. Vytvoření brány
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: gateway-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-name: alb-test
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - name: http-listener
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
EOF

Poznámka:

Když kontroler ALB vytvoří prostředky Application Gateway pro kontejnery v ARM, použije pro front-endový prostředek následující zásady vytváření názvů: fe-8< náhodně vygenerované znaky.>

Pokud chcete změnit název front-endu vytvořeného v Azure, zvažte použití vlastní strategie nasazení.

Po vytvoření prostředku brány se ujistěte, že je stav platný, naprogramuje se naslouchací proces a brána má přiřazenou adresu.

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

Příklad výstupu úspěšného vytvoření brány

status:
  addresses:
  - type: Hostname
    value: xxxx.yyyy.alb.azure.com
  conditions:
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Valid Gateway
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Application Gateway For Containers resource has been successfully updated.
    observedGeneration: 1
    reason: Programmed
    status: "True"
    type: Programmed
  listeners:
  - attachedRoutes: 0
    conditions:
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Listener is accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    name: https-listener
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

Po vytvoření brány vytvořte dva prostředky HTTPRoute pro contoso.com názvy domén a fabrikam.com názvy domén. Každá doména předává provoz do jiné back-endové služby.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: contoso-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  hostnames:
  - "contoso.com"
  rules:
  - backendRefs:
    - name: backend-v1
      port: 8080
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: fabrikam-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  hostnames:
  - "fabrikam.com"
  rules:
  - backendRefs:
    - name: backend-v2
      port: 8080
EOF

Po vytvoření prostředku HTTPRoute se ujistěte, že jsou prostředky HTTPRoute naprogramované a služba Application Gateway for Containers.

kubectl get httproute contoso-route -n test-infra -o yaml
kubectl get httproute fabrikam-route -n test-infra -o yaml

Ověřte, že se pro každý prostředek HTTPRoute úspěšně aktualizoval stav prostředku služby Application Gateway for Containers.

status:
  parents:
  - conditions:
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Route is Accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    controllerName: alb.networking.azure.io/alb-controller
    parentRef:
      group: gateway.networking.k8s.io
      kind: Gateway
      name: gateway-01
      namespace: test-infra

Otestování přístupu k aplikaci

Teď jsme připraveni odeslat nějaký provoz do ukázkové aplikace prostřednictvím plně kvalifikovaného názvu domény přiřazeného front-endu. K získání plně kvalifikovaného názvu domény použijte následující příkaz.

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Pokud pomocí příkazu curl zadáte indikátor názvu serveru, contoso.com vrátí front-endový plně kvalifikovaný název domény odpověď ze služby back-end v1.

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

Prostřednictvím odpovědi bychom měli vidět:

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

Pokud pomocí příkazu curl zadáte indikátor názvu serveru, fabrikam.com vrátí front-endový plně kvalifikovaný název domény odpověď ze služby back-end v1.

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

Prostřednictvím odpovědi bychom měli vidět:

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

Blahopřejeme, nainstalovali jste kontroler ALB, nasadili back-endovou aplikaci a směrovali provoz do dvou různých back-endových služeb prostřednictvím různých názvů hostitelů prostřednictvím rozhraní API brány ve službě Application Gateway for Containers.