K8s集群NATS Pod出现TLS握手错误,求排查解决方法
NATS TLS握手错误(节点IP发起连接)问题解决
错误原因分析
你看到的10.240.0.8(K8s节点IP)向NATS Pod 4222端口发起的连接,90%以上是LoadBalancer服务的健康检查请求。因为你将service.type设置为LoadBalancer,云服务商的负载均衡器会通过集群节点IP,向Pod的4222端口发送健康探测,但这些请求默认是明文的,而你的NATS 4222端口已经强制启用TLS并开启证书验证,导致TLS握手失败,最终连接被节点侧重置。
解决方案
方案1:改用NATS监控端口做健康检查(推荐)
NATS默认开放8222端口作为HTTP监控端口,内置/healthz健康检查端点,该端口默认不启用TLS,非常适合作为LB的健康探测目标。
修改你的values.yaml,调整Service配置:
service: merge: spec: type: LoadBalancer # 可选:指定固定的健康检查节点端口,避免随机分配 healthCheckNodePort: 30082 ports: - name: client port: 4222 targetPort: 4222 - name: monitor port: 8222 targetPort: 8222 # 添加云厂商LB健康检查注解(以AWS为例,其他厂商请替换对应注解) annotations: service.beta.kubernetes.io/aws-load-balancer-healthcheck-port: "8222" service.beta.kubernetes.io/aws-load-balancer-healthcheck-path: "/healthz" service.beta.kubernetes.io/aws-load-balancer-healthcheck-protocol: HTTP
确认NATS的监控端口已启用(默认开启,若需显式配置,在config中添加):
config: nats: http_port: 8222 # 默认值,可省略
方案2:为健康检查单独配置无TLS端口
如果必须使用4222端口处理客户端请求,可额外开放一个无TLS的端口专门用于健康检查:
config: nats: # 保留原TLS客户端端口 listen: "0.0.0.0:4222" tls: enabled: true merge: { verify: true, cert_file: '/mnt/nats-certificate/nats-playground-server.crt', key_file: '/mnt/nats-certificate/nats-playground-server.key', ca_file: '/mnt/nats-certificate/rootCA-playground.crt', timeout: 50 } # 添加无TLS的健康检查端口 port: 4223
然后调整Service的健康检查配置,将探测目标指向4223端口即可。
额外排查提示
- 若后续客户端连接仍有问题,需确认证书的SAN字段是否包含客户端或LB的访问IP/域名;但本次错误是健康检查明文请求导致,和证书SAN无关。
- 集群通信端口6222未配置TLS?你的当前配置仅开启了客户端端口的TLS,若集群间需要加密通信,需单独配置
config.cluster.tls字段,但这和本次错误无关。
内容的提问来源于stack exchange,提问作者iAviator
相关产品推荐
相关产品推荐

