service的IP地址仅在集群内部可达,然而,总会有些服务需要暴露到外部网络中接受各类客户端的访问,此时就需要在集群的边缘为其添加一层转发机制,以实现外部流量进入到集群的service的资源之上,这种操作称为服务暴露。
主要包含以下几种类型:
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
ClusterIP
通过集群内部IP地址暴露服务,此地址仅在集群内部可达,而无法被集群外部的客户端访问,此为默认的service类型。
NodePort
这种类型是建立在ClusterIP基础上的,其在每个节点的IP地址的某静态端口(NodePort)暴露服务,因此,它依然会为Service分配集群IP地址,并将此作为NodePort的路由目标。
简单来说,NodePort类型就是在工作节点的IP地址选择一个端口用于将集群外部的请求转发至对应目标service的ClusterIP和Port,这种类型的资源还是可以和ClusterIP一样接受集群内部的请求,也可以受到集群外部客户端通过套接字来进行的请求。
kind: Service
apiVersion: v1
metadata:
name: myNodeport
apec:
type: NodePort
selector:
app: myNodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 32223
NodePort即节点Port,通常安装部署Kubernetes集群系统时会预留一个端口范围用于NodePort,默认为30000~32767之间的端口。
LoadBalancer
NodePort虽然能够于集群外部访问得到,但是外部客户端必须事先知道NodePort或集群中至少一个节点的IP地址,且当选定的节点发生故障时,客户端还得自行选择请求访问的其他节点,所以出现了该类型的service,这种结构是建立在NodePort类型之上的,其通过cloud Provider提供的负载均衡将服务暴露到集群外部,因此LoadBalancer一样具有NodePort和ClusterIP。
简而言之,一个LoadBalancer类型的service会指向关联至Kubernetes集群外部的、切实存在的某个负载均衡的设备,该设备通过工作节点之上的NodePort向集群内部发送请求流量。此类型的优势在于,它能够把来自于集群外部客户端的请求调度至所有节点(或部分节点)的NodePort之上,而不是依赖于客户端自己去决定连接到那台机器,从而避免了客户端由于指定的节点故障而导致服务不可用。
kind: Service
apiVersion: v1
metadata:
name: myLoadBalancer
apec:
type: LoadBlancer
selector:
app: myLoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 32223
用户还可以通过使用,spec.loadBalancerIP指定创建的负载均衡器使用的IP地址,spec.loadBalancerSourceRanges指定负载均衡器的客户端来源地址范围。
ExternalName
通过将service映射至由externalName字段的内容指定的主机名来暴露服务,此主机名需要被DNS服务解析至CNAME类型的记录。换言之,此种类型并非定义Kubernetes集群提供的服务,而是将集群外部的某服务以DNS CNAME记录的方式映射到集群内,从而让集群内的pod资源能够访问外部的service的一种实现方式。因此这种类型的service没有clusterIP和NodePort也没有标签选择器用于选择pod资源,因此也不会有EndPoints的存在了。
kind: Service
apiVersion: v1
metadata:
name: myExternalName
namespace: default
apec:
type: ExternalName
externalName: redis
ports:
- protocol: TCP
port: 6379
targetPort: 6379
nodePort: 0
selector: {}
参考书籍《Kubernetes进阶实战》
个人github账号:https://github.com/SpecialAll