1701vip黄金城_从零开始学K8s: 26.毗连外部服务
发布时间:2021-11-26 01:10:02
本文摘要:之前我们讨论的服务在集群中是由一个或多个pod在后端支撑。

之前我们讨论的服务在集群中是由一个或多个pod在后端支撑。可是有时候我们也希望使用Kubernetes的Service特性将外部的服务袒露给Kubernetes集群内部,让这个Service将毗连重定向到外部服务的IP和端口,而不是重定向到集群中的pod。通过这种方式,我们可以使用服务负载平衡和服务发现的功效。

集群中运行的客户端pod可以像毗连内部服务一样毗连到外部服务。首先来相识什么是Endpoints。什么是服务Endpoints服务与pod不是直接相连的,而是在它们之间有一个被称为Endpoints的资源。

可以使用kubectl desribe检察:kubectl describe svc test-svc上图中Selector:app=test1表现服务的pod标签选择器,用于建立Endpoints列表。Endpoints:172.18.0.10:8080,172.18.0.8:8080,172.18.0.9:8080代表pod列表,其中包罗每个pod的IP和端口,表现该服务的所有endpoint。Endpoints资源就是袒露一个服务的IP地址和端口的列表,与其他Kubernetes资源类似,可以使用kubectl get显示它的基本信息:kubectl get endpoints test-svc虽然在服务的spec中界说了pod选择器,可是在重定向传入的毗连时不会直接使用它。

1701vip黄金城集团

Pod选择器是用于构建一个IP和端口列表,然后将其存储在Endpoints资源中。当一个客户端毗连服务时,服务署理就会从这些IP和端口对中选择一个,然后将传入的毗连重定向到监听这个地址的服务器。手动设置Endpoint在Kubernetes中,Endpoints和service是两个独立的资源。将服务的Endpoints与服务自己解耦合使我们能够手动设置和更新它们。

如果建立一个没有指定pod选择器的服务,Kubernetes就不会为我们建立Endpoints资源,因为没有了pod选择器,Kubernetes就没法知道服务中应该包罗哪些pod。如果要建立一个服务并希望手动设置endpoints,我们需要建立一个Service和一个Endpoints资源。首先建立一个不指定选择器的服务:apiVersion: v1kind: Servicemetadata:name: external-servicespec:ports:- port: 80在上面的YAML文件中,我们界说了一个名为external-service的服务,在端口80上吸收传入的毗连,而且没有指定pod选择器。

1701vip黄金城

然后为这个服务建立一个Endpoints资源。需要注意的是,Endpoints是一个独立的资源,不是服务的一个属性。由于我们建立了一个不带pod选择器的服务,所以相应的Endpoints资源就不会被自动建立,因此需要手动建立它:apiVersion: v1kind: Endpointsmetadata:name: external-servicesubsets:- addresses: - ip: 11.11.11.11 - ip: 22.22.22.22 ports: - port: 80上面界说的Endpoints工具需要与服务具有相同的名称,而且包罗该服务的目的IP地址和端口列表。

addresses属性界说了endpoints的所有IP,服务会将传入的毗连重定向到这些IP地址;ports属性界说了Endpoints的目的端口。当建立好这个Service和Endpoints资源后,就可以正常使用这个服务,就像使用具有pod选择器的服务一样。

如果我们在这个服务被建立之后建立了一个容器,那么它会包罗该服务的情况变量,而且所有流入到IP:Port对的毗连都市在该服务的endpoints之间被负载平衡处置惩罚。如下图所示,三个pod消费一个带有两个外部endpoints的服务:如果决议将外部服务迁移到Kubernetes集群中的pod中,我们可以为这个服务添加一个pod选择器,从而对Endpoints举行自动治理。反之也是一样——将选择器从服务中移除,Kubernetes将停止更新服务的Endpoints。

1701vip黄金城集团

这意味着一个服务的IP地址可以保持稳定,而服务的实际实现已经改变了。为外部服务建立别名除了通过手动设置服务的Endpoints来袒露外部服务之外,另有一种更简朴的方法,就是通过服务的完全限定域名(FQDN)来引用一个外部服务。建立一个ExternalName服务如果要建立一个服务资源作为外部服务的别名(类似CNAME),我们需要在建立服务资源时指定type属性值为ExternalName。

例如,我们假定有一个公共API: api.somecompany.com,可以按如下方式界说一个服务指向这个API:apiVersion: v1kind: Servicemetadata:name: external-servicespec:type: ExternalNameexternalName: api.somecompany.comports:- port: 80上面的YAML界说中,“type: ExternalName”表现服务类型被设定为ExternalName。“externalName: api.somecompany.com”表现服务实际的FQDN。这个服务被建立后,pod可以通过external-service.default.svc.cluster.local域名(或者external-service)毗连到外部服务,而不是使用服务实际的FQDN。这种方式对消费该服务的那些pod隐藏了实际的服务名称以及地址,使我们能够在任何时候修改服务界说信息使其指向到差别的服务,只需要修改externalName属性或者将type改回ClusterIP且为该服务建立一个Endpoints工具——手动建立或者通过在服务中指定标签选择器使其自动建立。

ExternalName仅在DNS层面实现——为服务建立一个简朴的CNAME DNS记载。因此毗连这个服务的客户端将直接毗连到外部服务,完全跳过了服务署理。

由于这个原因,这种类型的服务甚至都不会获得集群IP。CNAME记载指向FQDN,而不是数字IP地址。

如果以为本文对您有资助,接待关注我的头条号订阅更新,我会不停推出更多学习教程、视频以及偏实战的文章!。


本文关键词:1701vip黄金城,1701vip黄金城集团

本文来源:1701vip黄金城-www.collection-gift.com