k8s kube-router+ipvs pod网络分析

  1. 集群中的每个节点上都有一个kube-bridge网桥,是部署k8s时创建的网桥,用于pod间通信
  2. k8s 利用veth pair和网桥实现容器通信,一端与pod绑定,一端绑定到kube-bridge上
    k8s kube-router+ipvs pod网络分析_第1张图片
  3. 每个容器里都有类似这种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了。

  1. k8s集群中的每个节点上的pod的网段都不同,那是如何通信的呢?
    k8s kube-router+ipvs pod网络分析_第2张图片
  2. 再看集群节点上的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

可以看到每个节点上都有这么几条路由,所以跨节点通信时,有了这些路由就能访问到集群中其它节点的容器了。

  1. 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            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
转发到的地址是什么呢,接着往下看。

  1. 查看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了。

你可能感兴趣的:(kuberbetes,kubernetes)