如何为Strimzi创建的Kafka引导服务器与Broker配置不同LoadBalancer端口?
我在Rancher Desktop创建的本地k3s Kubernetes集群中,尝试基于Strimzi的LoadBalancer访问教程搭建Kafka,供集群外部客户端访问。
操作步骤:
kubectl create namespace hm-kafka kubectl apply --filename="https://strimzi.io/install/latest?namespace=hm-kafka" --namespace=hm-kafka kubectl apply --filename=my-kafka-persistent.yaml --namespace=hm-kafka
my-kafka-persistent.yaml(基于官方kafka-persistent.yaml示例):
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: hm-kafka spec: kafka: version: 3.4.0 replicas: 3 listeners: - name: plain port: 9092 type: internal tls: false - name: tls port: 9093 type: internal tls: true - name: external port: 9094 type: loadbalancer tls: false configuration: brokers: - broker: 0 advertisedPort: 9095 - broker: 1 advertisedPort: 9096 - broker: 2 advertisedPort: 9097 config: offsets.topic.replication.factor: 3 transaction.state.log.replication.factor: 3 transaction.state.log.min.isr: 2 default.replication.factor: 3 min.insync.replicas: 2 inter.broker.protocol.version: "3.4" storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false zookeeper: replicas: 3 storage: type: persistent-claim size: 100Gi deleteClaim: false entityOperator: topicOperator: {} userOperator: {}
部署后出现异常:
- Pod状态:

- Service状态:

问题根源:YAML中的advertisedPort仅修改Kafka的advertised.listeners参数端口,未更改LoadBalancer自身端口,导致所有组件共用9094端口。
请问:
- 能否修改LoadBalancer端口,让引导服务器与Broker使用不同端口?
- 这能否解决Kafka运行问题?
- 相关端口是否由k3s集群决定,我们无法控制?
1. 能否让引导服务器与Broker使用不同的LoadBalancer端口?
可以实现,但需要调整Strimzi的listener配置,为引导服务器(bootstrap)和每个Broker分配独立的LoadBalancer端口。Strimzi默认会为LoadBalancer类型的listener创建一个统一的bootstrap Service,以及每个Broker对应的独立LoadBalancer Service。你需要在配置中同时指定每个Broker的servicePort(LoadBalancer暴露的物理端口)和advertisedPort(Kafka对外声明的端口),而bootstrap Service的端口由listener的port字段控制。
调整后的示例配置片段:
- name: external port: 9094 # 引导服务器对应的LoadBalancer端口 type: loadbalancer tls: false configuration: brokers: - broker: 0 servicePort: 9095 # Broker 0对应的LoadBalancer端口 advertisedPort: 9095 - broker: 1 servicePort: 9096 # Broker 1对应的LoadBalancer端口 advertisedPort: 9096 - broker: 2 servicePort: 9097 # Broker 2对应的LoadBalancer端口 advertisedPort: 9097
这样就能实现引导服务器用9094端口,每个Broker分别用9095/9096/9097端口,避免端口共用。
2. 这能否解决当前Kafka运行问题?
是的,这可以解决当前的端口冲突问题。当前所有组件共用9094端口会导致端口绑定失败,进而引发Pod启动异常。通过为引导服务器和每个Broker分配独立的LoadBalancer端口,能避免端口占用冲突,让Kafka组件正常完成端口绑定和启动流程。
3. 端口是否由k3s集群决定无法控制?
不是,你完全可以自定义LoadBalancer的端口。在k3s集群中,LoadBalancer服务的端口由你在Kafka资源的listener配置中指定的port(引导服务器)和servicePort(每个Broker)决定,k3s不会强制分配固定端口。只要这些端口在集群节点(包括本地宿主机)上未被其他服务占用,就能正常绑定并对外暴露。
需要注意的是,如果你使用的是Rancher Desktop本地集群,要确保指定的端口在宿主机上没有被其他程序占用,否则会导致LoadBalancer服务无法正常启动。
内容的提问来源于stack exchange,提问作者Hongbo Miao

