Share via


Reescritura de encabezados para la Puerta de enlace de aplicaciones para contenedores: API de entrada

Puerta de enlace de aplicaciones para contenedores permite reescribir los encabezados HTTP de las solicitudes de cliente y las respuestas de los destinos de backend.

Detalles de uso

Las reescrituras de encabezado aprovechan el recurso personalizado IngressExtension de la Puerta de enlace de aplicaciones para contenedores

Fondo

Las reescrituras de encabezados permiten modificar los encabezados de solicitud y respuesta hacia y desde los destinos de backend.

En la ilustración siguiente se muestra un ejemplo de una solicitud con un agente de usuario específico que se vuelve a escribir en un valor simplificado denominado rewritten-user-agent cuando la solicitud se inicia en el destino de back-end mediante la Puerta de enlace de aplicaciones para contenedores:

Diagrama que muestra cómo Puerta de enlace de aplicaciones para contenedores reescribe un encabezado de solicitud al back-end.

Requisitos previos

  1. Si sigue la estrategia de implementación BYO, asegúrese de configurar los recursos de puerta de enlace de aplicaciones para contenedores y el controlador de ALB.

  2. Si sigue la estrategia de implementación administrada de ALB, asegúrese de que ha aprovisionado el controlador ALB y los recursos de puerta de enlace de aplicaciones para contenedores a través del recurso personalizado ApplicationLoadBalancer.

  3. Implementar aplicación HTTP de ejemplo: aplique el siguiente archivo deployment.yaml en el clúster para crear una aplicación web de ejemplo para mostrar la reescritura de encabezado.

    kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/examples/traffic-split-scenario/deployment.yaml
    

    Este comando crea lo siguiente en el clúster:

    • un espacio de nombres denominado test-infra
    • dos servicios llamados backend-v1 y backend-v2 en el espacio de nombres test-infra
    • dos implementaciones llamadas backend-v1 y backend-v2 en el espacio de nombres test-infra

Implementación de los recursos necesarios de la API de entrada

Cree un recurso de entrada para escuchar las solicitudes a 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

Nota:

Cuando el controlador de ALB cree los recursos de Puerta de enlace de aplicaciones para contenedores en ARM, usará las siguientes convenciones de nomenclatura para un recurso de frontend: fe-<8 caracteres generados aleatoriamente>

Si desea cambiar el nombre del frontend creado en Azure, considere la posibilidad de seguir la estrategia Traiga su propia implementación.

Una vez creado el recurso de entrada, asegúrese de que el estado muestra el nombre de host del equilibrador de carga y que ambos puertos escuchan solicitudes.

kubectl get ingress ingress-01 -n test-infra -o yaml

Salida de ejemplo de creación correcta de entrada.

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

Una vez creada la entrada, es necesario definir una ingressExtension con las reglas de reescritura del encabezado.

En este ejemplo, se establece un agente de usuario estático con un valor de rewritten-user-agent.

En este ejemplo, también se muestra la adición de un nuevo encabezado llamado AGC-Header-Add con un valor de AGC-value y se quita un encabezado de solicitud llamado client-custom-header.

Sugerencia

En este ejemplo, aunque podemos usar el valor "Exact" de HTTPHeaderMatch para una coincidencia de cadena, se usa una demostración en la expresión regular para ilustrar funcionalidades adicionales.

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

Una vez creado el recurso IngressExtension, asegúrese de que el recurso no devuelve errores de validación y es válido.

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

Compruebe que el estado del recurso de Puerta de enlace de aplicaciones para contenedores se haya actualizado correctamente.

Prueba de acceso a la aplicación

Ahora, estamos listos para enviar tráfico a nuestra aplicación de ejemplo mediante el FQDN asignado al frontend. Utilice el siguiente comando para obtener el FQDN.

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

Si especifica el indicador de nombre del servidor mediante el comando curl, contoso.com para el FQDN de la interfaz, se devuelve una respuesta del servicio backend-v1.

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

Mediante la respuesta deberíamos ver:

{
 "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"
}

Especificar un encabezado de agente de usuario con el valor my-user-agent debe devolver una respuesta del servicio backend de rewritten-user-agent:

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

Mediante la respuesta deberíamos ver:

{
 "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 especificación de un encabezado client-custom-header con el valor moo, debe eliminarse de la solicitud cuando Puerta de enlace de aplicaciones para contenedores inicia la conexión con el servicio de back-end:

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

Mediante la respuesta deberíamos ver:

{
 "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"
}

Enhorabuena, ha instalado el controlador de ALB, ha implementado una aplicación de backend y ha modificado los valores del encabezado mediante la API de entrada en Puerta de enlace de aplicaciones para contenedores.