overlay与underlay通信总结
作者:互联网
网络通信Overlay
VxLAN介绍
先说明vlan,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强大的多,可以支持大规模数据中心的网络需求。
VXLAN报文格式(以外层IP头为IPv4格式为例)
如上图所示,VTEP对VM发送的原始以太帧(Original L2 Frame)进行了以下“包装”:
- VXLAN Header
增加VXLAN头(8字节),其中包含24比特的VNI字段,用来定义VXLAN网络中不同的租户。此外,还包含VXLAN Flags(8比特,取值为00001000)和两个保留字段(分别为24比特和8比特)。
- UDP Header
VXLAN头和原始以太帧一起作为UDP的数据。UDP头中,目的端口号(VXLAN Port)固定为4789,源端口号(UDP Src. Port)是原始以太帧通过哈希算法计算后的值。
- Outer IP Header
封装外层IP头。其中,源IP地址(Outer Src. IP)为源VM所属VTEP的IP地址,目的IP地址(Outer Dst. IP)为目的VM所属VTEP的IP地址。
- Outer MAC Header
封装外层以太头。其中,源MAC地址(Src. MAC Addr.)为源VM所属VTEP的MAC地址,目的MAC地址(Dst. MAC Addr.)为到达目的VTEP的路径中下一跳设备的MAC地址。
VxLAN设备简介
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(VXLAN Network Identifier):VXLAN网络标识VNI类似VLAN ID,用于区分VXLAN段,不同VXLAN段的虚拟机不能直接二层相互通信,一个VNI表示一个租户,即使多个终端用户属于同一个VNI,也表示一个租户。
NVGRE:Network Virtualization using Generic Routing Encapsulation,主要支持者是Microsoft,与VXLAN不同的是,NVGRE没有采用标准传输协议(TCP/UDP),而是借助通用路由封装协议(GRE),NVGRE使用GRE头部的低24位作为租户网络标识符(TNI),与VXLAN一样可以支持1777216个vlan。
VxLAN通信
VXLAN网络模型
通信过程
1、VM A发送L2帧与VM请求与VM B通信。
2、源宿主机VTEP添加或者封装VXLAN、UDP及IP头部报文。
3、网络层设备将封装后的报文通过标准的报文在三层网络进行转发到目标主机。
4、目标宿主机VTEP删除或者解封装VXLAN、UDP及IP头部。
5、将原始L2帧发送给目标VM。
Overlay网络介绍
Overlay网络的出现主要应对数据中心中虚拟机的迁移,打破物理地址的限制,保证在虚拟机进行迁移之后不需要重新配置网络等。Overlay指的是一种传统网络架构上叠加的虚拟化技术模式,在对基础网络不进行大规模修改的条件下,实现应用在网络上的承载,并能与其它网络业务分离,并且以基于IP的基础网络技术为主。
优点
是对物理网络的兼容性比较好,可以实现pod的跨宿主机子网通信。
calico与flannel等网络插件都支持overlay网络。
相比VLAN所支持的二层网络数量多更多。
更为灵活的虚拟机部署——VXLAN可以实现构建在三层网络上的大二层网络网络,通过UDP在L3网络上传输L2网络数据,便于虚拟机迁移等。
缺点
VXLAN是一种overlay网络,不能独立存在,必须依赖underlay网络,而在构建underlay网络时,还是需要借助VLAN。
VXLAN的优势是在大规模环境下,如果数据中心的规模较小,那么VXLAN将会浪费很多网络性能。
需要专属设备支持
VXLAN因为需要进行外层封装,每个以太网帧的传输都会浪费50字节,对于小报文的传输将会有极大的浪费。
Overlay架构图
如果源pod对目标pod的访问属于同一个宿主机下,则直接通过cni网络插件进行本地的转发。反之则通过VTEP设备端点进行封装报文,并由VxLAN网络通道进行通信。
网络通信Underlay
Underlay介绍
Underlay网络就是传统IT基础设施网络,由交换机和路由器等设备组成,借助以太网协议、路由协议和VLAN协议等驱动,它还是Overlay网络的底层网络,为Overlay网络提供数据通信服务。容器网络中的Underlay网络是指借助驱动程序将宿主机的底层网络接口直接暴露给容器使用的一种网络构建技术,较为常见的解决方案有MAC VLAN、IP VLAN和直接路由等。
Underlay依赖于网络网络进行跨主机通信。
Underlay实现
Mac Vlan模式:
支持在同一个以太网接口上虚拟出多个网络接口(子接口),每个虚拟接口都拥有唯一的MAC地址并可配置网卡子接口IP。
IP VLAN模式:
IP VLAN类似于MAC VLAN,它同样创建新的虚拟网络接口并为每个接口分配唯一的IP地址,不同之处在于,每个虚拟接口将共享使用物理接口的MAC地址。
MAC VLAN工作模式
Private(私有)模式:
在Private模式下,同一个宿主机下的容器不能通信,即使通过交换机再把数据报文转发回来也不行。
VEPA模式:
虚拟以太端口汇聚器(Virtual Ethernet Port Aggregator,简称VEPA),在这种模式下,macvlan内的容器不能直接接收在同一个物理网卡的容器的请求数据包,但是可以经过交换机的(端口回流)再转发回来可以实现通信。
passthru(直通)模式:
Passthru模式下该macvlan只能创建一个容器,当运行一个容器后再创建其他容器则会报错。
bridge模式:
在bridge这种模式下,使用同一个宿主机网络的macvlan容器可以直接实现通信,推荐使用此模式。
Underlay网络部署
网络地址规划
局域网络为192.168.0.0/16
pod overlay网络10.100.0.0/16
pod underlay网络为192.168.0.3-192.168.0.254
svc网络为192.168.100.0/24
场景:
pod可以选择overlay或者underlay,SVC使用underlay。
注意:后期如果要访问SVC则需要在网络设备配置静态路由,因为SVC是iptables或者IPVS规则,不会进行arp报文广播:
使用场景2配置
k8s使用kubeadm1.24+cri-docker部署
设置kubernetes初始化集群时指定svc网络地址为underlay宿主机网络
root@master:~/ kubeadm init --apiserver-advertise-address=192.168.0.10 \
--apiserver-bind-port=6443 \
--kubernetes-version=v1.24.3 \
--pod-network-cidr=10.100.0.0/16 \
--service-cidr=192.168.100.0/24 \
--service-dns-domain=cluster.local \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--ignore-preflight-errors=swap \
--cri-socket unix:///var/run/cri-dockerd.sock
node节点加入
kubeadm join 192.168.0.10:6443 --token 5hp1dd.qqm0lczctz43ob7c \
--discovery-token-ca-cert-hash sha256:44db632c10bb53e5ef6f82f713d320aa1276c395b5c4c67d64e91abea04c28cf --cri-socket unix:///var/run/cri-dockerd.sock
安装helm
helm官网:
https://helm.sh/zh/docs/intro/install/
github官网:
https://github.com/helm/helm/releases
解压复制/usr/local/bin
root@master:~/helm/ tar xf helm-v3.9.4-linux-amd64.tar.gz
root@master:~/helm/linux-amd64/ cp helm /usr/local/bin/
添加hybridnet helm加速源
root@master:~/helm/linux-amd64/ helm repo add hybridnet https://alibaba.github.io/hybridnet/
root@master:~/helm/linux-amd64/ helm repo list
NAME URL
hybridnet https://alibaba.github.io/hybridnet/
root@master:~/helm/linux-amd64/ helm repo update
安装hybridnet
root@master:~/helm/linux-amd64/ helm install hybridnet hybridnet/hybridnet -n kube-system --set init.cidr=10.100.0.0/16
NAME: hybridnet
LAST DEPLOYED: Wed Aug 31 09:48:01 2022
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
init.cidr=10.100.0.0/16,与kubernetes master初始化集群指定的pod的地址保持一致
root@master:~/helm/linux-amd64/ kubectl get pod -A
查看hybridnet的容器,具有节点亲和性标签。
root@master:~/ kubectl describe pods hybridnet-webhook-5d55bdcf7f-lnr4 -n kube-system
Node-Selectors: node-role.kubernetes.io/master=
如果使用的kubeadm安装的k8s,则集群的节点不包含该标签,需要手动为集群节点指定标签。
root@master:~/ kubectl label nodes master node-role.kubernetes.io/master=
root@master:~/ kubectl label nodes node1 node-role.kubernetes.io/master=
root@master:~/ kubectl label nodes node2 node-role.kubernetes.io/master=
查看hybridnet容器
root@master:~/ kubectl get pods -A -o wide|grep hybridnet
kube-system hybridnet-daemon-4f9q8 2/2 Running
kube-system hybridnet-daemon-cpmtc 2/2 Running
kube-system hybridnet-daemon-ffgwr 2/2 Running
kube-system hybridnet-manager-68dc65b7b8-256gv 1/1 Running
kube-system hybridnet-manager-68dc65b7b8-c4v8p 1/1 Running
kube-system hybridnet-manager-68dc65b7b8-frk6f 1/1 Running
kube-system hybridnet-webhook-5d55bdcf7f-bptpk 1/1 Running
kube-system hybridnet-webhook-5d55bdcf7f-dspvq 1/1 Running
kube-system hybridnet-webhook-5d55bdcf7f-lnr4l 1/1 Running
创建节点网络标签,目的是为每个节点创建undery网络,具有节点亲和性
root@master:~/hybirdnet/ kubectl label node master network=underlay-nethost
root@master:~/hybirdnet/ kubectl label node node1 network=underlay-nethost
root@master:~/hybirdnet/ kubectl label node node2 network=underlay-nethost
创建underlay网络并添加pod地址范围
root@master:~/yaml/ cat create-underlay-network.yaml
---
apiVersion: networking.alibaba.com/v1
kind: Network
metadata:
name: underlay-network1 #指定network名称
spec:
netID: 0
type: Underlay
nodeSelector:
network: "underlay-nethost" #节点亲和性,匹配该表标签的宿主机
---
apiVersion: networking.alibaba.com/v1
kind: Subnet
metadata:
name: underlay-network1
spec:
network: underlay-network1 #使用上面创建的network
netID: 0
range:
version: "4"
cidr: "192.168.0.0/16" #宿主机所属的子网
gateway: "192.168.0.2" #宿主机的网关出口访问地址
start: "192.168.0.15" #underlay网络pod的起始地址
end: "192.168.0.254" #underlay网络pod的结尾地址
创建节点标签和网络描述
root@master:~/hybirdnet/ kubectl describe nodes node2
Name: node2
Roles: master
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=node2
kubernetes.io/os=linux
network=underlay-nethost
networking.alibaba.com/dualstack-address-quota=empty
networking.alibaba.com/ipv4-address-quota=nonempty
networking.alibaba.com/ipv6-address-quota=empty
networking.alibaba.com/overlay-network-attachment=true
networking.alibaba.com/underlay-network-attachment=true
node-role.kubernetes.io/master=
Annotations: kubeadm.alpha.kubernetes.io/cri-socket: unix:///var/run/containerd/containerd.sock
networking.alibaba.com/local-vxlan-ip-list: 192.168.0.12
networking.alibaba.com/vtep-ip: 192.168.0.12
networking.alibaba.com/vtep-mac: 00:0c:29:b7:10:6e
node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Tue, 30 Aug 2022 20:29:52 +0800
创建pod,验证所属的underlay网络地址是否正确
root@master:~/yaml/ cat nginx-underlay.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: nginx-underlay
name: nginx-underlay
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-underlay
template:
metadata:
labels:
app: nginx-underlay
annotations: #使用Underlay或者Overlay网络
networking.alibaba.com/network-type: Underlay
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
name: http
浏览器直接访问宿主机网络的pod
宿主机直接通过pod的地址就可以访问到,不需要创建对应的service
扩充pod副本,Pod地址根据underlay网络范围进行扩增
root@master:~/yaml/ kubectl scale deployment nginx-underlay --replicas 3
deployment.apps/nginx-underlay scaled
创建underlay service,不对外暴露,仅为clusterip模式
root@master:~/yaml/ cat nginx-underlay-service.yaml
kind: Service
apiVersion: v1
metadata:
labels:
app: nginx-underlay
name: nginx-underlay
namespace: default
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx-underlay #匹配nginx-underlay Pod
Windows宿主机添加主机路由,访问kubernetes service 暴露的Pod应用
下一跳地址192.168.0.10为k8s任意一个节点即可
route add 192.168.100.0 MASK 255.255.255.0 192.168.0.10
配置k8s默认网络行为
kubernetes默认为overlay 网络,如果使用underlay的pod比较多,也可以修改为在创建pod的时候,没有指定使用网络类型的pod默认使用underlay网络。
默认网络行为从underlay修改为Overlay:
helm upgrade hybridnet hybridnet/hybridnet -n kube-system --set defualtNetworkType=Overlay
或者直接编辑修改hybridnet-webhook和manager pod配置
kubectl edit deploy hybridnet-webhook -n kube-system
kubectl edit deploy hybridnet-manager -n kube-system
….
env:
- name: DEFAULT_NETWORK_TYPE
value: Overlay
….
标签:总结,hybridnet,overlay,root,网络,master,underlay,VXLAN 来源: https://www.cnblogs.com/punchlinux/p/16676765.html