Skip to content

Add Envoy Gateway (Gateway API) ingress support for Kafka external listeners - #187

Open
amuraru wants to merge 6 commits into
masterfrom
istio
Open

Add Envoy Gateway (Gateway API) ingress support for Kafka external listeners#187
amuraru wants to merge 6 commits into
masterfrom
istio

Conversation

@amuraru

@amuraru amuraru commented Sep 27, 2025

Copy link
Copy Markdown

What

Adds a new Envoy Gateway ingress controller for exposing Kafka external
listeners, built on the Kubernetes Gateway API (https://gateway.envoyproxy.io/).
Enable it per external listener with spec.ingressController: envoygateway and
configure it via the new envoyGatewayConfig field. The ingressController
enum is now envoy;contour;envoygateway.

Why

The previous istio-based ingress relied on banzaicloud/istio-operator, which is
EOL/unmaintained (already removed on master). Envoy Gateway is a CNCF-backed,
actively maintained Gateway API implementation.

Changes

  • New envoygateway resource reconciler (pkg/resources/envoygateway):
    generates Gateway + TCPRoute, with optional TLS.
  • New EnvoyGatewayIngressConfig API type + ingressController: envoygateway.
  • Sample manifests for ZooKeeper and KRaft modes.

Testing

  • Unit: Gateway/TCPRoute/TLS generation, controller reconcile (envtest),
    webhook port-collision validation.
  • e2e: full install → produce/consume → JMX → uninstall with Envoy Gateway
    ingress in both ZooKeeper and KRaft modes (Envoy Gateway Helm chart v1.5.4).

@amuraru
amuraru force-pushed the istio branch 3 times, most recently from 0b05088 to e520182 Compare September 27, 2025 09:37
Comment thread pkg/resources/kafka/kafka.go Fixed
@amuraru
amuraru force-pushed the istio branch 2 times, most recently from ad885c0 to 11ccd59 Compare September 27, 2025 16:38
@amuraru amuraru changed the title use upstream istio operator and not deprecated banzaicloud istio oper… WIP: Use upstream istio operator and not deprecated banzaicloud istio oper… Sep 28, 2025
@amuraru
amuraru marked this pull request as draft September 28, 2025 10:39
@amuraru
amuraru force-pushed the master branch 3 times, most recently from 04d55a5 to 432ff85 Compare September 29, 2025 07:02
@amuraru
amuraru force-pushed the master branch 2 times, most recently from 939d351 to b1caf52 Compare September 29, 2025 11:00
@amuraru
amuraru force-pushed the istio branch 14 times, most recently from 4c7d095 to 1fa2195 Compare October 3, 2025 18:26
@amuraru
amuraru force-pushed the istio branch 8 times, most recently from b5fd1af to ba9ea8f Compare November 4, 2025 06:03
@amuraru amuraru changed the title WIP: Use upstream istio operator and not deprecated banzaicloud istio oper… Replace legacy banzaicloud istio ingress with the new envoy gateway Nov 4, 2025
@amuraru
amuraru force-pushed the istio branch 3 times, most recently from bb3e82c to f17e79e Compare November 4, 2025 14:06
@amuraru
amuraru marked this pull request as ready for review November 4, 2025 14:28
@amuraru
amuraru force-pushed the istio branch 6 times, most recently from c7133f0 to 99522b7 Compare November 7, 2025 19:39
@dobrerazvan

Copy link
Copy Markdown

@amuraru i think we have enough ingress methods: envoy and contour. EnvoyGateway is just another envoy based ingress that adds the same external CRD dependency like the Contour one. Is there a specific request for this ingress method?

@amuraru

amuraru commented Jul 13, 2026

Copy link
Copy Markdown
Author

that's a fair feedback @dobrerazvan - I don't have an immediate usecase for this new ingress type - it was me researching a replacement for the old istio ingress (which was removed as it's not maintained anymore). We can keep the PR open and revisit if the need from us or the community arisees.

amuraru and others added 6 commits August 10, 2026 11:44
…steners

Adds a new "envoygateway" ingress controller for exposing Kafka external
listeners, built on the Kubernetes Gateway API (https://gateway.envoyproxy.io/).
Enable it per external listener with `spec.ingressController: envoygateway` and
configure it via the new `envoyGatewayConfig` field. The `ingressController`
enum is now `envoy;contour;envoygateway`.

The previous istio-based ingress relied on banzaicloud/istio-operator, which is
EOL/unmaintained (already removed on master); Envoy Gateway is a CNCF-backed,
actively maintained Gateway API implementation.

Changes:
- New envoygateway resource reconciler (pkg/resources/envoygateway): generates
  Gateway + TCPRoute, with optional TLS.
- New EnvoyGatewayIngressConfig API type + `ingressController: envoygateway`.
- Refactor external listener status handling into a per-listener dispatcher
  (createListenerStatuses) so ingress types plug in cleanly.
- Sample manifests for ZooKeeper and KRaft modes.
- Additional unit tests (envoy resource, k8sutil, nodeport external access) and
  e2e coverage (install/produce/consume/uninstall with Envoy Gateway ingress in
  both ZooKeeper and KRaft modes, Envoy Gateway Helm chart v1.5.4).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
testInstallKafkaCluster no longer exists after test_install_cluster.go
was renamed to test_install_kafka_cluster.go; this call site was missed.
testInstallNoIngressKafkaCluster, testInstallEnvoyKafkaCluster, and
testInstallEnvoyGatewayKafkaCluster were byte-identical bodies; the
ingress type is already encoded in the manifest path, not the Go
code, so the split added no behavior and let one call site drift out
of sync (the 5-broker bug). Collapsed into testInstallKafkaCluster and
reverted the file rename from test_install_cluster.go.
simplekafkacluster_with_envoy.yaml, simplekafkacluster_with_envoygateway.yaml,
and their kraft counterparts were added without the CC warmup tuning that
b7be337 (#291) applied to the other e2e-exercised samples (15s sampling,
shrunk metric/sample-store windows, min.valid.partition.ratio, etc), so they
carried the old flaky defaults. Brought all 4 in line with the reference
samples, verified word-for-word identical against the fixed
simplekafkacluster.yaml/simplekafkacluster_kraft.yaml.
cloud-provider-kind installs the standard-channel Gateway API CRDs by
default (gateway-channel=standard). Those collide via server-side-apply
with the CRDs Envoy Gateway's Helm chart installs in the same cluster
(different field manager, differing bundle-version/channel annotations
and .spec.versions), failing "helm install eg oci://.../gateway-helm"
with an SSA conflict during the e2e "Installing infrastructure
components in parallel" step. cloud-provider-kind is only needed here
for LoadBalancer Service IP allocation, not its own Gateway controller.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants