NodePort 方案下的 Sentinel 端口配置
在使用 NodePort K8S Service 方案时,Sentinel 客户端向 Dashboard 注册的端口应该是 NodePort 端口,而不是 Pod 内部的 8719 端口。
技术原理
Sentinel 通信机制
- 客户端注册:Sentinel 客户端启动时会向 Dashboard 注册自身的 IP 和端口信息
- Dashboard 连接:Dashboard 后续通过这些注册信息连接客户端的通信端口
- 数据传输:通过此连接传输规则配置和监控数据
NodePort 方案中的端口映射
- Pod 内部端口:8719(Sentinel 客户端默认监听端口)
- NodePort 端口:30719(示例,实际为配置的 NodePort 范围端口)
- 映射关系:
节点IP:30719→PodIP: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 端口实现细节
为什么需要这样配置?
网络可达性:
- Pod 的内部 IP 对外部 Sentinel Dashboard 不可见
- 节点 IP + NodePort 是外部可访问的地址
注册机制:
- Sentinel 客户端在启动时会向 Dashboard 注册
- 注册信息必须包含外部可访问的地址和端口
- 这样 Dashboard 才能主动连接客户端
多副本支持:
- 每个副本运行在不同的 Pod 中
- 但都通过同一个 NodePort 服务暴露
- K8S 会自动将流量负载均衡到不同的副本
注意事项
NodePort 端口规划:
- NodePort 端口范围默认是 30000-32767
- 需要为每个应用分配独立的 NodePort 端口
- 避免端口冲突
服务发现:
- 客户端需要知道自己的 NodePort 端口
- 可以通过环境变量、ConfigMap 或启动脚本注入
网络安全:
- 暴露 NodePort 端口会增加安全风险
- 建议在生产环境中配置网络策略,限制只有 Sentinel Dashboard 可以访问这些端口
高可用性:
- 确保所有节点都能正常访问
- 考虑使用多个节点的 NodePort 进行冗余
通过以上配置,即使在 K8S 多副本环境下,外部部署的 Sentinel Dashboard 也能与每个 Pod 正常通信,实现统一的流量控制和监控管理。