Condividi tramite


Hosting multisito con gateway applicazione per contenitori - API gateway

Questo documento illustra come configurare un'applicazione di esempio che usa le risorse dell'API gateway per illustrare come ospitare più siti nella stessa risorsa gateway Kubernetes/Gateway applicativo per contenitori front-end. Vengono fornite le procedure per:

  • Creare una risorsa Gateway con un listener HTTP.
  • Creare due risorse HTTPRoute che fanno riferimento a un servizio back-end univoco.

Background

Il Gateway applicativo per contenitori consente l'hosting multi-sito, rendendo possibile la configurazione di più di un'applicazione Web nella stessa porta. Due o più siti univoci possono essere ospitati usando servizi back-end univoci. Vedere lo scenario di esempio seguente:

Figura che mostra l'hosting multisito con gateway applicazione per contenitori.

Prerequisiti

  1. Se è stata usata la strategia di distribuzione BYO, assicurarsi di configurare il gateway applicazione per le risorse dei contenitori e il controller ALB.

  2. Se è stata usata la strategia di distribuzione gestita di ALB, assicurarsi che il provisioning del controller ALB e il gateway applicazione per le risorse contenitori tramite la risorsa personalizzata ApplicationLoadBalancer.

  3. Distribuire un'applicazione HTTP di esempio:
    Applicare il file deployment.yaml seguente nel cluster per creare un'applicazione Web di esempio per illustrare il percorso, la query e il routing basato sull'intestazione.

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

    Questo comando crea gli elementi seguenti nel cluster:

    • Spazio dei nomi denominato test-infra
    • Due servizi chiamati backend-v1 e backend-v2 nello spazio dei test-infra nomi
    • Due distribuzioni chiamate backend-v1 e backend-v2 nello spazio dei test-infra nomi

Distribuire le risorse necessarie per l'API gateway

  1. Creare un gateway
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

Nota

Quando il Controller ALB crea le risorse Gateway applicativo per contenitori in ARM, userà la convenzione di denominazione seguente per una risorsa front-end: fe-<8 caratteri generati in modo casuale>

Se si vuole modificare il nome del front-end creato in Azure, valutare la possibilità di seguire la strategia di distribuzione personalizzata (Bring Your Own Deployment).

Dopo aver creato la risorsa gateway, verificare che lo stato sia valido, che il listener sia programmato e che al gateway sia assegnato un indirizzo.

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

Output di esempio della corretta creazione del gateway.

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

Dopo aver creato il gateway, creare due risorse HTTPRoute per i nomi di dominio contoso.com e fabrikam.com. Ogni dominio inoltra il traffico a un servizio back-end diverso.

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

Dopo aver creato la risorsa HTTPRoute, verificare che entrambe le risorse HTTPRoute siano accettate e che lo stato della risorsa Gateway applicativo per contenitori sia programmato.

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

Verificare che lo stato della risorsa Gateway applicativo per contenitori sia stato aggiornato correttamente per ogni HTTPRoute.

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

Testare l'accesso all'applicazione

A questo punto, è possibile inviare traffico all'applicazione di esempio tramite l’FQDN assegnato al front-end. Usare il comando seguente per ottenere il nome di dominio completo.

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

Se si specifica l'indicatore del nome del server usando il comando curl, contoso.com per il nome di dominio completo del front-end, viene restituita una risposta dal servizio backend-v1.

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

Tramite la risposta si osserverà quanto segue:

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

Se si specifica l'indicatore del nome del server usando il comando curl, fabrikam.com per il nome di dominio completo del front-end, viene restituita una risposta dal servizio backend-v1.

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

Tramite la risposta si osserverà quanto segue:

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

Congratulazioni, il controller ALB è stato installato, è stata distribuita un'applicazione back-end e il traffico è stato instradato a due diversi servizi back-end tramite nomi host diversi tramite l'API gateway nel Gateway applicativo per contenitori.