1  Service 本质上就是 kube-proxy组件 和 Iptables rules/ipvs 的共同结果

在 Kubernetes 中,使用 YAML 声明 Service 时,默认情况下 Service 使用的是 iptables 模式进行负载均衡。
不过,这一默认行为并非由 YAML 文件本身定义,而是由 Kubernetes 集群的配置决定。
如果需要切换到 ipvs 模式,需要在集群配置层面进行调整,例如通过修改 kube-proxy 的启动参数来启用 ipvs 模式。
YAML 文件主要用于定义 Service 的基本信息,如名称、类型、端口映射等,而不直接涉及负载均衡的实现细节。

2  Service 在K8S中的作用:

Service 将pod暴露给外界访问(pod随时被新建,IP不稳定。Service稳定提供VIP)
被service筛选到的pod : 就是service的Endpoints 
service + deployment : 将pod采用负载均衡的方式给外界访问
service + statefulset : 有状态的pod是基于Service DNS维持状态不变的。

3  Service 被访问的方式:

(1)service VIP  (注意:IPVS模式下,VIP是集群自动分配的,这个VIP绑定虚拟网卡)
(2)Service DNS记录
          (2.1) DNS记录解析后对应Service VIP 
          (2.2) DNS记录解析后对应具体的某一个pod的IP地址
                      例子:service匹配3个pod, 当解析DNS记录的时候,3次返回的IP值都不同。
                   (轮询调度到每一个pod作为A记录)
注意: ipvs 是linux内核的模块之一 (而iptables是作为程序运行在用户态)

4  Service(ipvs)被创建的过程 及工作原理

Service 本质上就是 kube-proxy组件 和 Iptables rules 的共同结果 
(1)用户提交service.yaml 
 (2)APIServer负责处理K8S集群中所有的REST API请求 
          kubectl将yaml请求发送到APIServer
(3)APIServer 接收到请求后 :
(3.1)验证service定义  ---符合--- K8S的资源模型  K8S的资源策略
(3.2)验证通过后,将service定义存储到ETCD
(4)存储到ETCD之后
(4.1)APIServer 通知 kube-proxy组件,
kube-proxy根据service定义在宿主机上设置负载均衡  (通过用户态操作更新内核态的IPVS规则)
(规则的处理在内核态:将被代理pod的IP地址设置为IPVS的三个虚拟主机规则)
kube-proxy根据service定义在宿主机上设置转发的网络规则 (ipvs模式转发和iptables是一样的)

-A KUBE-SERVICES -d 10.0.1.175/32 -p tcp -m comment --comment "default/hostnames:default cluster IP" -m tcp -dport 80 -j KUBE-SVC-NWV5X2332L4OT4T3 
表示: 所有目标地址是10.0.1.175 目的端口是80的IP包,都跳转到KUBE-SVC-NWV5X2332L4OT4T3 链处理

10.0.1.175就是Service的VIP

(4.2)APIServer 通过kube-controller-manager组件 中的endpoint controller 
endpoint controller 控制器 按照配置筛选POD
将pod的IP地址 和 端口 更新到Service 的Endpoint对象中

5   集群内部通过Service VIP访问pod运行原理

客户端通过VIP和Service的端口发送请求
Kubernetes的kube-proxy组件会根据Service的配置,利用iptables或ipvs规则(经过DNAT转换),将请求流量分发到后端的Pod上。
(DNAT: 数据包的目的地址 从VIP转换为后端的POD的ip地址和端口)

6  Kubernetes 的 Service 的负载均衡策略及工作模式如下:

iptables 模式
负载均衡策略 :默认情况下,Service 采用随机选择的方式将流量分发到各个后端 Pod。
工作模式 :
当用户提交 Service 定义后,API Server 验证通过将其存储到 ETCD。
kube-proxy 监听到 Service 变化后,通过调用 iptables 的 API,在宿主机上为该 Service 设置一系列转发规则。
这些规则会将发送到 Service 虚拟 IP 的流量,随机重定向到后端某个 Pod 的 IP 和端口上,实现负载均衡。


ipvs 模式
负载均衡策略 :支持多种策略,包括轮询、最少连接、加权轮询、加权最少连接、最短期望延迟、加权最短期望延迟、目标哈希、源目标哈希等。
工作模式 :
当用户提交 Service 定义后,API Server 验证通过将其存储到 ETCD。
kube-proxy 通过 IPVS 模块创建规则,将流量从 Service IP 重定向到端点 IP。
IPVS 基于 netfilter 回调函数,使用哈希表作为底层数据结构,直接在内核空间中生效
当客户端请求到达 Service 的虚拟 IP 时,IPVS 根据配置的负载均衡算法,将请求分发到后端合适的 Pod,实现高效的服务负载均衡。
并且由于 IPVS 的查找复杂度为 O(1),与集群规模无关,使其在大规模集群中性能更优。
 

更多推荐