VxLAN技术演进
VxLAN的技术演进
- 二层通信 - 基于目标mac地址通信,不可夸局域网通信,通常是由接入交换机或汇聚交换机实现报文转发。
- VLAN(Virtual Local Area Network)- 即虚拟局域网,是将一个物理(交换机)的网络在逻辑上划分成多个广播域的通信技术,VLAN内的主机间可以直接通信,而VLAN网络外的主机需要通过三层网络设备转发才可以通信,因此一个vlan可以将服务器的广播报文限制在一个VLAN内,从而降低单个网络环境中的广播报文,vlan采用12位标识vlan ID,即一个交换机设备最多为2^12=4096个vlan。
- 三层通信 - 服务机>局域网(一层)>接入/汇聚交换机(二层)>核心交换机(二层)>路由器(三层)
- VxLAN - VxLAN全称是Virtual eXtensible Local Area Network(虚拟扩展本地局域网),主要有Cisco推出,vxlan是一个 VLAN 的扩展协议,是由IETF定义的NVO3(Network Virtualization over Layer 3)标准技术之一,VXLAN的特点是将L2的以太帧封装到UDP报文(即L2 over L4)中,并在L3网络中传输,即使用MAC in UDP的方法对报文进行重新封装, VxLAN 本质上是一种overlay的隧道封装技术,它将L2的以太网帧封装成L4的UDP数据报,然后在L3的网络中传输,效果就像L2的以太网帧在一个广播域中传输一样,实际上L2的以太网帧跨越了L3网络传输,但是缺不受L3网络的限制,vxlan采用24位标识vlan ID号,因此可以支持2^24=16777216个vlan,其可扩展性比vlan强大的多,可以支持大规模数据中心的网络需求。
overlay架构及示例
overlay设备
- VTEP - VTEP(VXLAN Tunnel Endpoint vxlan隧道端点),VTEP是VXLAN网络的边缘设备,是VXLAN隧道的起点和终点,VXLAN对用户原始数据帧的封装和解封装均在VTEP上进行,用于VXLAN报文的封装和解封装,VTEP与物理网络相连,分配的地址为物理网IP地址,VXLAN报文中源IP地址为本节点的VTEP地址,VXLAN报文中目的IP地址为对端节点的VTEP地址,一对VTEP地址就对应着一个VXLAN隧道,服务器上的虚拟交换机(隧道flannel.1就是VTEP),比如一个虚拟机网络中的多个vxlan就需要多个VTEP对不同网络的报文进行封装与解封装。
- VNI - VNI(VXLAN Network Identifier):VXLAN网络标识VNI类似VLAN ID,用于区分VXLAN段,不同VXLAN段的虚拟机不能直接二层相互通信,一个VNI表示一个租户,即使多个终端用户属于同一个VNI,也表示一个租户。
- NVGRE - NVGRE:Network Virtualization using Generic Routing Encapsulation,主要支持者是Microsoft,与VXLAN不同的是,NVGRE没有采用标准传输协议(TCP/UDP),而是借助通用路由封装协议(GRE),NVGRE使用GRE头部的低24位作为租户网络标识符(TNI),与VXLAN一样可以支持1777216个vlan。
overlay通信
- 过程:
- VM A发送L2 帧与VM请求与VM B通信。
- 源宿主机VTEP添加或者封装VXLAN、UDP及IP头部报文。
- 网络层设备将封装后的报文通过标准的报文在三层网络进行转发到目标主机。
- 目标宿主机VTEP删除或者解封装VXLAN、UDP及IP头部。
- 将原始L2帧发送给目标VM。
overlay通信示例
总结:Overlay - 基于VXLAN、NVGRE等封装技术实现overlay叠加网络
underlay架构及示例
Underlay网络
- Underlay网络就是传统IT基础设施网络,由交换机和路由器等设备组成,借助以太网协议、路由协议和VLAN协议等驱动,它还是Overlay网络的底层网络,为Overlay网络提供数据通信服务。容器网络中的Underlay网络是指借助驱动程序将宿主机的底层网络接口直接暴露给容器使用的一种网络构建技术,较为常见的解决方案有MAC VLAN、IP VLAN和直接路由等。
underlay实现模式
- Mac Vlan模式 - 支持在同一个以太网接口上虚拟出多个网络接口(子接口),每个虚拟接口都拥有唯一的MAC地址并可配置网卡子接口IP。(左图)
- IP VLAN模式 - 类似于MAC VLAN,它同样创建新的虚拟网络接口并为每个接口分配唯一的IP地址,不同之处在于,所有虚拟接口共享物理接口的MAC地址。(右图)
MAC Vlan工作模式
- Private(私有)模式 - 在Private模式下,同一个宿主机下的容器不能通信,即使通过交换机再把数据报文转发回来也不行。
- VEPA模式 - 虚拟以太端口汇聚器(Virtual Ethernet Port Aggregator,简称VEPA),在这种模式下,macvlan内的容器不能直接接收在同一个物理网卡的容器的请求数据包,但是可以经过交换机的(端口回流)再转发回来可以实现通信。
- passthru(直通)模式 - Passthru模式下该macvlan只能创建一个容器,当运行一个容器后再创建其他容器则会报错。
- bridge模式 - 在bridge这种模式下,使用同一个宿主机网络的macvlan容器可以直接实现通信,推荐使用此模式。
总结:underlay- 基于Docker宿主机物理网卡的不同子接口实现多个虚拟vlan,一个子接口就是一个虚拟vlan,容器通过宿主机的路由功能和外网保持通信。
kubernetes-pod通信
CNI通用模式
- Overlay网络
- Flannel Vxlan、Calico BGP、Calico Vxlan
- 将pod 地址信息封装在宿主机地址信息以内,实现跨主机且可跨node子网的通信报文。
- 直接路由
- Flannel Host-gw、Flannel VXLAN Directrouting、Calico Directrouting
- 基于主机路由,实现报文从源主机到目的主机的直接转发,不需要进行报文的叠加封装,性能比overlay更好
- Underlay
- 需要为pod启用单独的虚拟机网络,直接使用宿主机物理网络,pod甚至可以在k8s环境之外的节点直接访问(与node节点的网络被打通),相当于把pod当桥接模式的虚拟机使用,比较方便k8s环境以外的访问访问k8s环境中的pod中的服务,而且由于主机使用的宿主机网络,其性能最好。
underlay网络案例
创建underlay网络并与node节点关联
- 为node主机添加underlay network标签 ,如果是其他网络类型,也需要添加相应的标签去配对使用
root@k8s-master1:~/hybridnet# kubectl label node k8s-node1.example.com network=underlay-nethost
node/k8s-node2.example.com labeled
root@k8s-master1:~/hybridnet# kubectl label node k8s-node2.example.com network=underlay-nethost
node/k8s-node3.example.com labeled
root@k8s-master1:~/hybridnet# kubectl label node k8s-node3.example.com network=underlay-nethost
node/k8s-node3.example.com labeled
- create-underlay-network.yaml
---
apiVersion: networking.alibaba.com/v1
kind: Network
metadata:
name: underlay-network1
spec:
netID: 0
type: Underlay
nodeSelector:
network: "underlay-nethost"
---
apiVersion: networking.alibaba.com/v1
kind: Subnet
metadata:
name: underlay-network1
spec:
network: underlay-network1
netID: 0
range:
version: "4"
cidr: "172.31.0.0/21"
gateway: "172.31.0.2" # 外部网关地址
start: "172.31.6.1" #分配给pod使用
end: "172.31.6.254"
- 验证网络
创建pod并使用overlay网络
- tomcat-app1-overlay.yaml
- 默认会使用overlay网络,overlay使用的是vxlan进行报文封装,会生成一个eth0.vxlan4网卡,接收报文为UDP的8472端口
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: myserver-tomcat-app1-deployment-overlay-label
name: myserver-tomcat-app1-deployment-overlay
namespace: myserver
spec:
replicas: 1
selector:
matchLabels:
app: myserver-tomcat-app1-overlay-selector
template:
metadata:
labels:
app: myserver-tomcat-app1-overlay-selector
spec:
nodeName: k8s-node2.example.com
containers:
- name: myserver-tomcat-app1-container
#image: tomcat:7.0.93-alpine
image: registry.cn-hangzhou.aliyuncs.com/zhangshijie/tomcat-app1:v1
imagePullPolicy: IfNotPresent
##imagePullPolicy: Always
ports:
- containerPort: 8080
protocol: TCP
name: http
env:
- name: "password"
value: "123456"
- name: "age"
value: "18"
# resources:
# limits:
# cpu: 0.5
# memory: "512Mi"
# requests:
# cpu: 0.5
# memory: "512Mi"
---
kind: Service
apiVersion: v1
metadata:
labels:
app: myserver-tomcat-app1-service-overlay-label
name: myserver-tomcat-app1-service-overlay
namespace: myserver
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
nodePort: 30003
selector:
app: myserver-tomcat-app1-overlay-selector
- 使用overlay网络的Node节点会生成vxlan网卡进行流量转发并创建iptables规则
创建pod并使用underlay网络
- tomcat-app1-underlay.yaml
- underlay pod可以与overlaypod共存(混合使用)。
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: myserver-tomcat-app1-deployment-underlay-label
name: myserver-tomcat-app1-deployment-underlay
namespace: myserver
spec:
replicas: 1
selector:
matchLabels:
app: myserver-tomcat-app1-underlay-selector
template:
metadata:
labels:
app: myserver-tomcat-app1-underlay-selector
annotations: #使用Underlay或者Overlay网络
networking.alibaba.com/network-type: Underlay
spec:
#nodeName: k8s-node2.example.com
containers:
- name: myserver-tomcat-app1-container
#image: tomcat:7.0.93-alpine
image: registry.cn-hangzhou.aliyuncs.com/zhangshijie/tomcat-app1:v2
imagePullPolicy: IfNotPresent
##imagePullPolicy: Always
ports:
- containerPort: 8080
protocol: TCP
name: http
env:
- name: "password"
value: "123456"
- name: "age"
value: "18"
# resources:
# limits:
# cpu: 0.5
# memory: "512Mi"
# requests:
# cpu: 0.5
# memory: "512Mi"
--- #可忽略
kind: Service
apiVersion: v1
metadata:
labels:
app: myserver-tomcat-app1-service-underlay-label
name: myserver-tomcat-app1-service-underlay
namespace: myserver
spec:
# type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
#nodePort: 40003
selector:
app: myserver-tomcat-app1-underlay-selector
- 通过宿主机ip访问pod
underlay网络模式下通过service IP访问Pod
- 通过一个固定的方式访问Pod
- Pod IP可以是固定的,但是很多时候会是动态变化的,SVC的IP删除再重建是不会变化的,可以把某个域名通过自建 的DNS解析到SVC,如果SVC的IP发生变化可以修改域名的A记录。
- 注意:后期如果要访问SVC则需要在网络设备配置静态路由,打通从客户端到SVC的通信,把请求转发到具体的kubernetes node节点响应
~# route add -net 172.31.5.0 netmask 255.255.255.0 gateway 172.31.6.204
网络组件 - flannel与calico通信原理解析
Pod常见通信需求
- pod中不同container的通信
- sidcar模式的多容器pod
- lnmp模式的多容器环境
- pod与pod中间的通信
- pod与pod在同一个node
- pod与pod不带同一个node
- node与node在同一个物理子网(vlan)
- node与node不在同一个物理子网(vlan)
- pod与外部服务的通信
- pod中的服务主动调用node网络之外的存储、中间件等
- pod中的服务主动调用node网络之外的存储、中间件等
- 客户端与pod的通信
- 来自于客户端浏览器的请求
- 来自于客户端APP的请求
Kubernetes常见CNI
https://github.com/containernetworking/cni #github
flannel通信架构及案例
flannel通信架构
#官网:
https://coreos.com/flannel/docs/latest/
#文档:
https://coreos.com/flannel/docs/latest/kubernetes.html
#flannel通信原理
由CoreOS开源的针对k8s的网络服务,其目的为解决k8s集群中各主机上的pod相互通信的问题,其借助于etcd维护网络IP地址分配,并为每一个node服务器分配一个不同的IP地址段。
#都会监听一个8472端口接收流量,可以抓取流量包进行观察 tcpdump -i eth0 udp port 8472
flannel网络模式
Flannel 网络模型 (后端模型),Flannel目前有三种方式实现 UDP/VXLAN/host-gw
- UDP - 早期版本的Flannel使用UDP封装完成报文的跨越主机转发,其安全性及性能略有不足。
- VXLAN - Linux 内核在在2012年底的v3.7.0之后加入了VXLAN协议支持,因此新版本的Flannel也有UDP转换为VXLAN,VXLAN本质上是一种tunnel(隧道)协议,用来基于3层网络实现虚拟的2层网络,目前flannel 的网络模型已经是基于VXLAN的叠加(覆盖)网络,目前推荐使用vxlan作为其网络模型。
- host-gw - Host GateWay通过在node节点上创建到达各目标容器地址的路由表而完成报文的转发,因此这种方式要求各node节点本身必须处于同一个局域网(二层网络)中,因此不适用于网络变动频繁或比较大型的网络环境,但是其性能较好。
Flannel的系统文件及目录
#运行环境
root@k8s-node2:~# find / -name flannel
/opt/cni/bin/flannel
/run/flannel
/usr/local/bin/flannel
#子网信息
root@k8s-node2:~# cat /run/flannel/subnet.env
~# cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.200.0.0/16
FLANNEL_SUBNET=10.200.2.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
路由表
- Cni0 - 网桥设备,每创建一个pod都会创建一对 veth pair,其中一端是pod中的eth0,另一端是Cni0网桥中的端口(网卡),Pod中从网卡eth0发出的流量都会发送到Cni0网桥设备的端口(网卡)上,Cni0 设备获得的ip地址是该节点分配到的网段的第一个地址。
- Flannel.1 - overlay网络的设备,用来进行vxlan报文的处理(封包和解包),不同node之间的pod数据流量都从overlay设备以隧道的形式发送到对端。
Flannel vxlan配置
- 官方提供的配置模板
https://github.com/flannel-io/flannel
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
#需要注意的是修改模板中的IP为NodeIp
#kube-flannel.yml
...
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
#安装后会生成configmap
[root@k8s-master1 ~]# kubectl edit configmap kube-flannel-cfg -n kube-system
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"cni-conf.json":"{\n \"name\": \"cbr0\",\n \"cniVersion\": \"0.3.1\",\n \"plugins\": [\n {\n \"type\": \"flannel\",\n \"delegate\": {\n \"hairpinMode\": true,\n \"isDefaultGateway\": true\n }\n },\n {\n \"type\": \"portmap\",\n \"capabilities\": {\n \"portMappings\": true\n }\n }\n ]\n}\n","net-conf.json":"{\n \"Network\": \"10.200.0.0/16\",\n \"Backend\": {\n \"Type\": \"vxlan\"\n }\n}\n"},"kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app":"flannel","tier":"node"},"name":"kube-flannel-cfg","namespace":"kube-system"}}
#flannel vxlan使用UDP端口8472传输封装好的报文。
root@k8s-node2:~# netstat -tuanlp | grep 8472
udp 0 0 0.0.0.0:8472 0.0.0.0:*
Flannel vxlan架构图
- 生产架构案例
Flannel Pod通信解析
Flannel Pod通信
- 进入pod查询当前网卡在宿主机的IP序列,从而知道pod对应的网卡名称
- 抓取pod网卡通信包进行分析
#源pod发起请求,此时报文中源IP为pod的eth0 的ip,源mac 为pod的eth0的mac,目的Pod为目的Pod的IP,目的mac为网关(cni0)的MAC
node2 ~# tcpdump -nn -vvv -i 网卡名称 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53
#示例
#数据报文通过veth peer发送给网关cni0,cni0进行目标IP检查,如果是同一个网桥的报文就直接转发,不是的话就发送给flannel.1, 此时报文被修改如下:
源IP: Pod IP,10.100.2.2
目的IP: Pod IP,10.100.1.6
源MAC: 源POD MAC
目的MAC:cni mAC
#抓取cni0数据包
node2 ~]# tcpdump -nn -vvv -i cni0 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53
#到达flannel.1,检查目的mac就是发给自己的,开始匹配路由表,先实现overlay报文的内层封装(主要是修改目的Pod的对端flannel.1的 MAC、源MAC为当前宿主机flannel.1的MAC):
[root@k8s-node2 ~]# bridge fdb show dev flannel.1
de:34:a2:06:d3:56 dst 172.30.7.111 self permanent #永久链路
12:d7:c9:e7:3b:46 dst 172.30.7.101 self permanent
#抓取flannel.1数据包
node2 ~]# tcpdump -nn -vvv -i flannel.1 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53
#封装结构 - 可以参考官方vxlan报文格式
源IP: Pod IP,10.100.2.2
目的IP: Pod IP,10.100.1.6
源MAC: 9e:68:76:c4:64:0f,源Pod所在宿主机flannel.1的MAC
目的MAC:de:34:a2:06:d3:56,目的Pod所在主机flannel.1的MAC
flannel模式抓包全过程图解
- pod发出请求
- pod请求发送到cni0
- cni0将请求转发给flannel1
- overlay模式封装后转发到目标8472端口
- 目标主机网卡接收数据包
#基于UDP封装Vxlan报文
VXLAN ID:1
UDP 源端口: 随机
UDP 目的端口: 8472
源IP #源Pod所在宿主机的物理网卡IP#
目的IP #目的Pod所在宿主机的物理网卡IP
源MAC: 00:0c:29:bc:fe:d8 #源Pod所在宿主机的物理网卡
目的MAC: 00:0c:29:56:e7:1b #目的Pod所在宿主机的物理网卡
#查看数据包报文
node1 ~]# tcpdump -nn -vvv -i eth0 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53
node1 ~]# ip -d link show flannel.1
link/ether 52:34:52:6d:6e:6e brd ff:ff:ff:ff:ff:ff promiscuity 0
vxlan id 1 local 172.30.7.101 dev eth0 srcport 0 0 dstport 8472 nolearning ageing 300
- 报文到达目的宿主机物理网卡,接开始解封装报文
- 外层目的IP为本机物理网卡,解开后发现里面还有一层目的IP和目的MAC,发现目的IP为10.100.1.6,目的MAC为de:34:a2:06:d3:56(目的flannel.1的MAC),然后将报文发送给flannel.1
node1 ~]# tcpdump -nn -vvv -i eth0 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53
- flannel.1接收eth0转发的报文开始解析,拿到目标pod地址
- flannel.1检查报文的目的IP,发现是去往本机cni0的子网,将请求报文转发至cni0
node1 ~]# tcpdump -nn -vvv -i flannel.1 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53
目的IP:10.100.1.6 #目的Pod
源IP: 10.100.2.2 #源Pod
目的 MAC:de:34:a2:06:d3:56 #目的pod所在宿主机的flannel.1
源MAC:9e:68:76:c4:64:0f #源pod所在宿主机flannel.1的MAC
- flannel.1获取到具体的pod地址后转发给cni0
- pcni0基于目的IP检查mac地址表,修改目的MAC为目的MAC后将来请求转给pod
源IP: 10.100.2.2 #源Pod
目的IP: 10.100.1.6 #目的Pod
源MAC:cni0的MAC, b2:12:0d:e4:eb:46
目的MAC: 目的Pod的MAC f2:50:98:b4:ea:01
node1 ~]# tcpdump -nn -vvv -i cni0 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 -w 7.flannel-flannel-vxlan-cni0-in.pcap
- 报文到达目的宿主机pod
- cni0收到报文发现去往10.100.1.6,检查MAC地址表发现是本地接口,然后通过网桥接口发给pod
目的IP: 目的pod IP 10.100.1.6
源IP:源Pod IP 10.200.2.2
目的MAC: 目的pod MAC,f2:50:98:b4:ea:01
源MAC: cni0的MAC,b2:12:0d:e4:eb:46
node1 ~]# tcpdump -nn -vvv -i vethf38183ee -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 -w 8.flannel-vxlan-vethf38183ee-in.acp
calico通信架构及解析
calico通信架构
calico通信过程解析
calico模式下会维护一个路由表,跨主机通信通过tunl0,本机通信则通过目的网卡,所有虚拟网卡地址都相同ee:ee...
#抓包过程参考上述flannel过程,这里不详细展开
源pod:
# kubectl exec -it net-test2 bash #进入pod
[root@net-test2 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.200.218.62 netmask 255.255.255.255 broadcast 10.200.218.62
# ethtool -S eth0 #源pod确认网卡对
NIC statistics:
peer_ifindex: 8
rx_queue_0_xdp_packets: 0
8: cali2b2e7c9e43e@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 3
root@k8s-node1:~# tcpdump -nn -vvv -i cali2b2e7c9e43e -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53
目的pod:
/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.200.151.205 netmask 255.255.255.255 broadcast 10.200.151.205
/# ethtool -S eth0 #目的pod网卡对
NIC statistics:
peer_ifindex: 16
rx_queue_0_xdp_packets: 0
16: cali32ecf57bfbe@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 7
root@k8s-node2:~# tcpdump -nn -vvv -i cali32ecf57bfbe -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and !
calico模式抓包全过程图解
- 源pod发起请求, 报文到达宿主机与pod对应的网卡
- 源pod发起请求, 报文到达宿主机与pod对应的网卡,此时报文中源IP为pod的eth0 的ip,源mac 为pod的eth0的mac,目的IP为10.200.151.205,下一跳为网关地址169.254.1.1 ,目的mac为ee:ee:ee:ee:ee:ee(默认网关169.254.1.1的MAC地址),源端口随机产生目的端口80
root@k8s-node1:~# tcpdump -nn -vvv -i cali2b2e7c9e43e -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53
- 报文到达tunl0
- 此时报文的源IP为源pod IP,目的IP为目的pod IP。没有MAC 地址
root@k8s-node1:~# tcpdump -nn -vvv -i tunl0 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 -w 2-tunl0.acp
- 报文到达源宿主机eth0
- 此时报文为IPinIP格式,外层为源宿主机和目的宿主机的源MAC目的MAC、源IP及目的IP,内部为源pod IP及目的pod的IP,没有使用MAC地址。
root@k8s-node1:~# tcpdump -nn -vvv -i eth0 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 and ! port 2380 and ! host 172.31.7.101 -w 3.eth0.acp
- 报文到达目的宿主机eth0
- 报文到达目的宿主机eth0,此时收到的是源宿主机的IPinIP报文,外层为源宿主机和目的宿主机的源MAC目的MAC、源IP及目的IP,内部为源pod IP及目的pod的IP,没有使用MAC地址,解封装后发现是去往10.200.151.205.
- 报文到达目的宿主机tunl0
- 报文到达目的宿主机tunl0,此时源IP为源pod IP,目的IP为目的pod的IP,没有MAC地址。
root@k8s-node2:~# tcpdump -nn -vvv -i tunl0 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 and ! port 2380 and ! host 172.31.7.101 -w 5-tunl0.acp
- 报文到达目的Pod与目的宿主机对应的网卡
- 报文到达目的宿主机网卡。此时源IP为源Pod IP,源MCA为tunl0 MAC,目的IP为目的Pod IP,目的MAC为目的Pod MAC,随后报文被转发被目的MAC(目的Pod) 。
root@k8s-node2:~# tcpdump -nn -vvv -i cali32ecf57bfbe -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 and ! port 2380 and ! host 172.31.7.101 -w 6-cali32ecf57bfbe.acp
- 报文到达目的Pod
- 报文到达目的pod,目的pod接受请求并构建响应报文并原路返回给源pod。
nginx-deployment-58f6c4967b-x959s:/# tcpdump -i eth0 -vvv -nn -w 7-dst-pod.acp
本章结束。
我是moore,大家一起加油!!!
标签:网络通信,Kubernetes,IP,报文,宿主机,MAC,91,pod,port From: https://blog.51cto.com/mooreyxia/6215427