Azure 애플리케이션 Gateway for Containers에 대한 URL 리디렉션 - 게이트웨이 API
컨테이너용 Application Gateway를 사용하면 프로토콜, 호스트 이름, 경로라는 URL의 세 가지 측면을 기반으로 클라이언트에 리디렉션 응답을 반환할 수 있습니다. 각 리디렉션에 대해 정의된 HTTP 상태 코드가 클라이언트에 반환되어 리디렉션의 특성을 정의할 수 있습니다.
사용량 세부 정보
URL 리디렉션은 Kubernetes 게이트웨이 API에서 정의한 RequestRedirect 규칙 필터의 장점을 활용합니다.
리디렉션
리다이렉션은 클라이언트에게 반환되는 응답 상태 코드를 설정하여 리다이렉션의 목적을 파악합니다. 지원되는 리디렉션 유형은 다음과 같습니다.
- 301(영구적으로 이동됨): 대상 리소스에 새로운 영구 URI가 할당되었음을 나타냅니다. 이 리소스에 대한 향후 참조는 묶은 URI 중 하나를 사용합니다. HTTP에서 HTTPS로 리디렉션에 301 상태 코드를 사용합니다.
- 302(찾음): 대상 리소스가 일시적으로 다른 URI 아래에 있음을 나타냅니다. 리디렉션은 수시로 변경될 수 있으므로 클라이언트는 이후 요청에 유효한 요청 URI를 계속 사용해야 합니다.
리디렉션 기능
프로토콜 리디렉션은 클라이언트에게 암호화되지 않은 트래픽 체계에서 트래픽으로 이동하도록 지시하는 데 일반적으로 사용됩니다(예: HTTP에서 HTTPS 리디렉션).
호스트 이름 리디렉션은 요청의 FQDN(정규화된 도메인 이름)과 일치합니다. 이는 일반적으로 기존 도메인 이름을 새 도메인 이름으로 리디렉션할 때 나타납니다(예:
contoso.com
에서fabrikam.com
으로).경로 리디렉션에는
prefix
와full
의 두 가지 변형이 있습니다.Prefix
리디렉션 형식은 정의된 값으로 시작하는 모든 요청을 리디렉션합니다. 예를 들어 /shop의 접두사는 /shop과 다음 텍스트와 일치합니다. 예를 들어, /shop, /shop/checkout, /shop/item-a는 모두 /shop으로 리디렉션됩니다.Full
리디렉션 형식이 정확한 값과 일치합니다. 예를 들어 /shop은 /store로 리디렉션할 수 있지만 /shop/checkout은 /store로 리디렉션되지 않습니다.
다음 그림은 contoso.com/summer-promotion으로 향하는 요청이 contoso.com/shop/category/5로 리디렉션되는 예를 보여 줍니다. 또한, http 프로토콜을 통해 contoso.com에 대한 두 번째 요청은 https 변형에 대한 새로운 연결을 시작하기 위한 리디렉션으로 반환됩니다.
필수 조건
BYO 배포 전략을 따르는 경우 컨테이너용 Application Gateway 리소스 및 ALB 컨트롤러를 설정했는지 확인합니다.
ALB 관리된 배포 전략을 따르는 경우 ALB 컨트롤러를 프로비전하고 ApplicationLoadBalancer 사용자 지정 리소스를 통해 컨테이너용 Application Gateway 리소스를 프로비전해야 합니다.
샘플 HTTP 애플리케이션을 배포합니다.
클러스터에 다음 deployment.yaml 파일을 적용하여 리디렉션 기능을 보여 주는 샘플 TLS 인증서를 배포합니다.
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
이 명령은 클러스터에 다음을 만듭니다.
test-infra
라는 네임스페이스test-infra
네임스페이스에 있는echo
(이)라는 하나의 서비스test-infra
네임스페이스에 있는echo
(이)라는 하나의 배포test-infra
네임스페이스에 있는listener-tls-secret
이라는 하나의 비밀
필수 게이트웨이 API 리소스 배포
게이트웨이 만들기
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
참고 항목
ALB 컨트롤러는 ARM에서 컨테이너용 Application Gateway 리소스를 만들 때 프런트 엔드 리소스에 fe-<임의로 생성된 문자 8개>와 같은 명명 규칙을 사용합니다.
Azure에서 만들어진 프런트 엔드의 이름을 변경하려면 자체 배포 전략 가져오기를 따르는 것이 좋습니다.
게이트웨이 리소스가 만들어지면 상태가 유효한지, 수신기가 프로그래밍되어 있는지, 주소가 게이트웨이에 할당되어 있는지 확인합니다.
kubectl get gateway gateway-01 -n test-infra -o yaml
게이트웨이가 성공적으로 만들어진 경우의 출력 예제입니다.
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를 통해 수신된 트래픽을 처리하는 HTTPRoute 리소스 contoso.com
를 만듭니다.
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 리소스가 만들어지면 HTTPRoute 리소스가 수락됨 상태이고 컨테이너용 Application Gateway 리소스가 프로그래밍됨 상태인지 확인합니다.
kubectl get httproute rewrite-example -n test-infra -o yaml
각 HTTPRoute에서 컨테이너용 Application Gateway 리소스가 성공적으로 업데이트되었는지 확인합니다.
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
게이트웨이가 만들어지면 http 트래픽을 https로 리디렉션하는 RequestRedirect 필터를 사용하여 HTTPRoute 리소스 contoso.com
를 만듭니다.
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 리소스가 만들어지면 HTTPRoute 리소스가 수락됨 상태이고 컨테이너용 Application Gateway 리소스가 프로그래밍됨 상태인지 확인합니다.
kubectl get httproute rewrite-example -n test-infra -o yaml
각 HTTPRoute에서 컨테이너용 Application Gateway 리소스가 성공적으로 업데이트되었는지 확인합니다.
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
특정 URL에 대한 contoso.com
경로 /summer-promotion에 대한 리디렉션을 처리하는 HTTPRoute 리소스를 만듭니다. http to https HTTPRoute 리소스에 설명된 sectionName을 제거하면 이 리디렉션 규칙이 HTTP 및 HTTPS 요청 모두에 적용됩니다.
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 리소스가 만들어지면 HTTPRoute 리소스가 수락됨 상태이고 컨테이너용 Application Gateway 리소스가 프로그래밍됨 상태인지 확인합니다.
kubectl get httproute rewrite-example -n test-infra -o yaml
각 HTTPRoute에서 컨테이너용 Application Gateway 리소스가 성공적으로 업데이트되었는지 확인합니다.
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
애플리케이션에 대한 액세스 테스트
이제 프런트 엔드에 할당된 FQDN을 통해 샘플 애플리케이션에 일부 트래픽을 전송할 준비가 되었습니다. 다음 명령을 사용하여 FQDN을 가져옵니다.
fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
curl 명령을 사용하여 서버 이름 표시기를 지정하는 경우 http://contoso.com
은 https://contoso.com
에 대한 301 리디렉션을 정의하는 location
헤더와 함께 컨테이너용 Application Gateway에서 응답을 반환해야 합니다.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/ -v
응답을 통해 다음을 확인해야 합니다.
* 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 명령을 사용하여 서버 이름 표시기를 지정하면 https://contoso.com/summer-promotion
컨테이너용 Application Gateway는 https://contoso.com/shop/category/5
로 302 리디렉션을 반환해야 합니다.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:443:$fqdnIp https://contoso.com/summer-promotion -v
응답을 통해 다음을 확인해야 합니다.
> 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
축하합니다. ALB 컨트롤러를 설치하고, 백 엔드 애플리케이션을 배포하고, 게이트웨이 API를 사용하여 HTTP-HTTPS 리디렉션 및 특정 클라이언트 요청에 대한 경로 기반 리디렉션을 모두 구성했습니다.