Kubernetes是如何做服务发现的?

参与7

2同行回答

zzhengleizzhenglei  技术经理 , 某保险
分为三种类型,集群内服务发现,集群内发现集群外服务,集群外发现集群内服务。集群内服务发现通过环境变量发现。在一个Pod开始运行的时候,Kubernetes会将已有的服务写入到Pod的环境变量中。Pod上的进程可以根据环境变量获取服务的IP和端口号。但是在Pod创建之后创建的服务无法...显示全部

分为三种类型,集群内服务发现,集群内发现集群外服务,集群外发现集群内服务。

集群内服务发现

通过环境变量发现。在一个Pod开始运行的时候,Kubernetes会将已有的服务写入到Pod的环境变量中。Pod上的进程可以根据环境变量获取服务的IP和端口号。但是在Pod创建之后创建的服务无法被这个Pod发现。

通过DNS发现服务。Kubernetes有一个Pod叫做kube-dns,是集群内部的DNS服务器,如果Pod使用这个内部的DNS服务(通过dnsPolicy属性指定),就可以通过服务的名字找到服务的IP。这种方式只能获得服务的IP,端口号如果是标准端口号(比如80,3306等)也没有问题。否则就需要程序预先配置或者从环境变量读取。

连接集群外部服务

先了解下什么是EndPoint?EndPoint也是Kubernetes的资源,是一组IP和端口的抽象。服务通过Pod的选择器得到一组EndPoint。当客户端连接到服务时,服务代理选择一组EndPoint,将连接重定向过去。

创建一个不包含Pod选择器的服务,这样这个服务就没有EndPoint,然后,手动创建EndPoint,将外部服务的IP和Port赋值给EndPoint,并制定这个EndPoint属于之前那个服务。这样内部到服务的连接就会被重定向到外部服务。

为外部服务创建别名。创建一个新服务,type属性为ExternalName,然后执行externalName属性为外部域名。然后内部Pod就可以使用内部服务域名来访问外部服务了。ExternalName服务仅在DNS级别实施,为服务创建了简单的CNAME DNS记录,连接到服务的客户端将直接连接到外部服务,完全绕过代理。

这个功能的用途是,可以让只少数集群节点具有外网访问功能,创建External服务的时候指定节点选择器,放在有外网服务的节点上,其他Pod都没有外网访问权限。

将服务暴露给外部

使用NodePort。NodePort是服务的type属性,NodePort服务在每一个节点上打开一个端口(不管这个节点是否运行着服务的Pod),发给任何一个节点指定端口的连接,会被重定向到服务Pod中。这种方法太霸道,没啥必要的理由不要用。

使用LoadBalance服务。同样将服务的type指定为LoadBalance,将创建一个LoadBalance类型的服务,这种类型的服务通过集群提供的负载均衡器来转发连接,但是并不是所有集群都提供负载均衡器的。

通过Ingress暴露服务。Ingress是一种资源而不是一种服务类型。Ingress是工作在HTTP层的,因此可以解析HTTP协议,根据不同的主机和路径名路由到不同的服务。Ingress只需要一个公网IP就能为许多服务提供访问。

使用Ingress必须确保集群的Ingress控制器已经启用,可以通过addons查看。(基本上都会启用)

收起
保险 · 2019-12-30
浏览1206
和谐之声和谐之声  系统运维工程师 , 中银保信
[https://blog.csdn.net/cloudUncle/article/details/82937342显示全部
互联网服务 · 2019-12-30
浏览1276

提问者

sdsfan80
技术支持中国电信集团系统集成有限责任公司
擅长领域: 云计算私有云主机

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2019-12-30
  • 关注会员:4 人
  • 问题浏览:2025
  • 最近回答:2019-12-30
  • X社区推广