Share via


適用於容器的 Azure 應用程式閘道標頭重寫 - 輸入 API

適用於容器的應用程式閘道可用於重寫來自後端目標的用戶端要求和回應的 HTTP 標頭。

使用方式詳細資料

標頭重寫會利用適用於容器的應用程式閘道的 IngressExtension 自訂資源。

背景

透過標頭重寫,您可以修改往返於後端目標的要求和回應標頭。

下圖示範當適用於容器的應用程式閘道向後端目標發起要求時,特定使用者代理程式的要求重寫為 rewritten-user-agent 的簡化值:

顯示容器將要求標頭重寫至後端之 應用程式閘道 的圖表。

必要條件

  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

部署必要的輸入 API 資源

建立輸入資源以接聽針對 contoso.com 的要求:

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
    alb.networking.azure.io/alb-ingress-extension: header-rewrite
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v1
                port:
                  number: 8080
EOF

注意

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

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

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

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", "alb.networking.azure.io/alb-ingress-extension":"header-rewrite"},"name"
:"ingress-01","namespace":"test-infra"},"spec":{"ingressClassName":"azure-alb-external","rules":[{"host":"contoso.com","http":{"paths":[{"backend":{"service":{"name":"backend-v1","port":{"number":8080}}},"path":"/","pathType":"Prefix"}]}}]}}
  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
status:
  loadBalancer:
    ingress:
    - hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
      ports:
      - port: 80
        protocol: TCP

建立輸入之後,接下來我們需要使用標頭重寫規則來定義 IngressExtension。

在此範例中,我們將靜態使用者代理程式設定為 rewritten-user-agent 值。

此範例還演示了如何新增一個名為 AGC-Header-Add、值為 AGC-value 的新標頭並移除名為 client-custom-header 的要求標頭。

提示

在此範例中,雖然我們可以使用 HTTPHeaderMatch 的 "Exact" 參數進行字符串比對,但為了展示其他功能,我們以規則運算式進行演示。

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: IngressExtension
metadata:
  name: header-rewrite
  namespace: test-infra
spec:
  rules:
    - host: contoso.com
      rewrites:
        - type: RequestHeaderModifier
          requestHeaderModifier:
            set:
              - name: "user-agent"
                value: "rewritten-user-agent"
            add:
              - name: "AGC-Header-Add"
                value: "AGC-value"
            remove:
              - "client-custom-header"
EOF

建立 IngressExtension 資源之後,請確定資源不會傳回 驗證錯誤 且有效。

kubectl get IngressExtension header-rewrite -n test-infra -o yaml

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

測試應用程式的存取權

現在我們已準備好將一些流量透過指派給前端的 FQDN 傳送至範例應用程式。 使用下列命令來取得 FQDN。

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

如果使用 curl 命令 contoso.com 指定伺服器名稱指標,則對於前端 FQDN,會傳回來自 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"
}

若為使用者代理程式標頭指定 my-user-agent 值,則應從後端服務傳回回應 rewritten-user-agent

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

透過回應,應能看到下列內容:

{
 "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-v1-5b8fd96959-f59mm"
}

client-custom-header當容器的 應用程式閘道 起始後端服務的連線時,應從要求中移除具有 值的moo標頭:

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "client-custom-header: moo"

透過回應,應能看到下列內容:

{
 "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": [
   "kd83nc84-4325-5d22-3d23-237dd4e3941b"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v1-5b8fd96959-f59mm"
}

恭喜您,您已在容器的 應用程式閘道 上安裝 ALB 控制器、部署後端應用程式和修改標頭值。