Docker Kubernetes Service 网络服务代理模式详解
Service
- service是实现kubernetes网络通信的一个服务
- 主要功能:负载均衡、网络规则分布到具体pod
注:kubernetes deployment服务分配服务器负载均衡VIP只能NODE节点单独访问,这里需要外网用户可以放问到容器内,这里就需要用到service。
网络代理模式
- kube-proxy v1.0中只支持userspace模式,在v1.1中,添加了iptables代理,在v1.2开始iptables是默认的。
- service为pod提供了一个统一的访问入口已userspace模式iptables模式,进行代理转发。
- userspace与iptables主要是实现对IP的转发。
userspace模式
1、NODE节点的客户端要访问service的代理IP+端口。
2、IP与端口是由kube-proxy维护的,它创建了IPtables一个规则。
3、请求经过IPtables后,再转发给kube-proxy端口。
4、kube-proxy关联后端的backend pod,将请求根据标签代理到指定的Backenpod。
注:Backend Pod:访问节点IP的指定端口,转发到后端的pod。kubectl get ep 可查看Backend Pod IP。
注:效率比较低,需要经过一次转发。
注:kube-proxy是使用的用户空间处理。
iptables模式
1、NODE节点客户端直接访问serviceIP,Linux根据Iptables协议栈规则策略匹配。
2、serviceIP根据标签直接访问Backendpod。
注:直接使用iptables 使用内核空间处理 速度快。
服务代理类型
ClusterIP
分配一个内部集群IP地址,只能在集群内部访问(同Namespace内的Pod),默认ServiceType。
NodePort
分配一个内部集群IP地址,并在每个节点上启用一个端口来暴露服务,可以在集群外部访问。
访问地址:<NodeIP>:<NodePort>
LoadBalancer
分配一个内部集群IP地址,并在每个节点上启用一个端口来暴露服务。
除此之外,Kubernetes会请求底层云平台上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。
ExternalName
通过CNAME将Service与externalName的值映射。要求kube-dns的版本为v1.7+。
拓扑图
nodeport:前端对用户代理使用nginx/LVS/HAProxy来做为负载均衡使用,代理每个NODE节点IP端口去访问pod。
LoadBalancer:主要通过云平台提供封装好的接口来做为负载均衡器进行代理转发。