Compartilhar via


Hospedagem de vários sites com o Gateway de Aplicativo para Contêineres – API de Entrada

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

  • Crie um recurso de Entrada com dois hosts.

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:

A diagram showing multisite hosting with Application Gateway for Containers.

Pré-requisitos

  1. Se estiver seguindo a estratégia de implantação BYO, configure os recursos do Gateway de Aplicativos para contêineres e o Controlador ALB.

  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 de Entrada necessários

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

Depois que o recurso de entrada for criado, verifique se o status mostra o nome do host do balanceador de carga e se as duas portas estão escutando as solicitações.

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

Exemplo de saída da criação bem-sucedida da entrada.

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

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 ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

Em seguida, especifique o indicador do nome do servidor usando o comando curl, pcontoso.com para o FQDN do front-end que deve retornar uma resposta do serviço 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 do curl, fabrikam.com para o FQDN de front-end que deve retornar uma resposta do serviço de 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 usando nomes de host diferentes com a API de Entrada no Gateway de Aplicativos para contêineres.