service类型
clusterip
,默认通过iptables
形成一个vip
headless
,为每个pod
分配一个独有域名,访问svc
时返回的是iplist
loadbalancer
,一般用于云厂商,需要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
来做,单这样规则少很多