@@ -79,12 +79,15 @@ use crate::{
7979 DOCKER_IMAGE_BASE_NAME , JVM_SECURITY_PROPERTIES_FILE , MAX_PREPARE_LOG_FILE_SIZE ,
8080 MAX_ZK_LOG_FILES_SIZE , METRICS_PORT , METRICS_PORT_NAME , STACKABLE_CONFIG_DIR ,
8181 STACKABLE_DATA_DIR , STACKABLE_LOG_CONFIG_DIR , STACKABLE_LOG_DIR , STACKABLE_RW_CONFIG_DIR ,
82- ZOOKEEPER_PROPERTIES_FILE , ZookeeperRole ,
82+ ZOOKEEPER_ELECTION_PORT , ZOOKEEPER_LEADER_PORT , ZOOKEEPER_PROPERTIES_FILE , ZookeeperRole ,
8383 security:: { self , ZookeeperSecurity } ,
8484 v1alpha1:: { self , ZookeeperServerRoleConfig } ,
8585 } ,
86- discovery:: { self , build_discovery_configmap, build_headless_role_group_metrics_service_name} ,
87- listener:: build_role_listener,
86+ discovery:: {
87+ self , build_discovery_configmap, build_role_group_headless_service_name,
88+ build_role_group_metrics_service_name,
89+ } ,
90+ listener:: { build_role_listener, role_listener_name} ,
8891 operations:: { graceful_shutdown:: add_graceful_shutdown_config, pdb:: add_pdbs} ,
8992 product_logging:: extend_role_group_config_map,
9093 utils:: build_recommended_labels,
@@ -430,7 +433,10 @@ pub async fn reconcile_zk(
430433 . merged_config ( & ZookeeperRole :: Server , & rolegroup)
431434 . context ( FailedToResolveConfigSnafu ) ?;
432435
433- let rg_service = build_server_rolegroup_service ( zk, & rolegroup, & resolved_product_image) ?;
436+ let rg_headless_service =
437+ build_server_rolegroup_headless_service ( zk, & rolegroup, & resolved_product_image) ?;
438+ let rg_metrics_service =
439+ build_server_rolegroup_metrics_service ( zk, & rolegroup, & resolved_product_image) ?;
434440 let rg_configmap = build_server_rolegroup_config_map (
435441 zk,
436442 & rolegroup,
@@ -451,7 +457,13 @@ pub async fn reconcile_zk(
451457 ) ?;
452458
453459 cluster_resources
454- . add ( client, rg_service)
460+ . add ( client, rg_headless_service)
461+ . await
462+ . with_context ( |_| ApplyRoleGroupServiceSnafu {
463+ rolegroup : rolegroup. clone ( ) ,
464+ } ) ?;
465+ cluster_resources
466+ . add ( client, rg_metrics_service)
455467 . await
456468 . with_context ( |_| ApplyRoleGroupServiceSnafu {
457469 rolegroup : rolegroup. clone ( ) ,
@@ -556,11 +568,11 @@ fn build_server_rolegroup_config_map(
556568 . flatten ( )
557569 . map ( |pod| {
558570 (
559- format ! ( "server.{}" , pod. zookeeper_myid) ,
571+ format ! ( "server.{id }" , id = pod. zookeeper_myid) ,
560572 format ! (
561- "{}:2888:3888;{ }" ,
562- pod. fqdn ( cluster_info) ,
563- zookeeper_security. client_port( )
573+ "{internal_fqdn}:{ZOOKEEPER_LEADER_PORT}:{ZOOKEEPER_ELECTION_PORT};{client_port }" ,
574+ internal_fqdn = pod. internal_fqdn ( cluster_info) ,
575+ client_port = zookeeper_security. client_port( )
564576 ) ,
565577 )
566578 } )
@@ -642,10 +654,69 @@ fn build_server_rolegroup_config_map(
642654 } )
643655}
644656
645- /// The rolegroup [`Service`] is a headless service that allows direct access to the instances of a certain rolegroup
657+ /// The rolegroup [`Service`] is a headless service that allows internal access to the instances of a certain rolegroup
646658///
647659/// This is mostly useful for internal communication between peers, or for clients that perform client-side load balancing.
648- fn build_server_rolegroup_service (
660+ fn build_server_rolegroup_headless_service (
661+ zk : & v1alpha1:: ZookeeperCluster ,
662+ rolegroup : & RoleGroupRef < v1alpha1:: ZookeeperCluster > ,
663+ resolved_product_image : & ResolvedProductImage ,
664+ ) -> Result < Service > {
665+ let metadata = ObjectMetaBuilder :: new ( )
666+ . name_and_namespace ( zk)
667+ . name ( build_role_group_headless_service_name (
668+ rolegroup. object_name ( ) ,
669+ ) )
670+ . ownerreference_from_resource ( zk, None , Some ( true ) )
671+ . context ( ObjectMissingMetadataForOwnerRefSnafu ) ?
672+ . with_recommended_labels ( build_recommended_labels (
673+ zk,
674+ ZK_CONTROLLER_NAME ,
675+ & resolved_product_image. app_version_label ,
676+ & rolegroup. role ,
677+ & rolegroup. role_group ,
678+ ) )
679+ . context ( ObjectMetaSnafu ) ?
680+ . build ( ) ;
681+
682+ let service_selector_labels =
683+ Labels :: role_group_selector ( zk, APP_NAME , & rolegroup. role , & rolegroup. role_group )
684+ . context ( BuildLabelSnafu ) ?;
685+
686+ let service_spec = ServiceSpec {
687+ // Internal communication does not need to be exposed
688+ type_ : Some ( "ClusterIP" . to_string ( ) ) ,
689+ cluster_ip : Some ( "None" . to_string ( ) ) ,
690+ ports : Some ( vec ! [
691+ ServicePort {
692+ // TODO (@NickLarsenNZ): Use a const
693+ name: Some ( "zk-leader" . to_string( ) ) ,
694+ port: ZOOKEEPER_LEADER_PORT as i32 ,
695+ protocol: Some ( "TCP" . to_string( ) ) ,
696+ ..ServicePort :: default ( )
697+ } ,
698+ ServicePort {
699+ // TODO (@NickLarsenNZ): Use a const
700+ name: Some ( "zk-election" . to_string( ) ) ,
701+ port: ZOOKEEPER_ELECTION_PORT as i32 ,
702+ protocol: Some ( "TCP" . to_string( ) ) ,
703+ ..ServicePort :: default ( )
704+ } ,
705+ ] ) ,
706+ selector : Some ( service_selector_labels. into ( ) ) ,
707+ publish_not_ready_addresses : Some ( true ) ,
708+ ..ServiceSpec :: default ( )
709+ } ;
710+
711+ Ok ( Service {
712+ metadata,
713+ spec : Some ( service_spec) ,
714+ status : None ,
715+ } )
716+ }
717+
718+ /// The rolegroup [`Service`] for exposing metrics
719+ fn build_server_rolegroup_metrics_service (
649720 zk : & v1alpha1:: ZookeeperCluster ,
650721 rolegroup : & RoleGroupRef < v1alpha1:: ZookeeperCluster > ,
651722 resolved_product_image : & ResolvedProductImage ,
@@ -655,7 +726,7 @@ fn build_server_rolegroup_service(
655726
656727 let metadata = ObjectMetaBuilder :: new ( )
657728 . name_and_namespace ( zk)
658- . name ( build_headless_role_group_metrics_service_name (
729+ . name ( build_role_group_metrics_service_name (
659730 rolegroup. object_name ( ) ,
660731 ) )
661732 . ownerreference_from_resource ( zk, None , Some ( true ) )
@@ -767,8 +838,7 @@ fn build_server_rolegroup_statefulset(
767838 // .context(LabelBuildSnafu)?;
768839
769840 let listener_pvc = build_role_listener_pvc (
770- & zk. server_role_listener_name ( )
771- . expect ( "todo: get role from zk_role" ) ,
841+ & role_listener_name ( zk, & ZookeeperRole :: Server ) ,
772842 & unversioned_recommended_labels,
773843 ) ?;
774844
@@ -901,8 +971,8 @@ fn build_server_rolegroup_statefulset(
901971 ..Probe :: default ( )
902972 } )
903973 . add_container_port ( "zk" , zookeeper_security. client_port ( ) . into ( ) )
904- . add_container_port ( "zk-leader" , 2888 )
905- . add_container_port ( "zk-election" , 3888 )
974+ . add_container_port ( "zk-leader" , ZOOKEEPER_LEADER_PORT as i32 )
975+ . add_container_port ( "zk-election" , ZOOKEEPER_ELECTION_PORT as i32 )
906976 . add_container_port ( "metrics" , 9505 )
907977 . add_volume_mount ( "data" , STACKABLE_DATA_DIR )
908978 . context ( AddVolumeMountSnafu ) ?
@@ -1058,7 +1128,7 @@ fn build_server_rolegroup_statefulset(
10581128 match_labels : Some ( statefulset_match_labels. into ( ) ) ,
10591129 ..LabelSelector :: default ( )
10601130 } ,
1061- service_name : Some ( build_headless_role_group_metrics_service_name (
1131+ service_name : Some ( build_role_group_headless_service_name (
10621132 rolegroup_ref. object_name ( ) ,
10631133 ) ) ,
10641134 template : pod_template,
0 commit comments