Hospedaje de varios sitios con la Puerta de enlace de aplicaciones para contenedores: API de entrada
Este documento le ayuda a configurar una aplicación de ejemplo que utiliza la API de entrada para mostrar el hospedaje de varios sitios en el mismo recurso de entrada de Kubernetes o front-end de Puerta de enlace de aplicaciones para contenedores. Se proporcionan pasos para:
- Crear un recurso de entrada con dos hosts.
Fondo
Puerta de enlace de aplicaciones para contenedores habilita el alojamiento de varios sitios al permitirle configurar más de una aplicación web en el mismo puerto. Se pueden hospedar dos o más sitios únicos mediante servicios backend únicos. Consulte el siguiente escenario de ejemplo:
Requisitos previos
Si sigue la estrategia de implementación BYO, asegúrese de configurar los recursos de la Puerta de enlace de aplicaciones para contenedores y del controlador ALB.
Si sigue la estrategia de implementación administrada de ALB, asegúrese de aprovisionar su controlador de ALB y los recursos de Puerta de enlace de aplicaciones para contenedores mediante el recurso personalizado ApplicationLoadBalancer.
Despliegue la aplicación HTTP de ejemplo:
Aplique el siguiente archivo deployment.yaml en el clúster para crear una aplicación web de ejemplo para mostrar la ruta de acceso, la consulta y el enrutamiento basado en encabezados.kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Este comando crea lo siguiente en el clúster:
- Un espacio de nombres denominado
test-infra
- Dos servicios llamados
backend-v1
ybackend-v2
en el espacio de nombrestest-infra
- Dos implementaciones llamadas
backend-v1
ybackend-v2
en el espacio de nombrestest-infra
- Un espacio de nombres denominado
Implementación del recurso de entrada necesario
- Creación de una entrada
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
Una vez creado el recurso de entrada, asegúrese de que el estado muestra el nombre de host del equilibrador de carga y que ambos puertos escuchan solicitudes.
kubectl get ingress ingress-01 -n test-infra -o yaml
Salida de ejemplo de creación correcta de 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
Prueba de acceso a la aplicación
Ahora, estamos listos para enviar tráfico a nuestra aplicación de ejemplo mediante el FQDN asignado al frontend. Utilice el siguiente comando para obtener el FQDN.
fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
A continuación, si especifica el indicador de nombre del servidor mediante el comando curl, contoso.com
para el FQDN de la interfaz debería devolver una respuesta del servicio backend-v1.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Mediante la respuesta deberíamos ver:
{
"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"
}
A continuación, si especifica el indicador de nombre del servidor mediante el comando curl, fabrikam.com
para el FQDN de la interfaz debería devolver una respuesta del servicio backend-v1.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve fabrikam.com:80:$fqdnIp http://fabrikam.com
Mediante la respuesta deberíamos ver:
{
"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"
}
Enhorabuena, ha instalado el controlador ALB, ha implementado una aplicación backend y enrutado el tráfico a dos servicios backend diferentes mediante distintos nombres de host con la API de entrada mediante Puerta de enlace de aplicaciones para contenedores.