How to use kafka broker filtering at envoy?

48 Views Asked by At

I'm deploying a 3 replica Kafka using a Envoy proxy as a gateway in a VM environment (Ubuntu 22.04 LTS). The replicated Kafka works fine, but now I am trying to deploy the envoy using this documentation: https://www.envoyproxy.io/docs/envoy/latest/configuration/listeners/network_filters/kafka_broker_filter

This is the config.yaml result for my use case:

static_resources:
  listeners:
    - address:
        socket_address:
          address: xxx.xxx.xxx.xxx
          port_value: 10000
      filter_chains:
      - filters:
        - name: envoy.filters.network.kafka_broker
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.network.kafka_broker.v3.KafkaBroker
            stat_prefix: exampleprefix1
            id_based_broker_address_rewrite_spec:
              rules:
              - id: 1
                host: xxx.xxx.xxx.xxx
                port: 9092
              - id: 2
                host: yyy.yyy.yyy.yyy
                port: 9092
              - id: 3
                host: zzz.zzz.zzz.zzz
                port: 9092
        - name: envoy.filters.network.tcp_proxy
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
            stat_prefix: tcp
            cluster: broker_1

    - address:
        socket_address:
          address: yyy.yyy.yyy.yyy
          port_value: 9092
      filter_chains:
      - filters:
        - name: envoy.filters.network.kafka_broker
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.network.kafka_broker.v3.KafkaBroker
            stat_prefix: exampleprefix2
            id_based_broker_address_rewrite_spec:
              rules:
              - id: 1
                host: xxx.xxx.xxx.xxx
                port: 9092
              - id: 2
                host: yyy.yyy.yyy.yyy
                port: 9092
              - id: 3
                host: zzz.zzz.zzz.zzz
                port: 9092
        - name: envoy.filters.network.tcp_proxy
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
            stat_prefix: tcp
            cluster: broker_2

    - address:
        socket_address:
          address: zzz.zzz.zzz.zzz
          port_value: 9092
      filter_chains:
      - filters:
        - name: envoy.filters.network.kafka_broker
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.network.kafka_broker.v3.KafkaBroker
            stat_prefix: exampleprefix2
            id_based_broker_address_rewrite_spec:
              rules:
              - id: 1
                host: xxx.xxx.xxx.xxx
                port: 9092
              - id: 2
                host: yyy.yyy.yyy.yyy
                port: 9092
              - id: 3
                host: zzz.zzz.zzz.zzz
                port: 9092
        - name: envoy.filters.network.tcp_proxy
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
            stat_prefix: tcp
            cluster: broker_3

  clusters:
    - name: broker_1
      connect_timeout: 0.25s
      type: STATIC
      lb_policy: ROUND_ROBIN
      load_assignment:
        cluster_name: kafka_cluster
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      address: xxx.xxx.xxx.xxx
                      port_value: 9092

    - name: broker_2
      connect_timeout: 0.25s
      type: STATIC
      lb_policy: ROUND_ROBIN
      load_assignment:
        cluster_name: kafka_cluster
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      address: yyy.yyy.yyy.yyy
                      port_value: 9092

    - name: broker_3
      connect_timeout: 0.25s
      type: STATIC
      lb_policy: ROUND_ROBIN
      load_assignment:
        cluster_name: kafka_cluster
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      address: zzz.zzz.zzz.zzz
                      port_value: 9092

admin:
  access_log_path: /dev/null
  profile_path: /dev/null
  address:
    socket_address: { address: 127.0.0.1, port_value: 9901 }

This is the received error:

[2024-03-03 14:01:46.442][587067][info][main] [external/envoy/source/server/server.cc:334]   envoy.matching.http.input: request-headers, request-trailers, response-headers, response-trailers
[2024-03-03 14:01:46.442][587067][info][main] [external/envoy/source/server/server.cc:334]   envoy.http.cache: envoy.extensions.http.cache.simple
[2024-03-03 14:01:46.454][587067][critical][main] [external/envoy/source/server/server.cc:113] error initializing configuration 'envoy-config.yaml': Protobuf message (type envoy.config.bootstrap.v3.Bootstrap reason INVALID_ARGUMENT:id_based_broker_address_rewrite_spec: Cannot find field.) has unknown fields
[2024-03-03 14:01:46.455][587067][info][main] [external/envoy/source/server/server.cc:815] exiting
Protobuf message (type envoy.config.bootstrap.v3.Bootstrap reason INVALID_ARGUMENT:id_based_broker_address_rewrite_spec: Cannot find field.) has unknown fields

I have searched about it, but it seems pretty new functionality at Envoy, so I didn't find anything.

1

There are 1 best solutions below

0
raissonsouto On

The official Envoy install tutorial gets an old version of Envoy (I'm my case installed a v1.18, the current one is v1.29).

So, I downloaded Docker and created a docker compose using envoyproxy/envoy:contrib-v1.29.1. Until now, it seems to work fine.

Obs: The contrib version is important according to https://github.com/envoyproxy/envoy/issues/21193#issuecomment-1120332571