Compartilhar via


Hospedagem multissite com Gateway de Aplicativos para contêineres - API de gateway

Este documento ajuda você a configurar um aplicativo de exemplo que usa os recursos da API do Gateway para demonstrar a hospedagem de vários sites no mesmo recurso de Gateway do Kubernetes/front-end do Gateway de Aplicativos para contêineres. As etapas são fornecidas para:

  • Crie um recurso de Gateway com um ouvinte HTTP.
  • Crie dois recursos HTTPRoute que façam referência a um serviço de back-end exclusivo.

Tela de fundo

O Gateway de Aplicativos para contêineres permite hospedagem em vários sites, permitindo configurar mais de um aplicativo Web na mesma porta. Dois ou mais sites exclusivos podem ser hospedados usando serviços de back-end exclusivos. Confira o exemplo de cenário a seguir:

Uma figura que mostra a hospedagem de vários sites com o Gateway de Aplicativo para Contêineres.

Pré-requisitos

  1. Se você usou a estratégia de implantação BYO, certifique-se de configurar os recursos do Gateway de Aplicativos para contêineres e o ALB Controller.

  2. Se você usou a estratégia de implantação gerenciada ALB, garanta o provisionamento do ALB Controller e dos recursos do Gateway de Aplicativos para contêineres por meio do recurso personalizado ApplicationLoadBalancer.

  3. Implantar um aplicativo HTTP de exemplo:
    Aplique o seguinte arquivo deployment.yaml em seu cluster para criar um aplicativo Web de exemplo para demonstrar o roteamento baseado em caminho, consulta e cabeçalho.

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

    Esse comando cria o seguinte no cluster:

    • Um namespace chamado test-infra
    • Dois serviços chamados backend-v1 e backend-v2 no namespace test-infra
    • Duas implantações chamadas backend-v1 e backend-v2 no namespace test-infra

Implantar os recursos necessários da API do Gateway

  1. Criar um 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

Observação

Quando o Controlador ALB cria os recursos do Gateway de Aplicativos para contêineres no ARM, ele usará a seguinte convenção de nomenclatura para um recurso de front-end: fe-<oito caracteres gerados aleatoriamente>

Se você quiser alterar o nome do front-end criado no Azure, siga a estratégia de trazer sua própria implantação.

Depois que o recurso de gateway for criado, verifique se o status é válido, se o ouvinte está Programado e se um endereço foi atribuído ao gateway.

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

Exemplo de saída da criação bem-sucedida do 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

Depois que o gateway for criado, crie dois recursos HTTPRoute para os nomes de domínio contoso.com e fabrikam.com. Cada domínio encaminha o tráfego para um serviço de back-end diferente.

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

Depois que o recurso HTTPRoute for criado, verifique se a rota é apresentada como Aceita e se o recurso do Gateway de Aplicativos para contêineres está Programado.

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

Verifique se o recurso do Gateway de Aplicativo para contêineres foi atualizado com sucesso para cada 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

Testar o acesso ao aplicativo

Agora estamos prontos para enviar algum tráfego para nosso aplicativo de exemplo, por meio do FQDN atribuído ao front-end. Use o comando a seguir para obter o FQDN.

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

Se você especificar o indicador de nome do servidor usando o comando do cURL, contoso.com para o FQDN de front-end, ele retornará uma resposta do serviço de back-end-v1.

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

Por meio da resposta, veremos que:

{
 "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 você especificar o indicador de nome do servidor usando o comando curl, fabrikam.com para o FQDN do front-end, ele retornará uma resposta do serviço back-end-v1.

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

Por meio da resposta, veremos que:

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

Parabéns, você instalou o Controlador ALB, implantou um aplicativo de back-end e roteou o tráfego para dois serviços de back-end diferentes por meio de nomes de host diferentes por meio da API do Gateway no Gateway de Aplicativos para contêineres.