Share via


使用適用於容器的應用程式閘道的多網站裝載 - 輸入 API (預覽)

本文件可協助您設定可使用輸入 API 的範例應用程式,以示範如何在相同的 Kubernetes 輸入資源/適用於容器的應用程式閘道容器前端上裝載多個網站。 提供步驟,以:

  • 建立具有兩個主機的輸入資源。

背景

適用於容器的應用程式閘道可讓您在相同的連接埠上設定多個 Web 應用程式,以啟用多網站裝載。 您可以使用唯一後端服務來裝載兩個以上 (含) 的唯一網站。 請查看下列範例情節:

A diagram showing multisite hosting with Application Gateway for Containers.

必要條件

重要

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

  1. 如果您遵循 BYO 部署策略,則請確定您已設定適用於容器的應用程式閘道資源和 ALB 控制器
  2. 如果您遵循 ALB 受控部署策略,則請確定透過 ApplicationLoadBalancer 自訂資源來佈建 ALB 控制器和適用於容器的應用程式閘道資源。
  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 的兩個部署

部署必要輸入資源

  1. 建立輸入
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-name: alb-test
    alb.networking.azure.io/alb-namespace: alb-test-infra
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v1
                port:
                  number: 8080
    - host: fabrikam.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v2
                port:
                  number: 8080
EOF

建立輸入資源之後,請確定狀態會顯示負載平衡器的主機名,以及這兩個連接埠正在接聽要求。

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

成功輸入建立的範例輸出。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.networking.azure.io/alb-frontend: FRONTEND_NAME
    alb.networking.azure.io/alb-id: /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"alb.networking.azure.io/alb-frontend":"FRONTEND_NAME","alb.networking.azure.io/alb-id":"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz"},"name"
:"ingress-01","namespace":"test-infra"},"spec":{"ingressClassName":"azure-alb-external","rules":[{"host":"example.com","http":{"paths":[{"backend":{"service":{"name":"echo","port":{"number":80}}},"path":"/","pathType":"Prefix"}]}}],"tls":[{"hosts":["example.com"],"secretName":"listener-tls-secret"}]}}
  creationTimestamp: "2023-07-22T18:02:13Z"
  generation: 2
  name: ingress-01
  namespace: test-infra
  resourceVersion: "278238"
  uid: 17c34774-1d92-413e-85ec-c5a8da45989d
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v1
                port:
                  number: 8080
    - host: fabrikam.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v2
                port:
                  number: 8080
status:
  loadBalancer:
    ingress:
    - hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
      ports:
      - port: 80
        protocol: TCP

測試應用程式的存取權

現在已準備完成,可透過指派給前端的 FQDN 將部分流量傳送至範例應用程式。 使用下列命令來取得 FQDN。

fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'')

接下來,使用 curl 命令來指定伺服器名稱指標,前端 FQDN 的 contoso.com 應該會傳回來自 backend-v1 服務的回應。

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com

透過回應,我們應該會看到:

{
 "path": "/",
 "host": "contoso.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "dcd4bcad-ea43-4fb6-948e-a906380dcd6d"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v1-5b8fd96959-f59mm"
}

接下來,使用 curl 命令來指定伺服器名稱指標,前端 FQDN 的 fabrikam.com 應該會傳回來自 backend-v1 服務的回應。

fqdnIp=$(dig +short $fqdn)
curl -k --resolve fabrikam.com:80:$fqdnIp http://fabrikam.com

透過回應,我們應該會看到:

{
 "path": "/",
 "host": "fabrikam.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "adae8cc1-8030-4d95-9e05-237dd4e3941b"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v2-594bd59865-ppv9w"
}

恭喜,您已在適用於容器的應用程式閘道上搭配使用不同的主機名稱與輸入 API,來安裝 ALB 控制器、部署後端應用程式,並且將流量路由傳送至兩個不同的後端服務。