Azure Application Gateway for Containers のヘッダーの書き換え - Gateway API
Application Gateway for Containers を使用すると、バックエンド ターゲットからのクライアント要求とクライアント応答の HTTP ヘッダーを書き換えることができます。
Usage details
ヘッダーの書き換えでは、Kubernetes Gateway API で定義されるフィルターを利用します。
背景
ヘッダーの書き換えを行うと、バックエンド ターゲットとの間で要求ヘッダーと応答ヘッダーを変更できます。
次の図は、Application Gateway for Containers によってバックエンド ターゲットに要求が開始されたときに、特定のユーザー エージェントが SearchEngine-BingBot という簡略化された値に書き換えられる要求の例を示しています。
前提条件
BYO デプロイ戦略に従う場合は、Application Gateway for Containers リソースと ALB コントローラーを設定していることを確認します
ALB マネージド デプロイ戦略に従う場合は、ApplicationLoadBalancer カスタム リソースを介して ALB コントローラーと Application Gateway for Containers リソースのプロビジョニングが完了していることを確認します。
サンプル HTTP アプリケーションをデプロイします。クラスターに次の deployment.yaml ファイルを適用して、ヘッダーの書き換えのデモンストレーションを行うためのサンプル Web アプリケーションを作成します。
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
と呼ばれる名前空間test-infra
名前空間のbackend-v1
およびbackend-v2
と呼ばれる 2 つのサービスtest-infra
名前空間のbackend-v1
およびbackend-v2
と呼ばれる 2 つのデプロイ
必要な Gateway 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-listener
port: 80
protocol: HTTP
allowedRoutes:
namespaces:
from: Same
EOF
Note
ALB コントローラーは、ARM で Application Gateway for Containers リソースを作成するときに、フロントエンド リソースに対して次の名前付け規則を使用します。fe-<ランダムに生成された 8 文字>
Azure で作成されたフロントエンドの名前を変更したい場合は、BYO デプロイ戦略に従うことを検討してください。
ゲートウェイ リソースが作成されたら、状態が有効であること、リスナーが [プログラム済み] であること、ゲートウェイにアドレスが割り当てられていることを確認します。
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: https-listener
supportedKinds:
- group: gateway.networking.k8s.io
kind: HTTPRoute
ゲートウェイが作成されたら、ホスト名の contoso.com をリッスンし、user-agent の値を SearchEngine-BingBot にオーバーライドする HTTPRoute を作成します。
この例では、Bing 検索エンジンが使用するユーザー エージェントを検索し、バックエンドの解析を容易にするために SearchEngine-BingBot へのヘッダーを簡略化します。
この例では、値が AGC-value
の AGC-Header-Add
という新しいヘッダーを追加し、client-custom-header
という要求ヘッダーを削除する方法も示します。
ヒント
文字列の一致に "Exact" の HTTPHeaderMatch を使用できますが、さらに機能を説明するために、この例では正規表現のデモンストレーションを使用します。
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: header-rewrite-route
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
namespace: test-infra
hostnames:
- "contoso.com"
rules:
- matches:
- headers:
- name: user-agent
value: Mozilla/5\.0 AppleWebKit/537\.36 \(KHTML, like Gecko; compatible; bingbot/2\.0; \+http://www\.bing\.com/bingbot\.htm\) Chrome/
type: RegularExpression
filters:
- type: RequestHeaderModifier
requestHeaderModifier:
set:
- name: user-agent
value: SearchEngine-BingBot
add:
- name: AGC-Header-Add
value: AGC-value
remove: ["client-custom-header"]
backendRefs:
- name: backend-v2
port: 8080
- backendRefs:
- name: backend-v1
port: 8080
EOF
HTTPRoute リソースが作成されたら、ルートが [承認済み] になり、Application Gateway for Containers リソースが [プログラム済み] になっていることを確認します。
kubectl get httproute header-rewrite-route -n test-infra -o yaml
Application Gateway for Containers リソースの状態が正常に更新されたことを確認します。
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 に 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 ヘッダーに `` の値を指定すると、SearchEngine-BingBot のバックエンド サービスから応答が返されるはずです。
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "user-agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/"
応答を介して、次の内容が表示されます。
{
"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-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-v2-5b8fd96959-f59mm"
}
これで、ALB コントローラーをインストールし、バックエンド アプリケーションをデプロイし、Application Gateway for Containers の Gateway API 経由でヘッダーの値を変更できました。