容器化部署kafka,想让k8s内部网络pod服务访问 broker pod 及 broker pod 间不需要sasl认证就能访问,而通过nodeport宿主机ip和nodeport访问的需要sasl认证才能访问。
broker配置如下:
listeners=NODEPORT://0.0.0.0:6668,INTERNAL://0.0.0.0:6667
listener.security.protocol.map=NODEPORT:SASL_PLAINTEXT,INTERNAL:PLAINTEXT
advertised.listeners=NODEPORT://<各节点IP>:9092,INTERNAL://<headless_svc>:6667
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
inter.broker.listener.name=INTERNAL
上述为broker的相关配置,kafka使用StatefultSet部署,同时每个broker headless_svc为pod_name.headless.namespace。
broker jaas server配置文件为(通过启动参数加载):
nodeport.KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin"
user_admin="admin";
}
1、现在外部通过宿主机+9092端口访问kafka确实必须使用sasl认证才可以,通过nodeport svc可自动映射到broker pod 6668端口。
2、使用单独定义的svc:6667,这个svc自动选择所有broker pod根据标签,同时映射到pod 6667端口,使用这种方式的pod 客户端服务总是报错:unexpected handshake request with client mechanism plain, enabled mechanisms are[]
目前不清楚哪里配置有错误,暂时未找到正确的方法。
已解决
分享一下...
有的pod服务内部,虽然访问通过svc 6667 无需认证的端口访问,按理说不应该报错。
后续排查发现有些producer客户端,即使不配置sasl.enabled.mechanisms参数,默认竟然走了认证PLAIN机制,很奇怪,百思不得奇解,默认的按理说应该是无认证的机制参数。
将相关客户端sasl.enabled.mechanisms设置为PLAINTEXT就好了,见了鬼了
你的答案