Standortübergreifendes Hosting mit Application Gateway für Container: Eingangs-API
Dieses Dokument hilft Ihnen beim Einrichten einer Beispielanwendung, welche die Eingangs-API verwendet, um das Hosten mehrerer Websites auf demselben Kubernetes Eingangsressourcen/Anwendungsgateway für Container-Frontend zu veranschaulichen. Es sind Schritte vorgesehen:
- Erstellen Sie eine Eingangs-Ressource mit zwei Hosts.
Hintergrund
Application Gateway für Container ermöglicht das Hosting mehrerer Websites, indem Sie mehrere Webanwendungen für denselben Port konfigurieren können. Zwei oder mehr eindeutige Websites können mit eindeutigen Back-End-Diensten gehostet werden. Sehen Sie sich folgendes Beispielszenarien an:
Voraussetzungen
Wenn Sie die BYO-Bereitstellungsstrategie verwendet haben, müssen Sie Ihre Application Gateway für Container-Ressourcen und den ALB-Controller einrichten.
Wenn Sie die Strategie der durch ALB verwalteten Bereitstellung verwendet haben, stellen Sie sicher, dass Ihr ALB-Controller und die Application Gateway für Container-Ressourcen über die benutzerdefinierte ApplicationLoadBalancer-Ressource bereitgestellt werden.
Bereitstellen einer HTTP-Beispielanwendung:
Wenden Sie die folgende Datei „deployment.yaml“ auf Ihrem Cluster an, um eine Beispielwebanwendung zur Veranschaulichung des pfad-, abfrage- und headerbasierten Routings zu erstellen.kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Mit diesem Befehl wird Folgendes in Ihrem Cluster erstellt:
- Ein Namespace namens
test-infra
- Zwei Dienste namens
backend-v1
undbackend-v2
imtest-infra
-Namespace - Zwei Bereitstellungen namens
backend-v1
undbackend-v2
imtest-infra
-Namespace
- Ein Namespace namens
Bereitstellen der erforderlichen Eingangsressource
- Erstellen eines Eingangsmanifests
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
Nachdem die Eingangsressource erstellt wurde, stellen Sie sicher, dass der Status den Hostnamen Ihres Lastenausgleichs anzeigt und dass beide Ports auf Anforderungen lauschen.
kubectl get ingress ingress-01 -n test-infra -o yaml
Beispielausgabe einer erfolgreichen Eingangserstellung.
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
Testen des Zugriffs auf die Anwendung
Jetzt können wir über den FQDN, der dem Frontend zugewiesen ist, einige Datenverkehrsdaten an unsere Beispielanwendung senden. Verwenden Sie den folgenden Befehl, um den FQDN abzurufen.
fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Als Nächstes geben Sie den Server-Namensindikator mit dem Befehl curl an, contoso.com
denn der FQDN des Frontends sollte eine Antwort vom Backend-v1-Dienst zurückgeben.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Über die Antwort sollten wir Folgendes sehen:
{
"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"
}
Als Nächstes geben Sie den Server-Namensindikator mit dem Befehl curl an, fabrikam.com
denn der FQDN des Frontends sollte eine Antwort vom Backend-v1-Dienst zurückgeben.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve fabrikam.com:80:$fqdnIp http://fabrikam.com
Über die Antwort sollten wir Folgendes sehen:
{
"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"
}
Herzlichen Glückwunsch, Sie haben ALB Controller installiert, eine Back-End-Anwendung bereitgestellt und den Datenverkehr mithilfe verschiedener Hostnamen mit der Eingangs-API für Container an zwei verschiedene Back-End-Dienste weitergeleitet.