Réécriture d’en-tête pour Passerelle d’application pour conteneurs – API d’entrée
Passerelle d’application pour conteneurs vous permet de réécrire les en-têtes HTTP des requêtes et réponses du client à partir de cibles back-end.
Usage details
Les réécritures d’en-tête tirent parti de la ressource personnalisée IngressExtension de Passerelle d’application pour conteneurs.
Background
Les réécritures d’en-tête vous permettent de modifier les en-têtes de requête et de réponse vers et à partir de vos cibles back-end.
La figure suivante illustre un exemple de réécriture d’une requête avec un agent utilisateur spécifique en une valeur simplifiée nommée rewritten-user-agent
lorsque la requête est lancée sur la cible back-end par Passerelle d’application pour conteneurs :
Prérequis
Si vous suivez la stratégie de déploiement BYO, vérifiez que vous avez configuré vos ressources Passerelle d’application pour conteneurs et le contrôleur ALB
Si vous suivez la stratégie de déploiement managé ALB, vérifiez que vous avez provisionné votre contrôleur ALB ainsi que les ressources Passerelle d’application pour conteneurs via la ressource personnalisée ApplicationLoadBalancer.
Déployer un exemple d’application HTTP Appliquez le fichier deployment.yaml suivant sur votre cluster pour créer un exemple d’application web afin d’illustrer la réécriture d’en-tête.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Cette commande crée les éléments suivants sur votre cluster :
- un espace de noms nommé
test-infra
- deux services nommés
backend-v1
etbackend-v2
dans l’espace de nomstest-infra
- deux déploiements appelés
backend-v1
etbackend-v2
dans l’espace de nomstest-infra
- un espace de noms nommé
Déployer les ressources d’API d’entrée requises
Créez une ressource d’entrée pour écouter les requêtes à 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
Remarque
Lorsque le contrôleur ALB crée les ressources Passerelle d’application pour conteneurs dans ARM, il utilise la convention de dénomination suivante pour une ressource front-end : fe-<8 caractères générés aléatoirement>
Si vous souhaitez modifier le nom du front-end créé dans Azure, il peut être préférable de suivre la stratégie de déploiement BYO.
Une fois la ressource d’entrée créée, vérifiez que l’état indique le nom d’hôte de votre équilibreur de charge et que les deux ports écoutent les requêtes.
kubectl get ingress ingress-01 -n test-infra -o yaml
Exemple de sortie de création d’entrée réussie.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.networking.azure.io/alb-frontend: FRONTEND_NAME
alb.networking.azure.io/alb-id: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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
Une fois l’entrée créée, nous devons ensuite définir une ingressExtension avec les règles de réécriture d’en-tête.
Dans cet exemple, nous définissons un agent utilisateur statique avec la valeur rewritten-user-agent
.
Cet exemple illustre également l’ajout d’un nouvel en-tête nommé AGC-Header-Add
avec une valeur AGC-value
, et supprime un en-tête de requête nommé client-custom-header
.
Conseil
Pour cet exemple, bien que nous puissions utiliser le HTTPHeaderMatch « Exact » pour une correspondance de chaîne, une démonstration est utilisée dans l’expression régulière à des fins d’illustration de capacités supplémentaires.
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
Une fois que la ressource IngressExtension est créée, vérifiez qu’elle retourne Aucune erreur de validation et qu’elle est valide.
kubectl get IngressExtension header-rewrite -n test-infra -o yaml
Vérifiez que l’état de la ressource Passerelle d’application pour conteneurs a été correctement mis à jour.
Tester l’accès à l’application
Nous sommes maintenant prêts à envoyer du trafic à notre exemple d’application, via le nom de domaine complet affecté au front-end. Utilisez la commande suivante pour obtenir le nom de domaine complet.
fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Si vous spécifiez l’indicateur de nom de serveur à l’aide de la commande curl, contoso.com
pour le nom de domaine complet du front-end, une réponse du service back-end-v1 est retournée.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Par le biais de la réponse, nous devrions voir :
{
"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"
}
La spécification d’un en-tête d’agent utilisateur avec la valeur my-user-agent
doit retourner une réponse rewritten-user-agent
du service back-end :
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "user-agent: my-user-agent"
Par le biais de la réponse, nous devrions voir :
{
"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"
}
La spécification d’un en-tête client-custom-header
avec la valeur moo
doit être supprimée de la requête quand Passerelle d'application pour conteneurs lance la connexion au service back-end :
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "client-custom-header: moo"
Par le biais de la réponse, nous devrions voir :
{
"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"
}
Félicitations, vous avez installé le contrôleur ALB, déployé une application back-end et modifié des valeurs d’en-tête via l’API d’entrée sur la Passerelle d’application pour conteneurs.