You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 06:03:18