@@ -25,7 +25,9 @@ import (
2525 corev1 "k8s.io/api/core/v1"
2626 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2727 "k8s.io/apimachinery/pkg/runtime"
28+ "k8s.io/apimachinery/pkg/util/intstr"
2829
30+ "github.com/banzaicloud/koperator/api/assets"
2931 apiutil "github.com/banzaicloud/koperator/api/util"
3032 "github.com/banzaicloud/koperator/api/v1beta1"
3133 "github.com/banzaicloud/koperator/pkg/k8sutil"
@@ -55,6 +57,86 @@ func (r *Reconciler) pod(id int32, brokerConfig *v1beta1.BrokerConfig, pvcs []co
5557 podname = fmt .Sprintf ("%s-controller-%d-" , r .KafkaCluster .Name , id )
5658 }
5759
60+ kafkaContainer := corev1.Container {
61+ Name : kafkaContainerName ,
62+ Image : util .GetBrokerImage (brokerConfig , r .KafkaCluster .Spec .GetClusterImage ()),
63+ Lifecycle : & corev1.Lifecycle {
64+ PreStop : & corev1.LifecycleHandler {
65+ Exec : & corev1.ExecAction {
66+ Command : []string {"bash" , "-c" , `
67+ if [[ -n "$ENVOY_SIDECAR_STATUS" ]]; then
68+ HEALTHYSTATUSCODE="200"
69+ SC=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:15000/ready)
70+ if [[ "$SC" == "$HEALTHYSTATUSCODE" ]]; then
71+ kill -s TERM $(pidof java)
72+ else
73+ kill -s KILL $(pidof java)
74+ fi
75+ else
76+ kill -s TERM $(pidof java)
77+ fi` },
78+ },
79+ },
80+ },
81+ SecurityContext : brokerConfig .SecurityContext ,
82+ Env : generateEnvConfig (brokerConfig , []corev1.EnvVar {
83+ {
84+ Name : "CLASSPATH" ,
85+ Value : "/opt/kafka/libs/extensions/*" ,
86+ },
87+ {
88+ Name : "KAFKA_OPTS" ,
89+ Value : "-javaagent:/opt/jmx-exporter/jmx_prometheus.jar=9020:/etc/jmx-exporter/config.yaml" ,
90+ },
91+ {
92+ Name : "ENVOY_SIDECAR_STATUS" ,
93+ ValueFrom : & corev1.EnvVarSource {
94+ FieldRef : & corev1.ObjectFieldSelector {
95+ FieldPath : `metadata.annotations['sidecar.istio.io/status']` ,
96+ },
97+ },
98+ },
99+ }),
100+
101+ Command : command ,
102+ Ports : r .generateKafkaContainerPorts (log ),
103+ VolumeMounts : getVolumeMounts (brokerConfig .VolumeMounts , dataVolumeMount , r .KafkaCluster .Spec , r .KafkaCluster .Name ),
104+ Resources : * brokerConfig .GetResources (),
105+ }
106+
107+ if r .KafkaCluster .Spec .KRaftMode && brokerConfig .IsControllerNode () {
108+ controllerlistenerPort , err := findControllerListenerPort (r .KafkaCluster )
109+ if err != nil {
110+ log .Error (err , "failed to find controller listener port" )
111+ } else {
112+ kafkaContainer .ReadinessProbe = & corev1.Probe {
113+ ProbeHandler : corev1.ProbeHandler {
114+ TCPSocket : & corev1.TCPSocketAction {
115+ Port : intstr.IntOrString {
116+ Type : intstr .Int ,
117+ IntVal : controllerlistenerPort ,
118+ },
119+ },
120+ },
121+ InitialDelaySeconds : 0 ,
122+ PeriodSeconds : 5 ,
123+ TimeoutSeconds : 5 ,
124+ FailureThreshold : 20 ,
125+ }
126+ }
127+ kafkaContainer .LivenessProbe = & corev1.Probe {
128+ ProbeHandler : corev1.ProbeHandler {
129+ Exec : & corev1.ExecAction {
130+ Command : []string {"/bin/bash" , "-c" , assets .KraftControllerHealthcheckSh },
131+ },
132+ },
133+ InitialDelaySeconds : 30 ,
134+ PeriodSeconds : 10 ,
135+ TimeoutSeconds : 5 ,
136+ FailureThreshold : 6 ,
137+ }
138+ }
139+
58140 pod := & corev1.Pod {
59141 ObjectMeta : templates .ObjectMetaWithGeneratedNameAndAnnotations (
60142 podname ,
@@ -63,57 +145,10 @@ func (r *Reconciler) pod(id int32, brokerConfig *v1beta1.BrokerConfig, pvcs []co
63145 r .KafkaCluster ,
64146 ),
65147 Spec : corev1.PodSpec {
66- SecurityContext : brokerConfig .PodSecurityContext ,
67- InitContainers : getInitContainers (brokerConfig , r .KafkaCluster .Spec ),
68- Affinity : getAffinity (brokerConfig , r .KafkaCluster ),
69- Containers : append ([]corev1.Container {
70- {
71- Name : kafkaContainerName ,
72- Image : util .GetBrokerImage (brokerConfig , r .KafkaCluster .Spec .GetClusterImage ()),
73- Lifecycle : & corev1.Lifecycle {
74- PreStop : & corev1.LifecycleHandler {
75- Exec : & corev1.ExecAction {
76- Command : []string {"bash" , "-c" , `
77- if [[ -n "$ENVOY_SIDECAR_STATUS" ]]; then
78- HEALTHYSTATUSCODE="200"
79- SC=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:15000/ready)
80- if [[ "$SC" == "$HEALTHYSTATUSCODE" ]]; then
81- kill -s TERM $(pidof java)
82- else
83- kill -s KILL $(pidof java)
84- fi
85- else
86- kill -s TERM $(pidof java)
87- fi` },
88- },
89- },
90- },
91- SecurityContext : brokerConfig .SecurityContext ,
92- Env : generateEnvConfig (brokerConfig , []corev1.EnvVar {
93- {
94- Name : "CLASSPATH" ,
95- Value : "/opt/kafka/libs/extensions/*" ,
96- },
97- {
98- Name : "KAFKA_OPTS" ,
99- Value : "-javaagent:/opt/jmx-exporter/jmx_prometheus.jar=9020:/etc/jmx-exporter/config.yaml" ,
100- },
101- {
102- Name : "ENVOY_SIDECAR_STATUS" ,
103- ValueFrom : & corev1.EnvVarSource {
104- FieldRef : & corev1.ObjectFieldSelector {
105- FieldPath : `metadata.annotations['sidecar.istio.io/status']` ,
106- },
107- },
108- },
109- }),
110-
111- Command : command ,
112- Ports : r .generateKafkaContainerPorts (log ),
113- VolumeMounts : getVolumeMounts (brokerConfig .VolumeMounts , dataVolumeMount , r .KafkaCluster .Spec , r .KafkaCluster .Name ),
114- Resources : * brokerConfig .GetResources (),
115- },
116- }, brokerConfig .Containers ... ),
148+ SecurityContext : brokerConfig .PodSecurityContext ,
149+ InitContainers : getInitContainers (brokerConfig , r .KafkaCluster .Spec ),
150+ Affinity : getAffinity (brokerConfig , r .KafkaCluster ),
151+ Containers : append ([]corev1.Container {kafkaContainer }, brokerConfig .Containers ... ),
117152 Volumes : getVolumes (brokerConfig .Volumes , dataVolume , r .KafkaCluster .Spec , r .KafkaCluster .Name , id ),
118153 RestartPolicy : corev1 .RestartPolicyNever ,
119154 TerminationGracePeriodSeconds : util .Int64Pointer (brokerConfig .GetTerminationGracePeriod ()),
@@ -605,3 +640,14 @@ func generateEnvConfig(brokerConfig *v1beta1.BrokerConfig, defaultEnvVars []core
605640
606641 return mergedEnv
607642}
643+
644+ func findControllerListenerPort (kc * v1beta1.KafkaCluster ) (int32 , error ) {
645+ for _ , listener := range kc .Spec .ListenersConfig .InternalListeners {
646+ if listener .UsedForControllerCommunication {
647+ return listener .ContainerPort , nil
648+ }
649+ }
650+
651+ // If no controller listener is found, return an error
652+ return 0 , fmt .Errorf ("no controller listener found" )
653+ }
0 commit comments