Ponowne zapisywanie adresów URL dla bramy aplikacja systemu Azure dla kontenerów — interfejs API ruchu przychodzącego
Usługa Application Gateway for Containers umożliwia ponowne zapisywanie adresu URL żądania klienta, w tym nazwy hosta żądań i/lub ścieżki żądań. Gdy usługa Application Gateway dla kontenerów inicjuje żądanie do obiektu docelowego zaplecza, żądanie zawiera nowo przepisany adres URL w celu zainicjowania żądania.
Szczegóły użycia
Ponowne zapisywanie adresów URL korzysta z usługi Application Gateway dla zasobu niestandardowego IngressExtension kontenerów.
Tło
Ponowne zapisywanie adresów URL umożliwia tłumaczenie żądania przychodzącego na inny adres URL po zainicjowaniu do obiektu docelowego zaplecza.
Na poniższej ilustracji przedstawiono żądanie przeznaczone dla contoso.com/shop ponownego pisania do contoso.com/ecommerce po zainicjowaniu żądania do obiektu docelowego zaplecza przez usługę Application Gateway dla kontenerów:
Wymagania wstępne
- Jeśli wykonasz strategię wdrażania byo, upewnij się, że skonfigurowaliśmy usługę Application Gateway dla zasobów kontenerów i kontroler usługi ALB.
- Jeśli wykonasz strategię wdrażania zarządzanego przez usługę ALB, upewnij się, że aprowizujesz kontroler usługi ALB i aprowizujesz zasoby usługi Application Gateway for Containers za pośrednictwem zasobu niestandardowego 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 następujące polecenie w klastrze:
- 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
wtest-infra
przestrzeni nazw
Wdrażanie wymaganych zasobów interfejsu API ruchu przychodzącego
- Tworzenie ruchu przychodzącego, który przechwytuje cały ruch i trasy do zaplecza-v2
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-v2
port:
number: 8080
EOF
- Tworzenie ruchu przychodzącego zgodnego z prefiksem /shop, który kieruje do zaplecza-v1
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-02
namespace: test-infra
annotations:
alb.networking.azure.io/alb-name: alb-test
alb.networking.azure.io/alb-namespace: alb-test-infra
alb.networking.azure.io/alb-ingress-extension: url-rewrite
spec:
ingressClassName: azure-alb-external
rules:
- host: contoso.com
http:
paths:
- path: /shop
pathType: Prefix
backend:
service:
name: backend-v1
port:
number: 8080
EOF
Uwaga
Gdy kontroler usługi ALB tworzy bramę Application Gateway dla zasobów kontenerów w usłudze ARM, użyje następującej konwencji nazewnictwa dla zasobu frontonu: fe-8< losowo wygenerowanych znaków>
Jeśli chcesz zmienić nazwę frontonu utworzonego na platformie Azure, rozważ zastosowanie własnej strategii wdrażania.
Po utworzeniu każdego zasobu ruchu przychodzącego upewnij się, że stan jest prawidłowy, odbiornik jest zaprogramowany, a adres jest przypisany do bramy.
kubectl get ingress ingress-01 -n test-infra -o yaml
kubectl get ingress ingress-02 -n test-infra -o yaml
Przykładowe dane wyjściowe jednego z zasobów ruchu przychodzącego.
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":"contoso.com","http":{"paths":[{"backend":{"service":{"name":"backend-v2","port":{"number":8080}}},"path":"/","pathType":"Prefix"}]}}]}}
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:
- backend:
service:
name: backend-v2
port:
number: 8080
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
ports:
- port: 80
protocol: TCP
Po utworzeniu ruchu przychodzącego utwórz zasób IngressExtension dla elementu contoso.com
. Ten przykład zapewnia zainicjowanie contoso.com/ecommerce
ruchu wysyłanego do contoso.com/shop
obiektu docelowego zaplecza.
kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: IngressExtension
metadata:
name: url-rewrite
namespace: test-infra
spec:
rules:
- host: contoso.com
rewrites:
- type: URLRewrite
urlRewrite:
path:
type: ReplacePrefixMatch
replacePrefixMatch: /ecommerce
EOF
Po utworzeniu zasobu IngressExtension upewnij się, że zasób IngressExtension zawiera wartość Zaakceptowane , a zasób Application Gateway for Containers jest zaprogramowany.
kubectl get IngressExtension url-rewrite -n test-infra -o yaml
Sprawdź, czy zasób usługi Application Gateway for Containers został pomyślnie zaktualizowany dla rozszerzenia IngressExtension.
Testowanie dostępu do aplikacji
Teraz możemy wysłać jakiś ruch do naszej przykładowej aplikacji za pośrednictwem nazwy FQDN przypisanej do frontonu. Użyj następującego polecenia, aby uzyskać nazwę FQDN.
fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Jeśli określisz wskaźnik contoso.com/shop
nazwy serwera przy użyciu polecenia curl, odpowiedź z usługi backend-v1 zostanie zwrócona z żądaną ścieżką do obiektu docelowego zaplecza z wyświetloną wartością contoso.com/ecommerce
.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/shop
W odpowiedzi powinna zostać wyświetlona następująca odpowiedź:
{
"path": "/ecommerce",
"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"
}
Jeśli określisz wskaźnik contoso.com
nazwy serwera przy użyciu polecenia curl, odpowiedź zostanie zwrócona z usługi backend-v2, jak pokazano.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Powinna zostać wyświetlona następująca odpowiedź:
{
"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": [
"adae8cc1-8030-4d95-9e05-237dd4e3941b"
]
},
"namespace": "test-infra",
"ingress": "",
"service": "",
"pod": "backend-v2-594bd59865-ppv9w"
}
Gratulacje, zainstalowano kontroler usługi ALB, wdrożono aplikację zaplecza i użyto rozszerzenia IngressExtension do ponownego zapisania żądanego adresu URL klienta przed ustawieniem ruchu docelowego w usłudze Application Gateway for Containers.