4

My use case is to remove query parameters from the path so the envoy ISTIO filter can filter on the basis of just APIs. I am using the below configuration it is a filtering route but also takes query parameters in the path not truncating it.

The ratelimiter service on its part does not detect any special configuration for the descriptor ("PATH", "/foo?param=value") and therfore use the default of key "PATH".

any idea why truncating regex is not working? Thanks

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: {{ template "name" . }}-httpfilter
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      istio: ingressgateway
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: GATEWAY
      listener:
          filterChain:
            filter:
              name: "envoy.filters.network.http_connection_manager"
              subFilter:
                name: "envoy.filters.http.router"
    patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.filters.http.header_to_metadata
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.header_to_metadata.v3.Config
            request_rules:
            - header: ':path'
              on_header_present:
                # use an arbitary name for the namespace
                # will be used later to extract descriptor value
                metadata_namespace: qry-filter
                # use an arbitary key for the metadata
                # will be used later to extract descriptor value
                key: uri
                regex_value_rewrite:
                  pattern:
                    # regex matcher
                    # truncates parameters from path
                    regex: '^(\/[\/\d\w-]+)\??.*$'
                  substitution: '\\1'
  - applyTo: HTTP_FILTER
    match:
      context: GATEWAY
      listener:
          filterChain:
            filter:
              name: 'envoy.filters.network.http_connection_manager'
              subFilter:
                name: 'envoy.filters.http.router'
    patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.filters.http.ratelimit
          typed_config:
            '@type': type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit
            # ensure the domain matches with the domain used in the ratelimit service config
            domain: {{ template "fullname" . }}-ratelimit
            failure_mode_deny: true
            rate_limit_service:
              grpc_service:
                envoy_grpc:
                  # must match load_assignment.cluster_name from the patch to the CLUSTER above
                  cluster_name: rate_limit_cluster
                timeout: 10s
              transport_api_version: V3
  - applyTo: CLUSTER
    match:
      cluster:
        # kubernetes dns of your ratelimit service
        service: ratelimit.{{ .Values.openapi.destinationSuffix }}
    patch:
      operation: ADD
      value:
        name: rate_limit_cluster
        type: STRICT_DNS
        connect_timeout: 10s
        lb_policy: ROUND_ROBIN
        http2_protocol_options: {}
        load_assignment:
          # arbitrary  name
          cluster_name: rate_limit_cluster
          endpoints:
          - lb_endpoints:
            - endpoint:
                address:
                  socket_address:
                    # kubernetes dns of your ratelimit service
                    address: ratelimit.{{ .Values.openapi.destinationSuffix }}
                    port_value: 8081


apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: {{ template "name" . }}-virtualhost
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      istio: ingressgateway
  configPatches:
    - applyTo: VIRTUAL_HOST
      match:
        context: GATEWAY
        routeConfiguration:
          vhost:
            name: ""
            route:
              action: ANY
      patch:
        operation: MERGE
        value:
          rate_limits:
          - actions: # any actions in here
              - dynamic_metadata:
                  descriptor_key: PATH
                  metadata_key:
                    key: qry-filter
                    path:
                    - key: uri

apiVersion: v1
kind: ConfigMap
metadata:
  name: ratelimit-config
data:
  config.yaml: |
    domain: {{ template "fullname" . }}-ratelimit
    descriptors:
      - key: PATH
        rate_limit:
          unit: minute
          requests_per_unit: 10
NecessaryDevil
  • 105
  • 1
  • 10

0 Answers0