Pod中的Container启动时,会分配一个Pod网段中的IP地址(network_cidr ),但是这个IP地址是浮动的(ephemeral),Pod重启,就可能换一个新的IP,所以,通常情况下,Pod之间不会用Pod的IP地址直接通信。K8S中使用Service来访问Pod。


一个Service是一组Pod的抽象(通过Selector聚合在一起), K8S给每个Pod一个IP地址(叫做backend),给所有的这组Pod一个总的IP(service_cluster_ip_range)和一个DNS名字,并且能把发到这个名字的网络信息流负载均衡到所有的后端。这个IP和DNS名字就是Service。 



ClusterIP

Service有很多种类型,默认是ClusterIP,如下:


ClusterIP


一个Pod如果想和自己通信,只需要用localhost即可。如果想用别的Pod的服务,就要知道别的Pod对应的Serice的DNS名称,解析到期ClusterIP。 ClusterIP会被每个Node上的Kube Proxy修改iptables和ipvs等路由信息,这样保证发往ClusterIP的IP包,实际上被发往在这个Node上的Pod的IP地址和端口。



注意:这里的ClusterIP是内部IP地址,不是Node公网地址,K8S外部不能访问


NodePort

NodePort是在ClusterIP之上建造的Service。

如果想让外网访问Pod的业务,最简单的办法就是通过Node的公网地址,生成一个NodePort类型的Service. 本质就是把ClusterIP Service暴露到集群中所有Node的高端端口(default 30000-32767)。 所有的Node都会监这个端口,即使这个Node中没有这个service的Pod,如果设置了.spec.externalTrafficPolicy属性是local,则只有运行Pod的Node会监听,这样就避免了多跳一次。



NodePort with Cluster externalTrafficPolicy


如果有一个4层负载均衡,并且要从外网方位K8S中的服务,就需要是指负载均衡,把业务数据分发到所有的有Pod的Node上对应的NodePord的端口,并且能够通过健康检查,来动态获得哪些工作Node上有对应的Pod。

NodePort with Local externalTrafficPolicy


LoadBalancer


LoadBanlancer是在NodePort之上建造的服务,他能够自动设置私有云或者共有云提供的负载均衡,把NodePort暴露给外网,并且动态监听哪些Pod在哪些工作Node上。


loadbalancer service type with AWS