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:
Pré-requisitos
Se estiver seguindo a estratégia de implantação BYO, configure os recursos do Gateway de Aplicativos para contêineres e o Controlador ALB.
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.
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
ebackend-v2
no namespacetest-infra
- Duas implantações chamadas
backend-v1
ebackend-v2
no namespacetest-infra
- Um namespace chamado
Implantar os recursos de Entrada necessários
- 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.