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
という簡略化された値に書き換えられる要求の例を示しています。
前提条件
BYO デプロイ戦略に従う場合は、Application Gateway for Containers リソースと ALB コントローラーを設定していることを確認します
ALB マネージド デプロイ戦略に従う場合は、ALB コントローラーのプロビジョニングと、ApplicationLoadBalancer カスタム リソースを介した Application Gateway for Containers リソースのプロビジョニングが完了していることを確認します。
サンプル 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-value
の AGC-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 経由でヘッダーの値を変更できました。