Hostowanie wielu witryn z Application Gateway dla kontenerów — Ingress API
Ten dokument ułatwia skonfigurowanie przykładowej aplikacji korzystającej z Ingress API do zademonstrowania hostowania wielu witryn w tym samym zasobie Kubernetes Ingress / frontendzie Application Gateway for Containers. Podano kroki, aby:
- Utwórz zasób ruchu przychodzącego z dwoma hostami.
Kontekst
Usługa Application Gateway dla kontenerów umożliwia hostowanie wielu witryn, umożliwiając skonfigurowanie więcej niż jednej aplikacji internetowej na tym samym porcie. Co najmniej dwie unikatowe witryny mogą być hostowane przy użyciu unikatowych usług zaplecza. Zobacz następujący przykładowy scenariusz:
Wymagania wstępne
Jeśli użyłeś strategii wdrażania BYO, upewnij się, że skonfigurowałeś usługę Application Gateway dla zasobów kontenerów i kontroler ALB.
Jeśli użyłeś strategii wdrażania zarządzanego ALB, upewnij się, że aprowizowany jest zarówno Kontroler ALB, jak i zasoby usługi Application Gateway for Containers, za pośrednictwem niestandardowego zasobu ApplicationLoadBalancer.
Wdróż przykładową aplikację HTTP:
Zastosuj następujący plik deployment.yaml w klastrze, aby utworzyć przykładową aplikację internetową w celu zademonstrowania routingu opartego na ścieżkach, zapytaniach i nagłówkach.kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
To polecenie tworzy w klastrze następujące elementy:
- Przestrzeń nazw o nazwie
test-infra
- Dwie usługi o nazwie
backend-v1
ibackend-v2
wtest-infra
przestrzeni nazw - Dwa wdrożenia o nazwie
backend-v1
ibackend-v2
w przestrzeni nazw o nazwietest-infra
- Przestrzeń nazw o nazwie
Wdróż wymagany zasób Ingress
- Utwórz 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
Po utworzeniu zasobu Ingress upewnij się, że stan pokazuje nazwę hosta load balancera i że oba porty nasłuchują żądań.
kubectl get ingress ingress-01 -n test-infra -o yaml
Przykładowy wynik pomyślnego utworzenia Ingress.
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
Testowanie dostępu do aplikacji
Teraz jesteśmy gotowi wysłać ruch do naszej przykładowej aplikacji za pośrednictwem FQDN przypisanego do frontend. Użyj następującego polecenia, aby uzyskać pełną nazwę domeny (FQDN).
fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Następnie określ wskaźnik nazwy serwera przy użyciu polecenia curl, contoso.com
dla nazwy FQDN frontendu powinna zwrócić odpowiedź z usługi backend-v1.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
W odpowiedzi powinniśmy zobaczyć:
{
"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"
}
Następnie określ wskaźnik nazwy serwera przy użyciu polecenia curl, fabrikam.com
aby nazwa FQDN frontonu powinna zwrócić odpowiedź z usługi backend-v1.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve fabrikam.com:80:$fqdnIp http://fabrikam.com
W odpowiedzi powinniśmy zobaczyć:
{
"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"
}
Gratulacje, kontroler usługi ALB został zainstalowany, wdrożono aplikację zaplecza i przekierowano ruch do dwóch różnych usług zaplecza przy użyciu różnych nazw hostów z interfejsem API ruchu przychodzącego w usłudze Application Gateway for Containers.