一、Service
1.service基本介绍
service为一组提供服务的pod提供抽象的稳定的网络访问地址,主要用于网络服务,通过service定义,为客户端提供访问地址和负载均衡,屏蔽endport的变化。
在 kubernetes 中,pod 的IP 地址是动态变化的,因此无法直接通过 pod 的IP 地址进行访问。service的出现正式为了解决找个问题的。service 会为一组 pod 创建一个虚拟的 IP 地址,通过这个 IP 地址可以访问这组 pod 中的任意一个 pod。当客户端请求这个虚拟 IP 地址时,请求会被负载均衡到一组 pod 中的某一个 pod 上,从而完成对 pod 的访问。
service 的实现依赖于 kube-proxy 组件。kube-proxy 会在每个节点上监听 service 的变化,一旦有 service 发生变化,kube-proxy 会更新本地的 iptables 规则,从而实现流量的转发和负载均衡。
另外,service 还与 CoreDNS 有关。CoreDNS 是 kubernetes 集群中的 DNS 解析服务。在 kubernetes中 service 的虚拟 IP 地址还会注册到 coreDNS 中,从而使得客户端还可以通过service 名称访问service 的虚拟 IP 地址。在 service 的定义中,可以通过 spec,selector 字段指定哪些 pod 属于这个service,这样,就可以将请求负载均衡到这些 pod 中。
总之,service 是 kubernetes 中一种非常重要的资源对象,它可以让 pod 对外提供服务,并提供负载均衡、服务发现等功能。servie的实现依赖于kube-proxy 和CoreDNS组件,他们共同协作,将 service与 pod 连接起来,实现对 pod 的代理访问,如下图所示。
2.service负载均衡
当service在kubernetes集群定义出来现之后,客户端就可以通过服务IP访问到Pod容器提供的服务,服务IP和后端Pod负载均衡机制,由node上kube-proxy实现。
kube-proxy代理模式:userspace,iptables,ipvs和kernelspace。
(1)userspace
起初,kube-proxy进程是一个真实的TCP/UDP代理,当某个pod以clusterIP 方式访问某个service的时候,这个流量会被 pod 所在的本机的 iptables 转发到本机的 ube-proxy 进程,然后将请求转发到后端某个 pod 上。具体过程为:
- kube-proxy 为每个 service 在 node 上打开一个随机端口作为代理端口
- 建立 iptables 规则,将 clusterip 的请求重定向到代理端口(用户空间)
- 到达代理端口的请求再由 kubeproxy 转发到后端
clusterip 重定向到 kube-proxy 服务的过程存在内核态到用户态的切换,开销很大,因此有了iptables 模式,而 userspace 模式也被废弃了。
(2)iptables
k8s在1.2版本之后iptables作为默认模式,kube-proxy不在起到proxy作用。主要功能是:通过API Server 的 watch 接口实时跟踪 Service 和 Endpoint 的变更信息,并更新对应的 iptables 规则,client 的请求流量通过 iptables 的 NAT 机制“直接路由”到目标 Pod。
不同于 userspace,在 iptables 的模式中,kube-proxy 不再负责转发数据包,kube-proxy 主要完成对 iptables 策略的动态管理。数据包的走向完全由 iptables 规则决定,这样的过程不存在内核态到用户态的切换,效率明显会高很多。但是随着 service 的增加,iptables 规则会不断增加,导致内核十分繁忙(等于在读一张很大的没建索引的表)。
(3) ipvs
主要用于高性能负载均衡,使用高效数据结构Hash表,允许无线扩张规模,提供的算法:rr,lc,df,sh,sed(预计延迟时间最短),nq(从不排队)
(4)kernelspace
在windows进行代理模式
3.service的四种类型
(1)Cluster IP
为Pod提供一个虚拟IP地址,其他Pod访问service,只需要访问该虚拟IP地址,k8s自动将请求路由到相应的Pod上。
(2)Nodeport
将Pod公开为集群中所有节点的端口,当请求到任何一个节点上的端口上,kubernetes会将请求路由到相应Pod上。
(3) LoadBalancer
使用云端提供商进行负载均衡将请求路由到后端Pod,kubernetes会自动创建和配置负载均衡器,绑定到service上。
(4)ExternalName
将service映射到外部域名地址。