女主宣言
Kubernetes Serivce是一组具有相同label Pod集合的抽象(可以简单的理解为集群内的LB),集群内外的各个服务可以通过Service进行互相通信。但是Service的类型有多种,每种类型的Service适合怎样的场景以及kube-proxy是如何实现Service负载均衡的将是本文讨论的重点。
PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!
1
Service和kube-proxy在kubernetes集群中的工作原理
在介绍Service和kube-proxy之前,先绍下它们在Kubernetes集群中所起到的作用。

让我们分析下上面这张图:
1. 运行在每个Node节点的kube-proxy会实时的watch Services和 Endpoints对象。
当用户在kubernetes集群中创建了含有label的Service之后,同时会在集群中创建出一个同名的Endpoints对象,用于存储该Service下的Pod IP. 它们的关系如下图所示:

2.每个运行在Node节点的kube-proxy感知到Services和Endpoints的变化之后,会在各自的Node节点设置相关的iptables或IPVS规则,用于之后用户通过Service的ClusterIP去访问该Service下的服务。
3.当kube-proxy把需要的规则设置完成之后,用户便可以在集群内的Node或客户端Pod上通过ClusterIP经过iptables或IPVS设置的规则进行路由和转发,最终将客户端请求发送到真实的后端Pod。
对于kube-proxy如何设置Iptables和IPVS策略后续会讲。接下来先介绍下每种不同类型的Service的使用场景。
2
Service 类型
当前Kubernetes Service支持如下几种类型,并在介绍类型的同时便可以了解每种类型的Service的具体使用场景。
ClusterIP
ClusterIP类型的Service是Kubernetes集群默认的Service, 它只能用于集群内部通信。不能用于外部通信。
ClusterIP Service类型的结构如下图所示:

NodePort
如果你想要在集群外访问集群内部的服务,你可以使用这种类型的Service。NodePort类型的Service会在集群内部的所有Node节点打开一个指定的端口。之后所有的流量直接发送到这个端口之后,就会转发的Service去对真实的服务进行访问。
NodePort Service类型的结构如下图所示:

LoadBalance