k8s数据访问流
Kubernetes集群环境下,集群内应用负载间的数据访问流和集群外应用到集群内应用负载的数据访问流。
数据流与网络方案密切相关。目前,Kubernetes官网提供的网络解决方案有Calico、Cilium、Contiv-VPP、Flannel、Kube-router和Weave Net。业界使用较多的方案是Flannel和Calico。但从访问流程上看,Flannel更具有代表性。
集群内应用负载间的数据访问流
集群内数据访问流场景共包含4种:
同一Pod内应用负载间的数据访问流;
同一主机上不同Pod内应用负载间的数据访问流;
Pod所在主机与Pod内应用负载间的数据访问流;
不同主机上的Pod内应用负载间的数据访问流。
1. 同一Pod内应用负载间的数据访问流
同一Pod内应用负载间的数据访问流如下所示。
Pod中的容器都有一个虚拟以太网设备Veth0。该虚拟以太网设备的对端接入了Pod中的容器共用网络协议栈。容器0中虚拟以太网设备Veth0的对端为Vethx,容器n中虚拟以太网设备Veth0的对端为Vethy。同一Pod内应用负载间的数据访问流程具体如下。
1)容器0发起到容器n的访问请求,访问数据通过容器0中虚拟以太网设备Veth0发出。
2)容器0中虚拟以太网设备Veth0的对端Vethx通过Pod中的容器共用网络协议栈收到访问请求数据,并通过Pod中的容器共用网络协议栈将请求数据传输到容器n中虚拟以太网设备Veth0的对端Vethy。
3)容器n的虚拟以太网设备Veth0的对端Vethy收到容器0的访问请求数据,并将访问请求数据发给容器n。
4)容器n通过容器中的虚拟以太网设备Veth0收到容器0的访问请求数据。
接下来在目标Pod中的目标容器0就会对请求做出响应,并且沿着上述路径的相反路径返回。至此,同一Pod内应用负载间的数据访问流就结束了。
2. 同一主机上不同Pod内应用负载间的数据访问流
同一主机上不同Pod内应用负载间的数据访问流如下所示。
同一主机不同Pod内应用负载间的数据访问流具体如下。
1)源Pod中的源容器0发起向目标Pod中目标容器0的访问请求,访问请求数据通过源容器0内的虚拟以太网设备Veth0发出。
2)源Pod中的源容器0中的虚拟以太网设备Veth0的对端Vetha收到访问请求数据,并通过容器共用网络协议栈传输。
3)容器共用网络协议栈中的虚拟以太网设备Vethb收到访问请求数据,并将访问请求数据发出。
4)CNI0网桥上的虚拟以太网设备Vethc,即虚拟以太网设备Vethb的对端收到访问请求数据,并通过CNI0网桥将访问请求数据发往目标Pod中的目标容器0。
5)CNI0网桥上的虚拟以太网设备Vethd收到访问请求数据,并将访问请求数据发出。
6)容器共用网络协议栈中的虚拟以太网设备Vethe,即CNI0网桥的虚拟以太网设备Vethd的对端收到访问请求数据,并将访问请求数据发出。
7)容器共用网络协议栈中的Vethf,即目标Pod中的目标容器0中的虚拟以太网设备Veth0的对端收到访问请求,并将访问请求数据发出。
8)目标Pod中的目标容器0中的虚拟以太网设备Veth0收到访问请求数据。
接下来在目标Pod中的目标容器0就会对请求做出响应,并且沿着上述路径的相反路径返回。至此,同一主机上不同Pod内应用负载间的数据访问流就结束了。
3. Pod所在主机与Pod内应用负载间的数据访问流
Pod所在主机与Pod内应用负载间的数据访问流如下所示。
Pod所在主机与Pod内应用负载间的数据访问流具体如下。
1)在目标Pod所在主机上对目标Pod的目标容器0发起访问。
2)在宿主机网络协议栈中查找去往目标Pod中的目标容器0的路由,如果找到就根据路由将请求数据发往下一跳。
3)请求数据进入虚拟网桥Flannel.1,并将请求数据通过虚拟网桥Flannel.1中的虚拟以太网设备Vetha发出。
4)CNI0网桥中的虚拟以太网设备Vethb,即虚拟网桥Flannel.1的虚拟以太网设备Vetha的对端收到请求数据,并将请求数据发出。
5)CNI0网桥中的虚拟以太网设备Vethc收到请求数据,并将请求数据发出。
6)容器共用网络协议栈中的虚拟以太网设备Vethd,即虚拟网桥CNI0网桥中的虚拟以太网设备Vethc的对端收到请求数据,并将请求数据发出。
7)容器共用网络协议栈中的虚拟以太网设备Vethe收到请求数据,并将请求数据发出。
8)目标容器0中的虚拟以太网设备Veth0收到请求数据。
接下来目标容器0就会对请求做出响应,并且沿着上述路径的相反路径返回。至此,Pod所在主机与Pod内应用负载间的数据访问流就结束了。
4. 不同主机上Pod内应用负载间的数据访问流
不同主机上的Pod内应用负载间的数据访问流如下所示。
不同主机上Pod内应用负载间的数据访问流具体如下。
1)源Pod中的源容器0发起向目标Pod中的目标容器0的访问请求,访问请求数据通过源容器0中的虚拟以太网设备Veth0发出。
2)源Pod中的源容器0中的虚拟以太网设备Veth0对端Vetha收到访问请求数据,并通过容器共用网络协议栈传输。
3)容器共用网络协议栈中的虚拟以太网设备Vethb收到访问请求数据,并将访问请求数据发出。
4)CNI0网桥中的虚拟以太网设备Vethc,即虚拟以太网设备Vethb的对端收到访问请求数据,并通过CNI0网桥将访问请求数据发往目标Pod中的目标容器0。
5)CNI0网桥中的虚拟以太网设备Vethd收到访问请求数据,并将访问请求数据发出。
6)当访问请求数据进入虚拟网桥Flannel.1后,虚拟网桥Flannel.1中的虚拟以太网设备Vethe,即CNI0网桥中的虚拟以太网设备Vethd的对端接收到请求数据,并将请求数据发出。
7)虚拟网桥Flannel.1发出的请求数据被Flanneld进程拦截,然后Flanneld进程根据请求数据包头的目的地址在宿主机网络协议栈中查找相关路由。
8)因为该请求是跨主机的,Flanneld进程查找到相关路由,并将请求数据从本主机的网卡Vethf发往目标主机。
9)经过基础网络的传输,请求数据会到达目标主机的网卡Vethg。
在目标Pod中的目标容器0就会对请求做出响应,并且沿着上述路径的相反路径返回。至此,不同主机上Pod内应用负载间的数据访问流就结束了。
集群外应用到集群内应用负载的数据访问流
集群外应用到集群内应用负载的数据访问流场景共包含两种:
集群外应用到集群内Pod中应用负载的数据访问流;
集群内Pod中的应用负载到集群外应用的数据访问流。
1. 集群外应用到集群内Pod中应用负载的数据访问流
集群外应用到集群内Pod中应用负载的数据访问流如下所示。
集群外应用到集群内Pod中应用负载的数据访问流具体如下。
1)集群外的应用对目标Pod中的目标容器0发起访问。
2)访问请求数据被网关服务拦截。
3)网关服务根据请求数据包的目的地址在宿主机网络协议栈中查找相关路由。
4)网关服务查询的路由结果从集群网关节点发往集群中的目标Pod所在主机,并将请求数据从集群网关节点的虚拟以太网设备Vetha发出。
5)从集群网关节点发出的请求数据经过基础网络以及目标Pod所在主机的虚拟以太网设备Vethb到达目标Pod所在主机的网络协议栈。
6)根据请求数据包的目的地址,在目标Pod所在主机的网络协议栈中查找相关路由,并根据路由将请求数据包发送给Flannel进程,然后Flannel进程对请求数据包处理,并将处理后的请求数据包发往虚拟网桥Flannel.1。
7)虚拟网桥Flannel.1在收到请求数据之后,通过虚拟以太网设备Vethc将请求数据发出。
8)CNI0网桥中的虚拟以太网设备Vethd,即虚拟网桥Flannel.1的虚拟以太网设备Vethc的对端收到请求数据,并将请求数据发出。
9)CNI0网桥中的虚拟以太网设备Vethe收到请求数据,并将请求数据发出。
10)容器共用网络协议栈中的虚拟以太网设备Vethf,即虚拟网桥CNI0网桥中虚拟以太网设备Vethe的对端收到请求数据,并将请求数据发出。
11)容器共用网络协议栈中的虚拟以太网设备Vethg收到请求数据,并将请求数据发出。
12)目标容器0中的虚拟以太网设备Veth0收到请求数据。
接下来,目标容器0就会对请求做出响应,并且沿着上述路径的相反路径返回。至此,集群外应用到集群内Pod中应用负载的数据访问流就结束了。
2. 集群内Pod中的应用负载到集群外应用的数据访问流
关于集群内Pod中的应用负载到集群外应用的数据访问流,可参考集群外应用到集群内Pod中应用负载的数据访问流,即将集群外应用到集群内Pod中应用负载的数据访问流反转过来即可。