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:
Pré-requisitos
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.
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 necessários da API do Gateway
- 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.