k8s ipvs

发布时间 2023-09-27 16:38:21作者: 最后一天

1.DNAT是destination network address translation的缩写,即目标网络地址转换.

典型的应用是,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip,互联网上的访问者使用公网ip来访问这个网站, 当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网ip,防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip, 然后再把这个数据包发送到内网的web服务器上,这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了,即DNAT,基于目标的网络地址转换。

2.SNAT是source network address translation的缩写,即源地址目标转换。 比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候, 路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接到访问请求的时候, 他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip,这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了,所以叫做SNAT,基于源地址的地址转换。

3.MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT。 MASQUERADE 的作用和 SNAT 一样,区别是它不需要指定 --to-source。MASQUERADE 专门用于动态获取IP地址的连接,比如,拨号上网、DHCP连接等。 MASQUERADE(伪装)会自动获取网卡上的 IP 地址,而不用像 SNAT 那样需要使用 --to-source 指定,当 IP 发生变化时不需要手动改动。当网卡 down 掉时,MASQUERADE 不会保留任何相关的 conntrack 记录,如果我们使用 SNAT target,conntrack 记录是被保留下来的,直到被超时 GC,这会占用很多连接跟踪的内存。 注意,MASQUERADE 和 SNAT一样,只能用于 nat 表的 POSTROUTING链。

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

IPVS 模式详解

ipvs 模式中参与数据转发的内核工具包括: ipvs:将数据包 DNAT iptables:将数据包 DROP、masquared(ipvs 模式中,iptables 规则数量是恒定的) ipset:iptables 的辅助工具

k8s ipvs

iptables 做SNAT masquared IPVS 做DNAT

iptables的四表五链: 四表:Filter表、Nat表、Managle表、row表

五链:

INPUT链 :处理输入数据包 OUTPUT链 :处理输出数据包 FORWARD链 :处理转发数据包 PREROUTING链 :用于目标地址转换(DNAT) POSTOUTING链 :用于源地址转换(SNAT)

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

kube-proxy 不足

IPVS 模式也会使用 iptables 来执行 SNAT 和 IP 伪装(MASQUERADE),并使用 ipset 来简化 iptables 规则的管理:

 

ipset 名成员用途
KUBE-CLUSTER-IP All service IP + port Mark-Masq for cases that masquerade-all=true or clusterCIDR specified
KUBE-LOOP-BACK All service IP + port + IP masquerade for solving hairpin purpose
KUBE-EXTERNAL-IP service external IP + port masquerade for packages to external IPs
KUBE-LOAD-BALANCER load balancer ingress IP + port masquerade for packages to load balancer type service
KUBE-LOAD-BALANCER-LOCAL LB ingress IP + port with externalTrafficPolicy=local accept packages to load balancer with externalTrafficPolicy=local
KUBE-LOAD-BALANCER-FW load balancer ingress IP + port with loadBalancerSourceRanges package filter for load balancer with loadBalancerSourceRanges specified
KUBE-LOAD-BALANCER-SOURCE-CIDR load balancer ingress IP + port + source CIDR package filter for load balancer with loadBalancerSourceRanges specified
KUBE-NODE-PORT-TCP nodeport type service TCP port masquerade for packets to nodePort(TCP)
KUBE-NODE-PORT-LOCAL-TCP nodeport type service TCP port with externalTrafficPolicy=local accept packages to nodeport service with externalTrafficPolicy=local
KUBE-NODE-PORT-UDP nodeport type service UDP port masquerade for packets to nodePort(UDP)
KUBE-NODE-PORT-LOCAL-UDP nodeport type service UDP port withexternalTrafficPolicy=local accept packages to nodeport service withexternalTrafficPolicy=local