Kapsayıcılar için Azure Uygulaması Lication Gateway URL Yeniden Yönlendirmesi - Ağ Geçidi API'si
Kapsayıcılar için Application Gateway, url'nin üç yönüne göre istemciye yeniden yönlendirme yanıtı döndürmenizi sağlar: protokol, ana bilgisayar adı ve yol. Her yeniden yönlendirme için, yeniden yönlendirmenin doğasını tanımlamak için istemciye tanımlı bir HTTP durum kodu döndürülebilir.
Kullanım ayrıntıları
URL yeniden yönlendirmeleri, Kubernetes Ağ Geçidi API'si tarafından tanımlanan RequestRedirect kural filtresini kullanır.
Yönlendirme
Yeniden yönlendirme, yeniden yönlendirmenin amacını anlamak için istemcilere döndürülen yanıt durum kodunu ayarlar. Aşağıdaki yeniden yönlendirme türleri desteklenir:
- 301 (Kalıcı olarak taşındı): Hedef kaynağa yeni bir kalıcı URI atandığını gösterir. Bu kaynağa yönelik gelecekteki başvurular, kapalı URI'lerden birini kullanır. HTTP'den HTTPS'ye yeniden yönlendirme için 301 durum kodunu kullanın.
- 302 (Bulundu): Hedef kaynağın geçici olarak farklı bir URI altında olduğunu gösterir. Yeniden yönlendirme zaman zaman değişebileceğinden, istemci gelecekteki istekler için geçerli istek URI'sini kullanmaya devam etmelidir.
Yeniden yönlendirme özellikleri
Protokol yeniden yönlendirmesi genellikle istemciye şifrelenmemiş bir trafik düzeninden HTTP'den HTTPS'ye yeniden yönlendirme gibi trafiğe geçişini söylemek için kullanılır.
Ana bilgisayar adı yeniden yönlendirmesi, isteğin tam etki alanı adıyla (fqdn) eşleşir. Bu durum genellikle eski bir etki alanı adını yeni bir etki alanı adına yeniden yönlendirmede görülür; gibi
contoso.com
.fabrikam.com
Yol yeniden yönlendirmenin iki farklı değişkeni vardır:
prefix
vefull
.Prefix
yeniden yönlendirme türü, tanımlı bir değerle başlayan tüm istekleri yeniden yönlendirir. Örneğin: /shop ön eki /shop ve sonrasındaki tüm metinler ile eşleşir. Örneğin, /shop, /shop/checkout ve /shop/item-a da /shop'a yönlendirilir.Full
yeniden yönlendirme türü tam bir değerle eşleşir. Örneğin: /shop /store'a yönlendirebilir, ancak /shop/checkout /store'a yönlendirilmezdi.
Aşağıdaki şekilde, contoso.com/summer-promotion contoso.com/shop/category/5 yönlendirilmesini hedefleyen bir istek örneği gösterilmektedir. Buna ek olarak, http protokolü aracılığıyla contoso.com için başlatılan ikinci bir istek, https değişkenine yeni bir bağlantı başlatmak için bir yeniden yönlendirme döndürülür.
Önkoşullar
BYO dağıtım stratejisini izliyorsanız Kapsayıcılar için Application Gateway kaynaklarınızı ve ALB Denetleyicisi'ni ayarladığınızdan emin olun.
ALB yönetilen dağıtım stratejisini izliyorsanız, ALB Denetleyicinizi sağladığınızdan ve ApplicationLoadBalancer özel kaynağı aracılığıyla Kapsayıcılar için Application Gateway kaynaklarını sağladığınızdan emin olun.
Örnek HTTP uygulamasını dağıtma:
Yeniden yönlendirme özelliklerini göstermek üzere örnek bir TLS sertifikası dağıtmak için kümenize aşağıdaki deployment.yaml dosyasını uygulayın.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/https-scenario/ssl-termination/deployment.yaml
Bu komut kümenizde aşağıdakileri oluşturur:
- adlı bir ad alanı
test-infra
- ad alanında çağrılan
echo
test-infra
bir hizmet - ad alanında
test-infra
adlıecho
bir dağıtım - ad alanında
test-infra
adlılistener-tls-secret
bir gizli dizi
- adlı bir ad alanı
Gerekli Ağ Geçidi API'sini dağıtma
Ağ Geçidi Oluşturma
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 - name: https-listener port: 443 protocol: HTTPS allowedRoutes: namespaces: from: Same tls: mode: Terminate certificateRefs: - kind : Secret group: "" name: listener-tls-secret EOF
Not
ALB Denetleyicisi ARM'de Kapsayıcılar için Application Gateway kaynaklarını oluşturduğunda, bir ön uç kaynağı için şu adlandırma kuralını kullanır: fe-8< rastgele oluşturulan karakterler>
Azure'da oluşturulan ön ucun adını değiştirmek isterseniz kendi dağıtım stratejinizi getirin seçeneğini uygulamayı göz önünde bulundurun.
Ağ geçidi kaynağı oluşturulduktan sonra durumun geçerli olduğundan, dinleyicinin Programlandığından ve ağ geçidine bir adres atandığından emin olun.
kubectl get gateway gateway-01 -n test-infra -o yaml
Başarılı ağ geçidi oluşturma işleminin örnek çıktısı.
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
https aracılığıyla alınan trafiği işleyen bir HTTPRoute kaynağı contoso.com
oluşturun.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: https-contoso
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
sectionName: https-listener
hostnames:
- "contoso.com"
rules:
- backendRefs:
- name: echo
port: 80
EOF
HTTPRoute kaynağı oluşturulduğunda HTTPRoute kaynağının Kabul Edildi ve Kapsayıcılar için Application Gateway kaynağının Programlandığından emin olun.
kubectl get httproute rewrite-example -n test-infra -o yaml
Kapsayıcılar için Application Gateway kaynağının her HTTPRoute için başarıyla güncelleştirildiğinden emin olun.
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
Ağ geçidi oluşturulduktan sonra, http trafiğini https'ye yönlendiren requestRedirect filtresiyle için contoso.com
bir HTTPRoute kaynağı oluşturun.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-to-https-contoso-redirect
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
sectionName: http-listener
hostnames:
- "contoso.com"
rules:
- matches:
filters:
- type: RequestRedirect
requestRedirect:
scheme: https
statusCode: 301
EOF
HTTPRoute kaynağı oluşturulduğunda HTTPRoute kaynağının Kabul Edildi ve Kapsayıcılar için Application Gateway kaynağının Programlandığından emin olun.
kubectl get httproute rewrite-example -n test-infra -o yaml
Kapsayıcılar için Application Gateway kaynağının her HTTPRoute için başarıyla güncelleştirildiğinden emin olun.
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
/summer-promotion yolunun belirli bir URL'ye yeniden yönlendirmesini işleyen bir HTTPRoute kaynağı contoso.com
oluşturun. Http'den http'ye HTTPRoute kaynaklarında gösterildiği gibi sectionName ortadan kaldırılarak, bu yeniden yönlendirme kuralı hem HTTP hem de HTTPS istekleri için geçerlidir.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: summer-promotion-redirect
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
sectionName: https-listener
hostnames:
- "contoso.com"
rules:
- matches:
- path:
type: PathPrefix
value: /summer-promotion
filters:
- type: RequestRedirect
requestRedirect:
path:
type: ReplaceFullPath
replaceFullPath: /shop/category/5
statusCode: 302
- backendRefs:
- name: echo
port: 80
EOF
HTTPRoute kaynağı oluşturulduğunda HTTPRoute kaynağının Kabul Edildi ve Kapsayıcılar için Application Gateway kaynağının Programlandığından emin olun.
kubectl get httproute rewrite-example -n test-infra -o yaml
Kapsayıcılar için Application Gateway kaynağının her HTTPRoute için başarıyla güncelleştirildiğinden emin olun.
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
Uygulamaya erişimi test etme
Artık ön uçta atanan FQDN aracılığıyla örnek uygulamamıza trafik göndermeye hazırız. FQDN'yi almak için aşağıdaki komutu kullanın.
fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
curl komutunu kullanarak sunucu adı göstergesini belirttiğinizde, http://contoso.com
Kapsayıcılar için Application Gateway'den 301 yeniden yönlendirmesi https://contoso.com
tanımlayan bir üst bilgi içeren bir location
yanıt döndürmelidir.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/ -v
Yanıt aracılığıyla şu bilgileri görmemiz gerekir:
* Added contoso.com:80:xxx.xxx.xxx.xxx to DNS cache
* Hostname contoso.com was found in DNS cache
* Trying xxx.xxx.xxx.xxx:80...
* Connected to contoso.com (xxx.xxx.xxx.xxx) port 80 (#0)
> GET / HTTP/1.1
> Host: contoso.com
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
< location: https://contoso.com/
< date: Mon, 26 Feb 2024 22:56:23 GMT
< server: Microsoft-Azure-Application-LB/AGC
< content-length: 0
<
* Connection #0 to host contoso.com left intact
Curl komutunu kullanarak sunucu adı göstergesini belirttiğinizde Kapsayıcılar https://contoso.com/summer-promotion
için Application Gateway 302 yeniden yönlendirmesi https://contoso.com/shop/category/5
döndürmelidir.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:443:$fqdnIp https://contoso.com/summer-promotion -v
Yanıt aracılığıyla şu bilgileri görmemiz gerekir:
> GET /summer-promotion HTTP/2
> Host: contoso.com
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
< HTTP/2 302
< location: https://contoso.com/shop/category/5
< date: Mon, 26 Feb 2024 22:58:43 GMT
< server: Microsoft-Azure-Application-LB/AGC
<
* Connection #0 to host contoso.com left intact
Tebrikler, ALB Denetleyicisi'ni yüklediniz, bir arka uç uygulaması dağıttınız ve ağ geçidi API'sini kullanarak hem HTTP'den HTTPS'ye yönlendirmeyi hem de belirli istemci isteklerine yol tabanlı yeniden yönlendirmeyi yapılandırdıysanız.