service类型
clusterip,默认通过iptables形成一个vipheadless,为每个pod分配一个独有域名,访问svc时返回的是iplistloadbalancer,一般用于云厂商,需要cloud-provider支持external,用于引入外部域名解析,类似域名cname,需要dns支持nodeport,可以通过nodeport进行访问
clusterip实现
iptables
新增servcie,ip为:10.0.1.175(无法被ping),后端pod为3个kube-proxy会在所有node上写入iptables规则1
-A KUBE-SERVICES -d 10.0.1.175/32 -p tcp -m comment --comment "default/hostnames: cluster IP" -m tcp --dport 80 -j KUBE-SVC-NWV5X2332I4OT4T3
意思是目标为10.0.1.175端口为80的走KUBE-SVC-NWV5X2332I4OT4T3,查看一下1
2
3-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-WNBA2IHDGP2BOBGZ
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-X3P2623AGDH6CDF3
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -j KUBE-SEP-57KPRZ3JQVENLNBR
有三条对应的规则
第一条规则可能性是30%,第二条时只剩两条规则了,所以为50%,第三条之后就没了,所以不是random了,打开某一条对应规则1
2
3
4
5
6
7
8-A KUBE-SEP-57KPRZ3JQVENLNBR -s 10.244.3.6/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-57KPRZ3JQVENLNBR -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.244.3.6:9376
-A KUBE-SEP-WNBA2IHDGP2BOBGZ -s 10.244.1.7/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-WNBA2IHDGP2BOBGZ -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.244.1.7:9376
-A KUBE-SEP-X3P2623AGDH6CDF3 -s 10.244.2.3/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-X3P2623AGDH6CDF3 -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.244.2.3:9376
就是对应到相应的pod ip,后面就可以走路由规则进行同node或者跨node访问了
ipvs
iptables规则为每个pod生成规则,且iptables无法增量更新,每更新一个pod就要把全集群规则刷新一遍,集群规模较大的时候效率较低
引入ipvs
工作流程
每台
node上生成ipvs虚拟网卡,且为它分配Service VIP作为IP地址(意味着vip可以ping)1
2
3
4
5
66: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
link/ether 6e:e0:8a:3a:1b:f3 brd ff:ff:ff:ff:ff:ff
inet 10.96.0.1/32 brd 10.96.0.1 scope global kube-ipvs0
valid_lft forever preferred_lft forever
inet 10.97.43.84/32 brd 10.97.43.84 scope global kube-ipvs0
valid_lft forever preferred_lft forever每个
node创建一个ipvs虚拟主机,轮询算法,所以就可以把请求进行转发
1 | [@node-2 ~]# ipvsadm -ln |
- 不过
SNAT依旧需要iptables来做,单这样规则少很多