与集群外部服务映射
Last updated
Was this helpful?
Last updated
Was this helpful?
将Service与集群外部服务映射,即用于令集群内部的资源,如Pod,可以借助Service对象访问外部的服务。
共有两种实现方式:
外部服务只提供IP地址,则使用Endpoint资源匹配外部服务的IP地址和端口信息,再交由Service对象;
外部服务提供了完全限定域名(FQDN),则使用spec.type=ExternalName
的Service;
在一节中,提到过在Service与Pod之间,有一层Endpoint来负责选择将流量转发至哪些Pod,而默认情况下,Endpoint是由Service的标签选择器负责创建的,它会自动为标签匹配的Pod创建Endpoint资源,并将所有的这些Pod的IP地址和端口信息都记录其中。
因此,若想通过Endpoint实现与外部服务的映射,仅需如下两步即可:
将Service对象的spec.selector
置为空,令该Service对象不会自动创建Endpoint;
创建与Service对象同名的Endpoint对象,并且将外部服务的IP地址和端口记录其中;
在下图中,集群内部的Pod可以通过访问Service(ClusterIP: 10.108.226.39:80)直接与4个被映射的外部服务进行通信:
创建的Service的spec.selector
为空,令其不会自动创建Endpoint对象。最简单的配置文件案例格式如下,该Service对象的名字为external-service:
创建的Endpoint对象需要与Service对象同名,并将外部服务的IP地址和端口记录其中。配置文件案例格式如下,该Endpoint对象与Service对象同名,均为external-service:
通过使用spec.type=ExternalName
类型的Service对象,可以省去手动创建Endpoint对象的过程,这种Service对象不具备ClusterIP,不创建Endpoint资源对象。相当于为服务创建了CNAME记录,在DNS级别进行重定向,将访问服务的FQDN转换为外部服务的FQDN。
使用这种方式的前提是,外部服务有自己的FQDN,spec.externalName
中即使填写IP地址,也会被Kubernetes识别为FQDN去进行解析。
给出下面这个案例,Service名为external-service:
在测试过程中,spec.externalName
被设置为百度、当当,测试均不成功,猜测可能是WEB端有一些安全设置吧。
如下图,在名为default的命名空间中有如下资源,因此Pod可以通过访问external-service.default.svc.cluster.local
(甚至是external-service
,至于为什么可以参考)来与someapi.somecompany.com
进行通信: