Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Personnaliser les en-têtes de requête et de réponse à l'aide du CRD EnvoyFilter

Dernière mise à jour :Aug 11, 2026

Vous pouvez personnaliser les en-têtes de requête et de réponse en utilisant le CustomResourceDefinition (CRD) EnvoyFilter. Le CRD EnvoyFilter vous permet de modifier directement la configuration d'un proxy Istio (Envoy). Ainsi, vous pouvez ajouter, supprimer ou modifier les en-têtes de requête ou de réponse lorsqu'une requête ou une réponse traverse le proxy.

Prérequis

L'application HTTPBin est déployée. Pour plus d'informations, consultez Déployer l'application HTTPBin.

Étape 1 : Définir un modèle de filtre Envoy

ASM vous permet de créer un filtre Envoy à l'aide d'un modèle de filtre Envoy. Un même modèle de filtre Envoy peut servir à créer plusieurs filtres Envoy, applicables à différentes charges de travail et namespaces. Cette approche rend les configurations réutilisables et améliore l'efficacité de la gestion.

Le code YAML ci-dessous présente un exemple de modèle de filtre Envoy. Pour plus d'informations, consultez Envoy Filter.

Développer pour afficher le code YAML d'un modèle de filtre Envoy

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: custom-header-filter
  namespace: my-namespace
spec:
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: SIDECAR_INBOUND
        listener:
          filterChain:
            filter:
              name: envoy.filters.network.http_connection_manager
              subFilter:
                name: envoy.filters.http.router
        proxy:
          proxyVersion: ^1\.20.*
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.lua
          typed_config:
            '@type': type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
            inlineCode: |
              function envoy_on_request(request_handle)
                -- Obtain a header key and a value from the request header. 
                local header_key = "x-custom-request-header" -- The key of the request header you want to obtain. 
                local header_value = request_handle:headers():get(header_key)
                if header_value then
                  -- Write data to Otel Baggage.
                  local baggage = header_key .. "=" .. header_value
                  request_handle:headers():add("baggage", baggage)
                  request_handle:streamInfo():dynamicMetadata():set("envoy.filters.http.lua", "otel.baggage", baggage)
                end
              end

              function envoy_on_response(response_handle)
                -- Obtain the Otel Baggage from the dynamic metadata. 
                local metadata = response_handle:streamInfo():dynamicMetadata():get("envoy.filters.http.lua") or {}
                local baggage = metadata["otel.baggage"]
                if baggage then
                  -- Write the Otel Baggage to another header. 
                  local new_header_key = "x-custom-response-header" -- The key of the new response header. 
                  response_handle:headers():add(new_header_key, baggage)
                end
              end
  workloadSelector:
    labels:
      app: httpbin
      version: v1
  • Si vous utilisez Istio 1.9 ou une version ultérieure, remplacez la valeur du champ proxyVersion par la version d'Istio.

  • Si vous utilisez Istio 1.8 ou une version antérieure, remplacez la valeur du champ proxyVersion par la version d'Istio. De plus, dans le code YAML précédent, remplacez envoy.filters.network.http_connection_manager par envoy.http_connection_manager, envoy.filters.http.router par envoy.router, et type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua par type.googleapis.com/envoy.config.filter.http.lua.v2.Lua.

Étape 2 : Créer un filtre Envoy à l'aide du modèle de filtre Envoy

Après avoir créé un modèle de filtre Envoy, vous devez lier ce modèle aux charges de travail ou aux namespaces. Les filtres Envoy créés à partir de ce modèle s'appliqueront uniquement aux charges de travail ou aux namespaces spécifiés. Une fois la liaison établie, ASM crée automatiquement les filtres Envoy en se basant sur le modèle.

Le filtre Envoy créé ajoute un en-tête de requête personnalisé à toute requête entrante vers la charge de travail, ainsi qu'un en-tête de réponse personnalisé à toute réponse sortante. L'exemple suivant crée un filtre Envoy nommé custom-header-filter et configure un filtre Lua pour ajouter des en-têtes de requête et de réponse. Ce filtre Envoy s'applique à toutes les charges de travail portant le libellé app: my-app.

Développer pour afficher le code YAML d'un filtre Envoy

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: custom-header-filter
  namespace: my-namespace
spec:
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: SIDECAR_INBOUND
        listener:
          filterChain:
            filter:
              name: envoy.filters.network.http_connection_manager
              subFilter:
                name: envoy.filters.http.router
        proxy:
          proxyVersion: ^1\.20.*
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.lua
          typed_config:
            '@type': type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
            inlineCode: |
              function envoy_on_request(request_handle)
                -- Obtain a header key and a value from the request header.
                local header_key = "x-custom-request-header" -- the key of the request header you want to obtain. 
                local header_value = request_handle:headers():get(header_key)
                if header_value then
                  -- Write data to Otel Baggage. 
                  local baggage = header_key .. "=" .. header_value
                  request_handle:headers():add("baggage", baggage)
                  request_handle:streamInfo():dynamicMetadata():set("envoy.filters.http.lua", "otel.baggage", baggage)
                end
              end

              function envoy_on_response(response_handle)
                -- Obtain the Otel Baggage from the dynamic metadata. 
                local metadata = response_handle:streamInfo():dynamicMetadata():get("envoy.filters.http.lua") or {}
                local baggage = metadata["otel.baggage"]
                if baggage then
                  -- Write the Otel Baggage to another header. 
                  local new_header_key = "x-custom-response-header" -- The key of the new response header. 
                  response_handle:headers():add(new_header_key, baggage)
                end
              end
  workloadSelector:
    labels:
      app: httpbin
      version: v1
Important

EnvoyFilter constitue une méthode de configuration puissante mais complexe, car elle modifie directement les configurations sous-jacentes d'Envoy. Nous vous recommandons donc de bien maîtriser le modèle de configuration d'Envoy avant d'utiliser EnvoyFilter, et d'agir avec prudence afin d'éviter toute erreur potentielle. Par ailleurs, la configuration d'EnvoyFilter peut évoluer lors des mises à niveau des versions d'Istio ; veillez à respecter la compatibilité.

Étape 3 : Afficher les en-têtes de requête et de réponse personnalisés dans les journaux d'accès

ASM vous permet de personnaliser les formats de journalisation. Les expressions personnalisées des journaux d'accès peuvent extraire des valeurs issues des en-têtes de requête, des en-têtes de réponse et des valeurs intégrées d'Envoy. Pour plus d'informations, consultez Personnaliser le format des journaux d'accès.

Le tableau ci-dessous répertorie trois nouveaux champs utilisés pour afficher le contenu dans les journaux d'accès.

Champ

Type

Valeur

my-x-custom-request-header

Attribut de requête

%REQ(x-custom-request-header)%

baggage-from-request

Attribut de requête

%REQ(baggage)%

my-x-custom-response-header

Attribut de réponse

%RESP(x-custom-response-header)%

Consultez les journaux d'accès du pod HTTPBin ; vous devriez observer un contenu similaire à celui-ci :

{
    "bytes_received": "0",
    "bytes_sent": "490",
    "duration": "1",
    "istio_policy_status": "-",
    "method": "GET",
    "path": "/headers",
    "protocol": "HTTP/1.1",
    "response_code": "200",
    "response_flags": "-",
    "my-x-custom-request-header": "xxx",
    "baggage-from-request": "x-custom-request-header=xxx",
    "my-x-custom-response-header": "x-custom-request-header=xxx",
}