다음을 통해 공유


컨테이너용 Application Gateway를 사용하여 경로, 헤더 및 쿼리 문자열 라우팅 - 게이트웨이 API

이 문서는 게이트웨이 API의 리소스를 사용하여 URL 경로, 쿼리 문자열 및 헤더를 기반으로 트래픽 라우팅을 보여 주는 예제 애플리케이션을 설정하는 데 도움이 됩니다. 다음 단계가 제공됩니다.

  • 하나의 HTTPS 수신기를 사용하여 게이트웨이 리소스를 만듭니다.
  • 백 엔드 서비스를 참조하는 HTTPRoute 리소스를 만듭니다.
  • HTTPRouteMatch를 사용하여 경로, 헤더 및 쿼리 문자열을 기반으로 해당 경로를 수행 matches 합니다.

배경

Application Gateway for Containers는 URL 경로, 쿼리 문자열 및 헤더를 기반으로 트래픽 라우팅을 사용하도록 설정합니다. 다음 예제 시나리오를 참조하세요.

컨테이너용 Application Gateway를 사용한 경로, 헤더 및 쿼리 문자열 라우팅을 보여 주는 그림입니다.

필수 조건

  1. BYO 배포 전략을 따르는 경우 컨테이너 리소스 및 ALB 컨트롤러에 대한 Application Gateway를 설정했는지 확인합니다.

  2. ALB 관리 배포 전략을 따르는 경우 ApplicationLoadBalancer 사용자 지정 리소스를 통해 ALB 컨트롤러를 프로비전하고 컨테이너용 Application Gateway 리소스를 프로비전했는지 확인합니다.

  3. 샘플 HTTP 애플리케이션 배포 클러스터에 다음 deployment.yaml 파일을 적용하여 경로, 쿼리 및 헤더 기반 라우팅을 보여 주는 샘플 웹 애플리케이션을 만듭니다.

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
    

    이 명령은 클러스터에 다음을 만듭니다.

    • 호출된 네임스페이스 test-infra
    • 네임스페이스 test-infra에서 두 개의 서비스인 backend-v1, backend-v2
    • test-infra 네임스페이스에 backend-v1backend-v2 라 불리는 두 개의 배포

필요한 게이트웨이 API 리소스 배포

게이트웨이 만들기:

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
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
EOF

비고

ALB 컨트롤러는 Azure Resource Manager에서 컨테이너용 Application Gateway 리소스를 만들 때 프런트 엔드 리소스 fe-<eight randomly generated characters>에 대해 다음 명명 규칙을 사용합니다.

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

게이트웨이가 만들어지면 HTTPRoute를 만들어 서로 다른 두 일치 항목과 트래픽을 라우팅할 기본 서비스를 정의합니다.

다음 규칙을 읽는 방법은 다음과 같습니다.

  1. 경로가 /bar인 경우 트래픽은 포트 8080 OR의 backend-v2 서비스로 라우팅됩니다.
  2. 요청에 이름이 magic이고 값이 foo인 HTTP 헤더가 포함되어 있으며, URL에 이름이 great이고 값이 example인 쿼리 문자열이 포함되고, 경로가 /some/thing인 경우, 요청은 포트 8080의 backend-v2로 전송됩니다.
  3. 그렇지 않으면 다른 모든 요청은 포트 8080에서 backend-v1 서비스로 라우팅됩니다.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: http-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    namespace: test-infra
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /bar
    backendRefs:
    - name: backend-v2
      port: 8080
  - matches:
    - headers:
      - type: Exact
        name: magic
        value: foo
      queryParams:
      - type: Exact
        name: great
        value: example
      path:
        type: PathPrefix
        value: /some/thing
      method: GET
    backendRefs:
    - name: backend-v2
      port: 8080
  - backendRefs:
    - name: backend-v1
      port: 8080
EOF

팁 (조언)

Application Gateway for Containers는 headers, queryParams, path 규칙에 대한 정규식 일치를 RE2(정규식 2) 구문을 사용하여 지원합니다. 자세한 내용은 게이트웨이 API 사양에서 찾을 수 있습니다.

HTTPRoute 리소스가 만들어지면 경로가 수락 되었고 컨테이너용 Application Gateway 리소스가 프로그래밍되었는지 확인합니다.

kubectl get httproute http-route -n test-infra -o yaml

컨테이너용 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://frontend-fqdn/bar 클라이언트 요청은 backend-v2 서비스로 라우팅됩니다.

다음 명령을 실행합니다.

curl http://$fqdn/bar

요청을 제공하는 컨테이너는 backend-v2입니다.

쿼리 문자열 + 헤더 + 경로 라우팅

이 시나리오에서는 "magic: foo"의 헤더 키/값 부분으로 전송 http://frontend-fqdn/some/thing?great=example 된 클라이언트 요청이 backend-v2 서비스로 라우팅됩니다.

다음 명령을 실행합니다.

curl http://$fqdn/some/thing?great=example -H "magic: foo"

요청을 제공하는 컨테이너는 backend-v2입니다.

기본 경로

처음 두 시나리오 중 어느 것도 충족되지 않는 경우 컨테이너용 Application Gateway는 다른 모든 요청을 backend-v1 서비스로 라우팅합니다.

다음 명령을 실행합니다.

curl http://$fqdn/

요청을 제공하는 컨테이너는 backend-v1입니다.

축하합니다. ALB 컨트롤러를 설치하고, 백 엔드 애플리케이션을 배포하고, 컨테이너용 Application Gateway의 게이트웨이 API를 통해 애플리케이션으로 트래픽을 라우팅했습니다.