Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
project: charts/redpanda
kind: Added
body: Added per-listener LoadBalancer annotations support. When an external listener has `annotations` set, it gets a dedicated LoadBalancer Service per broker instead of sharing the default one. This enables use cases like private and public listeners on separate LBs with different cloud-provider annotations.
time: 2026-03-26T12:00:00.000000-04:00
244 changes: 240 additions & 4 deletions charts/redpanda/chart/templates/_service.loadbalancer.go.tpl
Original file line number Diff line number Diff line change
@@ -1,6 +1,215 @@
{{- /* GENERATED FILE DO NOT EDIT */ -}}
{{- /* Transpiled by gotohelm from "github.com/redpanda-data/redpanda-operator/charts/redpanda/v25/service.loadbalancer.go" */ -}}

{{- define "redpanda.dedicatedListenerNames" -}}
{{- $listeners := (index .a 0) -}}
{{- range $_ := (list 1) -}}
{{- $_is_returning := false -}}
{{- $dedicated := (dict) -}}
{{- range $name, $l := $listeners.admin.external -}}
{{- if (get (fromJson (include "redpanda.ExternalListener.HasDedicatedService" (dict "a" (list $l)))) "r") -}}
{{- $_ := (set $dedicated $name true) -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.kafka.external -}}
{{- if (get (fromJson (include "redpanda.ExternalListener.HasDedicatedService" (dict "a" (list $l)))) "r") -}}
{{- $_ := (set $dedicated $name true) -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.http.external -}}
{{- if (get (fromJson (include "redpanda.ExternalListener.HasDedicatedService" (dict "a" (list $l)))) "r") -}}
{{- $_ := (set $dedicated $name true) -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.schemaRegistry.external -}}
{{- if (get (fromJson (include "redpanda.ExternalListener.HasDedicatedService" (dict "a" (list $l)))) "r") -}}
{{- $_ := (set $dedicated $name true) -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- $_is_returning = true -}}
{{- (dict "r" $dedicated) | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}

{{- define "redpanda.dedicatedListenerAnnotations" -}}
{{- $listeners := (index .a 0) -}}
{{- $listenerName := (index .a 1) -}}
{{- range $_ := (list 1) -}}
{{- $_is_returning := false -}}
{{- $merged := (dict) -}}
{{- range $name, $l := $listeners.admin.external -}}
{{- if (eq $name $listenerName) -}}
{{- range $k, $v := $l.annotations -}}
{{- $_ := (set $merged $k $v) -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.kafka.external -}}
{{- if (eq $name $listenerName) -}}
{{- range $k, $v := $l.annotations -}}
{{- $_ := (set $merged $k $v) -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.http.external -}}
{{- if (eq $name $listenerName) -}}
{{- range $k, $v := $l.annotations -}}
{{- $_ := (set $merged $k $v) -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.schemaRegistry.external -}}
{{- if (eq $name $listenerName) -}}
{{- range $k, $v := $l.annotations -}}
{{- $_ := (set $merged $k $v) -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- $_is_returning = true -}}
{{- (dict "r" $merged) | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}

{{- define "redpanda.dedicatedListenerSourceRanges" -}}
{{- $listeners := (index .a 0) -}}
{{- $listenerName := (index .a 1) -}}
{{- range $_ := (list 1) -}}
{{- $_is_returning := false -}}
{{- range $name, $l := $listeners.kafka.external -}}
{{- if (and (eq $name $listenerName) (gt ((get (fromJson (include "_shims.len" (dict "a" (list $l.loadBalancerSourceRanges)))) "r") | int) (0 | int))) -}}
{{- $_is_returning = true -}}
{{- (dict "r" $l.loadBalancerSourceRanges) | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.admin.external -}}
{{- if (and (eq $name $listenerName) (gt ((get (fromJson (include "_shims.len" (dict "a" (list $l.loadBalancerSourceRanges)))) "r") | int) (0 | int))) -}}
{{- $_is_returning = true -}}
{{- (dict "r" $l.loadBalancerSourceRanges) | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.http.external -}}
{{- if (and (eq $name $listenerName) (gt ((get (fromJson (include "_shims.len" (dict "a" (list $l.loadBalancerSourceRanges)))) "r") | int) (0 | int))) -}}
{{- $_is_returning = true -}}
{{- (dict "r" $l.loadBalancerSourceRanges) | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.schemaRegistry.external -}}
{{- if (and (eq $name $listenerName) (gt ((get (fromJson (include "_shims.len" (dict "a" (list $l.loadBalancerSourceRanges)))) "r") | int) (0 | int))) -}}
{{- $_is_returning = true -}}
{{- (dict "r" $l.loadBalancerSourceRanges) | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- $_is_returning = true -}}
{{- (dict "r" (coalesce nil)) | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}

{{- define "redpanda.dedicatedListenerServiceType" -}}
{{- $listeners := (index .a 0) -}}
{{- $listenerName := (index .a 1) -}}
{{- range $_ := (list 1) -}}
{{- $_is_returning := false -}}
{{- range $name, $l := $listeners.kafka.external -}}
{{- if (and (eq $name $listenerName) (ne (toJson $l.type) "null")) -}}
{{- $_is_returning = true -}}
{{- (dict "r" $l.type) | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.admin.external -}}
{{- if (and (eq $name $listenerName) (ne (toJson $l.type) "null")) -}}
{{- $_is_returning = true -}}
{{- (dict "r" $l.type) | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.http.external -}}
{{- if (and (eq $name $listenerName) (ne (toJson $l.type) "null")) -}}
{{- $_is_returning = true -}}
{{- (dict "r" $l.type) | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- range $name, $l := $listeners.schemaRegistry.external -}}
{{- if (and (eq $name $listenerName) (ne (toJson $l.type) "null")) -}}
{{- $_is_returning = true -}}
{{- (dict "r" $l.type) | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- $_is_returning = true -}}
{{- (dict "r" "LoadBalancer") | toJson -}}
{{- break -}}
{{- end -}}
{{- end -}}

{{- define "redpanda.LoadBalancerServices" -}}
{{- $state := (index .a 0) -}}
{{- range $_ := (list 1) -}}
Expand All @@ -27,6 +236,7 @@
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- $dedicated := (get (fromJson (include "redpanda.dedicatedListenerNames" (dict "a" (list $state.Values.listeners)))) "r") -}}
{{- range $i, $podname := $pods -}}
{{- $annotations := (dict) -}}
{{- range $k, $v := $state.Values.external.annotations -}}
Expand Down Expand Up @@ -56,13 +266,39 @@
{{- end -}}
{{- $_ := (set $podSelector "statefulset.kubernetes.io/pod-name" $podname) -}}
{{- $ports := (coalesce nil) -}}
{{- $ports = (concat (default (list) $ports) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePorts" (dict "a" (list $state.Values.listeners.admin "admin" $state.Values.external)))) "r"))) -}}
{{- $ports = (concat (default (list) $ports) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePorts" (dict "a" (list $state.Values.listeners.kafka "kafka" $state.Values.external)))) "r"))) -}}
{{- $ports = (concat (default (list) $ports) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePorts" (dict "a" (list $state.Values.listeners.http "http" $state.Values.external)))) "r"))) -}}
{{- $ports = (concat (default (list) $ports) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePorts" (dict "a" (list $state.Values.listeners.schemaRegistry "schema" $state.Values.external)))) "r"))) -}}
{{- $ports = (concat (default (list) $ports) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePortsExcludingListeners" (dict "a" (list $state.Values.listeners.admin "admin" $state.Values.external $dedicated)))) "r"))) -}}
{{- $ports = (concat (default (list) $ports) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePortsExcludingListeners" (dict "a" (list $state.Values.listeners.kafka "kafka" $state.Values.external $dedicated)))) "r"))) -}}
{{- $ports = (concat (default (list) $ports) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePortsExcludingListeners" (dict "a" (list $state.Values.listeners.http "http" $state.Values.external $dedicated)))) "r"))) -}}
{{- $ports = (concat (default (list) $ports) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePortsExcludingListeners" (dict "a" (list $state.Values.listeners.schemaRegistry "schema" $state.Values.external $dedicated)))) "r"))) -}}
{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $ports)))) "r") | int) (0 | int)) -}}
{{- $svc := (mustMergeOverwrite (dict "metadata" (dict) "spec" (dict) "status" (dict "loadBalancer" (dict))) (mustMergeOverwrite (dict) (dict "apiVersion" "v1" "kind" "Service")) (dict "metadata" (mustMergeOverwrite (dict) (dict "name" (printf "lb-%s" $podname) "namespace" $state.Release.Namespace "labels" $labels "annotations" $annotations)) "spec" (mustMergeOverwrite (dict) (dict "externalTrafficPolicy" "Local" "loadBalancerSourceRanges" $state.Values.external.sourceRanges "ports" $ports "publishNotReadyAddresses" true "selector" $podSelector "sessionAffinity" "None" "type" "LoadBalancer")))) -}}
{{- $services = (concat (default (list) $services) (list $svc)) -}}
{{- end -}}
{{- range $listenerName, $_ := $dedicated -}}
{{- $dedicatedPorts := (coalesce nil) -}}
{{- $dedicatedPorts = (concat (default (list) $dedicatedPorts) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePortsForListener" (dict "a" (list $state.Values.listeners.admin "admin" $listenerName $state.Values.external)))) "r"))) -}}
{{- $dedicatedPorts = (concat (default (list) $dedicatedPorts) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePortsForListener" (dict "a" (list $state.Values.listeners.kafka "kafka" $listenerName $state.Values.external)))) "r"))) -}}
{{- $dedicatedPorts = (concat (default (list) $dedicatedPorts) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePortsForListener" (dict "a" (list $state.Values.listeners.http "http" $listenerName $state.Values.external)))) "r"))) -}}
{{- $dedicatedPorts = (concat (default (list) $dedicatedPorts) (default (list) (get (fromJson (include "redpanda.ListenerConfig.ServicePortsForListener" (dict "a" (list $state.Values.listeners.schemaRegistry "schema" $listenerName $state.Values.external)))) "r"))) -}}
{{- if (eq ((get (fromJson (include "_shims.len" (dict "a" (list $dedicatedPorts)))) "r") | int) (0 | int)) -}}
{{- continue -}}
{{- end -}}
{{- $dedicatedAnnotations := (dict) -}}
{{- range $k, $v := (get (fromJson (include "redpanda.dedicatedListenerAnnotations" (dict "a" (list $state.Values.listeners $listenerName)))) "r") -}}
{{- $_ := (set $dedicatedAnnotations $k $v) -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- $svcType := (get (fromJson (include "redpanda.dedicatedListenerServiceType" (dict "a" (list $state.Values.listeners $listenerName)))) "r") -}}
{{- $sourceRanges := (get (fromJson (include "redpanda.dedicatedListenerSourceRanges" (dict "a" (list $state.Values.listeners $listenerName)))) "r") -}}
{{- $svc := (mustMergeOverwrite (dict "metadata" (dict) "spec" (dict) "status" (dict "loadBalancer" (dict))) (mustMergeOverwrite (dict) (dict "apiVersion" "v1" "kind" "Service")) (dict "metadata" (mustMergeOverwrite (dict) (dict "name" (printf "lb-%s-%s" $listenerName $podname) "namespace" $state.Release.Namespace "labels" $labels "annotations" $dedicatedAnnotations)) "spec" (mustMergeOverwrite (dict) (dict "externalTrafficPolicy" "Local" "loadBalancerSourceRanges" $sourceRanges "ports" $dedicatedPorts "publishNotReadyAddresses" true "selector" $podSelector "sessionAffinity" "None" "type" $svcType)))) -}}
{{- $services = (concat (default (list) $services) (list $svc)) -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $_is_returning -}}
{{- break -}}
{{- end -}}
Expand Down
Loading
Loading