Share via


利用適用於容器的應用程式閘道設定流量分割 - 閘道 API (預覽版)

本文將透過範例,說明如何使用閘道 API 中的下列資源建立應用程式:

  • 閘道 - 使用一個 HTTP 接聽程式建立閘道
  • HTTPRoute - 參考具有不同權數的兩個後端服務,建立 HTTP 路由

背景

透過適用於容器的應用程式閘道,可設定權數,並在不同後端目標之間轉移流量。 請見下列範例案例:

A figure showing traffic splitting with Application Gateway for Containers.

必要條件

重要

適用於容器的應用程式閘道目前為預覽版。
請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。

  1. 如果遵循 BYO 部署策略,請確定已設定了適用於容器的應用程式閘道和 ALB 控制器
  2. 如果遵循 ALB 受控部署策略,請確定已佈建了 ALB 控制器,並且已透過 ApplicationLoadBalancer 自訂資源佈建了適用於容器的應用程式閘道。
  3. 部署範例 HTTP 應用程式 在叢集上套用下列 deployment.yaml 檔案,建立 Web 應用程式範例,以示範流量分割/加權循環配置資源支援。
kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/examples/traffic-split-scenario/deployment.yaml

此指令會在您的叢集上建立下列物件:

  • 名為 test-infra 的命名空間
  • test-infra 命名空間中建立兩個服務,分別名為 backend-v1backend-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
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
EOF

注意

當 ALB 控制器在 ARM 中建立適用於容器的應用程式閘道資源時,ALB 控制器會針對前端資源使用下列命名慣例:fe-<8 個隨機產生的字元>

如果您要變更在 Azure 中建立的前端名稱,請考慮遵循自備部署策略

建立閘道資源之後,請確定狀態有效,接聽程式的狀態為 [已程式化],並且已經將位址指派給閘道。

kubectl get gateway gateway-01 -n test-infra -o yaml

成功建立閘道後輸出內容的範例。

status:
  addresses:
  - type: IPAddress
    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/v1beta1
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 資源之後,請確定路由的狀態為 [已接受],且適用於容器的應用程式閘道資源的狀態為 [已程式化]

kubectl get httproute traffic-split-route -n test-infra -o yaml

確認已成功更新適用於容器的應用程式閘道資源的狀態。

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 執行 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 控制器,部署了後端應用程式,並且在適用於容器的應用程式閘道上設定流量分割/加權循環配置資源。