다음을 통해 공유


컨테이너용 Application Gateway를 사용하여 트래픽 분할 - 게이트웨이 API

이 문서는 게이트웨이 API의 다음 리소스를 사용하는 예 애플리케이션을 설정하는 데 도움이 됩니다.

  • 게이트웨이 - 하나의 http 수신기로 게이트웨이 만들기
  • HTTPRoute - 서로 다른 가중치를 갖는 두 개의 백 엔드 서비스를 참조하는 HTTP 경로 만들기

배경

컨테이너용 Application Gateway를 사용하면 가중치를 설정하고 다양한 백 엔드 대상 간에 트래픽을 이동할 수 있습니다. 다음과 같은 예제 시나리오를 참조하세요.

A figure showing traffic splitting with Application Gateway for Containers.

필수 조건

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

  2. ALB 관리된 배포 전략을 따르는 경우 ALB 컨트롤러를 프로비전하고 ApplicationLoadBalancer 사용자 지정 리소스를 통해 컨테이너용 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
    • 네임스페이스에 호출 backend-v1test-infra backend-v2 두 서비스
    • 네임스페이스에 호출 backend-v1test-infra backend-v2 두 개의 배포

필수 게이트웨이 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
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
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: gateway-01-http
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

게이트웨이가 만들어지면 HTTPRoute를 만듭니다.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: traffic-split-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  rules:
  - backendRefs:
    - name: backend-v1
      port: 8080
      weight: 50
    - name: backend-v2
      port: 8080
      weight: 50
EOF

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

kubectl get httproute traffic-split-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}')

이 FQDN을 컬링하면 HTTPRoute에 구성된 대로 백 엔드/Pod의 응답이 반환되어야 합니다.

# this curl command will return 50% of the responses from backend-v1
# and the remaining 50% of the responses from backend-v2
watch -n 1 curl http://$fqdn

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