- ClusterIP:Kubernetes默认会自动设置Service的虚拟IP地址,仅可供集群内部的客户端应用访问,可以手动设置一个ClusterIP地址,需要保证该IP地址在kubernetes集群设置的ClusterIP范围内,并没有被其它Service使用
- NodePort:将Service的端口映射到每个Node的一个端口号上,这样集群中的任意Node都可以作为Service的访问入口地址,即NodeIP:NodePort
- LoadBalancer:将Service映射到一个已经存在的负载均衡器的IP地址上,通常在公有云使用
- ExternalName:将Service映射为一个外部域名地址,通常在ExternalName字段设置
二、NodePort
apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
ports:
- port: 8081 #Service所需的虚拟端口号
targetPort: 8080 #指定后端Pod的端口号
nodePort: 8081 #映射到Node的端口号
selector:
app: webapp
在默认情况下,Node的kube-proxy会在全部网卡(0.0.0.0)上绑定NodePort端口。
在很多数据中心环境,一台主机会配置多块网卡,作用各不相同(例如存在业务网卡和管理网卡等)。在Kubenetes1.10版本开始,kube-proxy可以通过设置特定的IP地址将NodePort绑定到特定的网卡上,而无需绑定在全部网卡上,其设置方式为为配置启动参数“--nodeport-address”,指定需要绑定的网卡IP地址,多个地址之间使用逗号隔开。
--nodeport-addresses=10.0.0.0/8,192.168.18.0/24
#仅在10.0.0.0/8和192.168.0/24对应的网卡上绑定NodePort端口号,其他IP地址不会绑定
如果用户在Service定义中不设置具体的nodePort端口号,Kubernetes会自动分配一个Nodeport范围内可用的端口号。
三、LoadBalancer类型
通常在公有云环境中设置Service为“LoadBalancer”,可以将Service映射到公有云提供的某个负载局衡器的IP地址上,客户端通过负载均衡器的IP地址和端口号就可以访问到具体的服务,无须再通过kube-proxy提供的负载均衡器机制进行流量转发。公有云提供的LoadBalancer可以直接将流量转发到后端Pod上,而负载均衡分发机制依赖于公有云服务上具体实现。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalaner
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
clusterIP: 10.0.171.239
在服务创建之后,云服务商会在Service的定义中补充LoadBalancer的IP地址(status字段)
status:
loadBalancer:
ingress:
- ip: 192.0.2.128
缺点: 每一个LoadBalancer暴露的服务都有它自己的IP地址和端口号,不能一个ip地址就可以访问所有的服务。
四、ExternalName
ExternalName类型的服务用于将集群外的服务定义为kubernetes的集群Service,并且通过externalName自动指定外部服务的地址,可以使用域名或IP格式。集群内的客户端应用通过访问这个Service就能访问外部服务了。这种类型的Service没有后端Pod,无需LabelSelector。
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.databases.example.com
设置服务名字为my-service,所在的命名空间为prod,客户端访问服务地址my-service.prod.svc.cluster.local时,系统将自动指向外部域名my.databases.example.com。还可以通过Ingress将服务暴露到集群外部。