k8s kube-router+ipvs pod网络分析
集群中的每个节点上都有一个kube-bridge网桥,是部署k8s时创建的网桥,用于pod间通信k8s 利用veth pair和网桥实现容器通信,一端与pod绑定,一端绑定到kube-bridge上每个容器里都有类似这种route:DestinationGatewayGenmaskFlags Metric RefUse Iface0.0.0.012.0.2.10.0.0.0UG0 .
·
- 集群中的每个节点上都有一个kube-bridge网桥,是部署k8s时创建的网桥,用于pod间通信
- k8s 利用veth pair和网桥实现容器通信,一端与pod绑定,一端绑定到kube-bridge上
- 每个容器里都有类似这种route:
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 12.0.2.1 0.0.0.0 UG 0 0 0 eth0
12.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
容器中的网卡就是veth pair的一端,另一端绑定在kube-bridge
[root@node130 ~]# brctl show
bridge name bridge id STP enabled interfaces
kube-bridge 8000.5ecc89af5358 no veth05f0e8ae
veth068ea685
veth0f302518
veth1010624e
veth19061adb
veth3981c04c
veth432b0357
veth57be7c78
由上面条件可知,pod间在同一个节点上的通信通过kube-bridge就ok了。
- k8s集群中的每个节点上的pod的网段都不同,那是如何通信的呢?
- 再看集群节点上的route
Destination Gateway Genmask Flags Metric Ref Use Iface
12.0.0.0 10.124.242.131 255.255.255.0 UG 0 0 0 enp216s0f2
12.0.1.0 10.124.242.132 255.255.255.0 UG 0 0 0 enp216s0f2
12.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 kube-bridge
可以看到每个节点上都有这么几条路由,所以跨节点通信时,有了这些路由就能访问到集群中其它节点的容器了。
- svc cluster IP 是如何工作的?
其实cluster ip是完全虚拟的,节点上根本没有这ip,ipvs会用到这个地址,作为一个vip
[root@node130 ~]# kubectl get svc -n test
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
test ClusterIP 12.0.182.73 <none> 5432/TCP 11d
如何通过svc访问到后面的pod的呢?
这里ipvs场景为例:
[root@node130 ~]# ipvsadm -Ln | grep 12.0.182.73 -A 2
TCP 12.0.182.73:5432 rr
-> 12.0.0.98:5432 Masq 1 0 0
-> 12.0.2.131:5432 Masq 1 0 0
通过ipvs的规则可以看到到12.0.182.73:5432的请求会被ipvs转到12.0.0.98:5432或12.0.2.131:5432
转发到的地址是什么呢,接着往下看。
- 查看svc的endpoints:
[root@node130 ~]# kubectl get endpoints test -n test
NAME ENDPOINTS AGE
test 12.0.1.93:5001,12.0.2.132:5001 11d
可以看到svc的后面是两个pod
[root@node130 ~]# kubectl get pods -n test -o wide | grep 12.0.1.93
test-749dd49bb4-m2v6c 1/1 Running 6 9d 12.0.1.93 node132
[root@node130 ~]# kubectl get pods -n test -o wide | grep 12.0.2.132
test-749dd49bb4-wjsrm 1/1 Running 6 9d 12.0.2.132 node130
经过上面的流程,通过cluster ip 就能访问到后端的pod了。
更多推荐
已为社区贡献2条内容
所有评论(0)