3. kube-proxy是如何转发流量

此开源图书由ithaiq原创,创作不易转载请注明出处

  • iptables基础

mangle表: 为数据包设置标记(较少使用)

nat表: 修改数据包中的源、目标IP地址或端口

DNAT让外网用户访问局域网内不同的服务器。(相当于SNAT的反向代理)

SNAT 能够让多个内网用户通过一个外网地址上网,解决了IP资源匮乏的问题

filter表: 确定是否放行该数据包(过滤)默认

security表: 很少用 selinux相关

规则表的先后顺序:raw→mangle→nat→filter

规则链的先后顺序:

入站顺序: PREROUTING→INPUT

出站顺序: OUTPUT→POSTROUTING

转发顺序: PREROUTING→FORWARD→POSTROUTING

  • kube-prxoy如何转发

  1. 访问Service的请求,不论是Cluster IP+TargetPort的方式;还是用Node节点IP+NodePort的方式,都被Node节点的Iptables规则DNAT到Kube-proxy监听Service服务代理端口。kube-proxy接收到Service的访问请求后,根据负载策略,转发到后端的Pod。

  2. 不足:kube-proxy 目前仅支持 TCP 和 UDP,不支持 HTTP 路由,并且也没有健康检查机制。这些可以通过自定义 Ingress Controller的方法来解决。

  3. kube-proxy默认使用的是iptables模式,通过各个node节点上的iptables规则来实现service的负载均衡,但是随着service数量的增大,iptables模式由于线性查找匹配、全量更新等特点,其性能会显著下降。大规模集群中使用iptables,每增加一个svc都会增加一条iptables的chain。并且iptables修改了规则后必须得全部刷新才可以生效。从k8s的1.8版本开始,kube-proxy引入了IPVS模式,使用的话要加载ipvs的内核模块。IPVS模式与iptables同样基于Netfilter,但是采用的hash表,因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能。

最后更新于

这有帮助吗?