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如何转发
访问Service的请求,不论是Cluster IP+TargetPort的方式;还是用Node节点IP+NodePort的方式,都被Node节点的Iptables规则DNAT到Kube-proxy监听Service服务代理端口。kube-proxy接收到Service的访问请求后,根据负载策略,转发到后端的Pod。
不足:kube-proxy 目前仅支持 TCP 和 UDP,不支持 HTTP 路由,并且也没有健康检查机制。这些可以通过自定义 Ingress Controller的方法来解决。
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的服务性能。
最后更新于
这有帮助吗?