Share via


Application Gateway for Containers のヘッダーの書き換え - Ingress API

Application Gateway for Containers を使用すると、バックエンド ターゲットからのクライアント要求と応答の HTTP ヘッダーを書き換えることができます。

Usage details

ヘッダーの書き換えでは、Application Gateway for Container の IngressExtension カスタム リソースを利用します。

背景

ヘッダーの書き換えにより、バックエンド ターゲットとの間で要求ヘッダーと応答ヘッダーを変更できます。

次の図は、Application Gateway for Containers によってバックエンド ターゲットに要求が開始されたときに、特定のユーザー エージェントが rewritten-user-agent という簡略化された値に書き換えられる要求の例を示しています。

Application Gateway for Containers によってバックエンドへの要求ヘッダーが書き換えられることを示す図。

前提条件

  1. BYO デプロイ戦略に従う場合は、Application Gateway for Containers リソースと ALB コントローラーを設定していることを確認します

  2. ALB マネージド デプロイ戦略に従う場合は、ALB コントローラーのプロビジョニングと、ApplicationLoadBalancer カスタム リソースを介した Application Gateway for Containers リソースのプロビジョニングが完了していることを確認します。

  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-v1 および backend-v2 と呼ばれる 2 つのサービス
    • test-infra 名前空間の backend-v1 および backend-v2 と呼ばれる 2 つのデプロイ

必要なイングレス 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

Note

ALB コントローラーは、ARM で Application Gateway for Containers リソースを作成するときに、フロントエンド リソースに対して次の名前付け規則を使用します。fe-<ランダムに生成された 8 文字>

Azure で作成されたフロントエンドの名前を変更したい場合は、BYO デプロイ戦略に従うことを検討してください。

イングレス リソースが作成されたら、状態にロード バランサーのホスト名が表示され、どちらのポートも要求をリッスンしていることを確認します。

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 の値を持つ静的 user-agent を設定します。

この例では、値が AGC-valueAGC-Header-Add という新しいヘッダーを追加し、client-custom-header という要求ヘッダーを削除する方法も示します。

ヒント

文字列の一致に "Exact" の HTTPHeaderMatch を使用できますが、さらに機能を説明するために、この例では正規表現のデモンストレーションを使用します。

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

Application Gateway for Containers リソースの状態が正常に更新されたことを確認します。

アプリケーションへのアクセスをテストする

これで、フロントエンドに割り当てられた FQDN を使用して、サンプル アプリケーションにトラフィックを送信する準備ができました。 次のコマンドを実行して、FQDN を取得します。

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

curl コマンドを使用してサーバー名インジケーターを指定し、フロントエンド FQDN に contoso.com を指定した場合、バックエンド 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"
}

user-agent ヘッダーと 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"
}

以下のコマンドで指定されている、値 moo を含んだ client-custom-header ヘッダーは、Application Gateway for Containers からバックエンド サービスへの接続が開始される際には要求から削除されます。

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 コントローラーをインストールし、バックエンド アプリケーションをデプロイし、Application Gateway for Containers の Ingress API 経由でヘッダーの値を変更できました。