背景
Kubernetes
的Service允许指定你所需要的 Service 类型,默认是ClusterIP
。
ServiceType 的取值以及行为如下:
ClusterIP
:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType。NodePort
:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。LoadBalancer
:使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。ExternalName
:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创建任何类型代理。
在实际使用过程中,ClusterIP
和NodePort
比较常用。在使用微服务技术栈的时候,微服务本身在启动的时候会将服务信息(IP+Port)注册到注册中心,客户端调用的时候会先从注册中心拉取服务列表并根据负载均衡策略选择一个节点进行调用。如果在产线这样是ok的,因为所有的服务都运行在Kubernetes集群内,但是如果是在测试环境中,那就会遇到问题了,因为注册的时候一般都是用Pod IP,本地直接访问集群内的Pod IP不通,那应该怎么样比较好呢?
解决方案
ClusterIP
经过一番调研,使用ClusterIP
的话可以直接在路由上增加静态路由
就可以很好的解决问题了,直接将k8s pod所在的IP网段解析到Master节点的IP,就可以愉快的访问了,如下:
NodePort
使用NodePort
的话每个服务的端口都是独一无二的,而且在每个Node上都有针对该端口进行监听,因此只需要保证注册的时候是Node的IP就没问题。
- 如果使用
Eureka
,那么可以通过指定-Deureka.instance.ip
为Node IP即可; - 如果使用
Nacos
,那么可以通过指定-Dspring.cloud.nacos.discovery.ip
为Node IP即可。