Kubernetes--服务暴露 Service类型
Service的IP地址仅在集群内可达,然而,总会有些服务需要暴露到外部网络中接受各类服务端的访问,例如分层架构应用中的前端Web应用程序等。此时,就需要在集群的边缘为其添加一层转发机制,以实现将外部请求流量接入到集群的Service资源之上,这种操作也称为发布服务到外部网络中。
Service类型
Kubernetes的Service共有四种类型:ClusterIP、NodePort、LoadBalancer和ExternalName。
-
ClusterIP:通过集群内部IP地址暴露服务,此地址仅在集群内部可达,而无法被集群外部的客户端访问。
-
NodePort:这种类型建立在ClusterIP类型之上,其在每个节点的IP地址的某静态端口(NodePort)暴露服务,因此,他依然会为Service分配集群IP地址,并将此作为NodePort的路由目标。简单来说,NodePort类型就是在工作节点的IP地址上选择一个端口用于将集群外部的用户请求转发至目标Service的ClusterIP和Port,因此,这种类型的Service既可如ClusterIP一样受到集群内部客户端Pod访问,也会受到集群外部客户端通过套接字:进行的请求。
-
LoadBalancer:这种类型建构在NodePort类型之上,其通过cloud provider提供的负载均衡器将服务暴露到集群外部,因此LoadBalancer一样具有NodePort和ClusterIP。简而言之呢就是一个LoadBalancer类型的Service会指向关联至Kubernetes集群外部的、切实存在的某个负载均衡设备,该设备通过工作节点之上的NodePort向集群内部发送请求流量。
此类型的优势在于,它能够把来自于集群外部客户端的请求调度至所有节点(或部分节点)的NodePort之上,而不是依赖于客户端自行决定连接至哪个节点,从而避免了因客户端指定的节点故障而导致的服务不可用。
ExternalName:其通过将Service映射至由externalName字段的内容指定的主机名来暴露服务,此主机名需要被DNS服务解析至CNAME类型的记录。换言之~此种类型并非定义由Kubernetes集群提供的服务,而是把集群外部的某服务以DNS CNAME记录的方式映射到集群内,从而让集群内的Pod资源能够访问外部的Service的一种实现方式。因此,这种类型的Service没有ClusterIP和NodePort,也没有标签选择器用于选择Pod资源,因此也不会有Endpoints存在。
在前面文章中Kubernetes--Service资源的基础应用创建的myapp-svc即为默认的ClusterIP类型Service资源,它仅能接受来自于集群中的Pod对象中的客户端程序的访问请求。如若需要将Service资源发布至网络外部,应该将其配置为NodePort或LoadBalancer类型的Service资源,而若要把外部的服务发布于集群内容供Pod对象使用,则需要定义一个ExternalName类型的Service资源。【如若使用kube-dns,那么这种类型的实现将依赖于1.7及其以上版本的Kubernetes版本。】