K8S NodePort 方式Java客户端 Sentinel 端口配置方案

NodePort 方案下的 Sentinel 端口配置

在使用 NodePort K8S Service 方案时,Sentinel 客户端向 Dashboard 注册的端口应该是 NodePort 端口,而不是 Pod 内部的 8719 端口。

技术原理

Sentinel 通信机制

  1. 客户端注册:Sentinel 客户端启动时会向 Dashboard 注册自身的 IP 和端口信息
  2. Dashboard 连接:Dashboard 后续通过这些注册信息连接客户端的通信端口
  3. 数据传输:通过此连接传输规则配置和监控数据

NodePort 方案中的端口映射

  • Pod 内部端口:8719(Sentinel 客户端默认监听端口)
  • NodePort 端口:30719(示例,实际为配置的 NodePort 范围端口)
  • 映射关系节点IP:30719PodIP:8719

正确配置方法

1. K8S Service 配置

apiVersion:v1kind:Servicemetadata:name:sentinel-clientnamespace:your-namespacespec:type:NodePortselector:app:your-applicationports:-name:sentinel-commport:8719targetPort:8719nodePort:30719# 明确指定 NodePort 端口

2. Pod 配置(关键)

apiVersion:apps/v1kind:Deploymentmetadata:name:your-applicationnamespace:your-namespacespec:replicas:3# 多副本template:spec:containers:-name:your-applicationimage:your-image:tagenv:-name:SENTINEL_DASHBOARD_ADDRvalue:"外部SentinelDashboardIP:8858"-name:SENTINEL_CLIENT_IPvalueFrom:fieldRef:fieldPath:status.hostIP# 使用节点 IP-name:SENTINEL_CLIENT_PORTvalue:"30719"# 明确指定 NodePort 端口

3. 应用配置

application.yml中添加:

spring.cloud.sentinel:transport:dashboard:${SENTINEL_DASHBOARD_ADDR}client-ip:${SENTINEL_CLIENT_IP}# 节点 IPport:${SENTINEL_CLIENT_PORT}# NodePort 端口

实现细节

为什么需要这样配置?

  1. 网络可达性

    • Pod 的内部 IP 对外部 Sentinel Dashboard 不可见
    • 节点 IP + NodePort 是外部可访问的地址
  2. 注册机制

    • Sentinel 客户端在启动时会向 Dashboard 注册
    • 注册信息必须包含外部可访问的地址和端口
    • 这样 Dashboard 才能主动连接客户端
  3. 多副本支持

    • 每个副本运行在不同的 Pod 中
    • 但都通过同一个 NodePort 服务暴露
    • K8S 会自动将流量负载均衡到不同的副本

注意事项

  1. NodePort 端口规划

    • NodePort 端口范围默认是 30000-32767
    • 需要为每个应用分配独立的 NodePort 端口
    • 避免端口冲突
  2. 服务发现

    • 客户端需要知道自己的 NodePort 端口
    • 可以通过环境变量、ConfigMap 或启动脚本注入
  3. 网络安全

    • 暴露 NodePort 端口会增加安全风险
    • 建议在生产环境中配置网络策略,限制只有 Sentinel Dashboard 可以访问这些端口
  4. 高可用性

    • 确保所有节点都能正常访问
    • 考虑使用多个节点的 NodePort 进行冗余

通过以上配置,即使在 K8S 多副本环境下,外部部署的 Sentinel Dashboard 也能与每个 Pod 正常通信,实现统一的流量控制和监控管理。