Vlan & Vxlan (转载https://www.cnblogs.com/sansna/articles/6159218.html)

本文介绍了VXLAN技术的背景需求,详细解释了VXLAN的工作原理,包括VXLAN报文格式、数据和控制平面、ARP请求过程及数据传输方式,并讨论了VXLAN网关的作用及不同部署场景。

一 . 为什么需要Vxlan

 

1. vlan的数量限制

   4096个vlan远不能满足大规模云计算数据中心的需求

 

2. 物理网络基础设施的限制

   基于IP子网的区域划分限制了需要二层网络连通性的应用负载的部署

 

3. TOR交换机MAC表耗尽

    虚拟化以及东西向流量导致更多的MAC表项

 

4. 多租户场景

    IP地址重叠?

二. 什么是Vxlan

 

1. Vxlan报文

    vxlan(virtual Extensible LAN)虚拟可扩展局域网,是一种overlay的网络技术,使用MAC in UDP的方法进

行封装,共50字节的封装报文头。具体的报文格式如下:

 

(1) vxlan header

    共计8个字节,目前使用的是Flags中的一个8bit的标识位和24bit的VNI(Vxlan Network identifier),

其余部分没有定义,但是在使用的时候必须设置为0x0000。

 

(2) 外层的UDP报头

     目的端口使用4798,但是可以根据需要进行修改。同事UDP的校验和必须设置成全0。

 

(3) IP报文头

     目的IP地址可以是单播地址,也可以是多播地址。单播情况下,目的IP地址是Vxlan Tunnel End Point

(VTEP)的IP地址。在多播情况下引入VXLAN管理层,利用VNI和IP多播组的映射来确定VTEPs。???

  • protocol:设置值为0x11,显示说明这是UDP数据包
  • Source ip: 源vTEP_IP;
  • Destination ip: 目的VTEP IP。

(4) Ethernet Header

  • Destination Address:目的VTEP的Mac 地址,即为本地下一跳的地址(通常是网关Mac 地址);
  • VLAN: VLAN Type被设置为0x8100, 并可以设置Vlan Id tag(这就是vxlan的vlan 标签)。
  • Ethertype:设置值为0x8000,指明数据包为IPv4的。

补充:VTEP的作用?    

     用于对VXLAN报文进行封装/解封装,包括ARP请求报文和正常的VXLAN数据报文,在一段封装报文

后通过隧道向另一端VTEP发送封装报文,另一端VTEP接收到封装的报文解封装后根据封装的MAC地址

进行装法。VTEP可由支持VXLAN的硬件设备或软件来实现。

 

   从封装的结构上来看,VXLAN提供了将二层网络overlay在三层网络上的能力,VXLAN Header中的VNI有

24个bit,数量远远大于4096,并且UDP的封装可以穿越三层网络,比VLAN有更好的扩展性。

 

2. Vxlan的数据和控制平面

  (1) 数据平面---隧道机制

     已经知道,VTEP为虚拟机的数据包加上了层包头,这些新的报头之有在数据到达目的VTEP后才会被去掉。

中间路径的网络设备只会根据外层包头内的目的地址进行数据转发,对于转发路径上的网络来说,一个Vxlan

数据包跟一个普通IP包相比,出了个头大一点外没有区别。

     由于VXLAN的数据包在整个转发过程中保持了内部数据的完整,因此VXLAN的数据平面是一个基于隧道

的数据平面。

 

(2) 控制平面----改进的二层协议

     VXLAN不会在虚拟机之间维持一个长连接,所以VXLAN需要一个控制平面来记录对端地址可达情况。控制

平面的表为(VNI,内层MAC,外层vtep_ip)。Vxlan学习地址的时候仍然保存着二层协议的特征,节点之间不会

周期性的交换各自的路由表,对于不认识的MAC地址,VXLAN依靠组播来获取路径信息(如果有SDN Controller,

可以向SDN单播获取)。

    另一方面,VXLAN还有自学习的功能,当VTEP收到一个UDP数据报后,会检查自己是否收到过这个虚拟机的

数据,如果没有,VTEP就会记录源vni/源外层ip/源内层mac对应关系,避免组播学习。

 

 

3. VxlanARP请求

 

(1) vxlan初始化

 

 VM1和VM2连接到VXLAN网络(VNI)100,两个VXLAN主机加入IP多播组239.119.1.1

 

(2) ARP请求

 

   1) VM1以广播的形式发送ARP请求;

   2) VTEP1封装报文。打上VXLAN标识为100,外层IP头DA为IP多播组(239.119.1.1),SA为IP_VTEP1.

   3) VTEP1在多播组内进行多播;

   4) VTEP2解析接收到多播报文。填写流表(VNI, 内层mac地址,外层Ip地址),并在本地VXLAN标识为100的范围内

       广播(是VXLAN的用武之地)。

   5) VM2对接收到的ARP请求进行响应;

 

(3) ARP应答

  1) VM2准备ARP响应报文后向VM1发送响应报文

       2)VTEP2接收到VM2的响应报文后把它封装在ip单播报文中(VXLAN标识依然为100),然 后向VM1发送单播

       3)VTEP1接收到单播报文后,学习内层MAC到外层ip地址的映射,解封装并根据被封装内容的目的MAC地址转发给VM1

       4)VM1接收到ARP应答报文,ARP交互结束

 

4  数据传输

    (1)  ARP请求应答之后,VM1知道了VM2的Mac地址,并且要向VM2通信(注意,VM1是以TCP的方法向VM2发送数据的)。

VTEP1 收到VM1发送数据包,用MAC地址从流表中检查VM1与VM2是否属于用一个VNI。两个VM不但位于同一个VNI中

(不在同一个VNI中出网关),并且VTEP1已经知道了VM2的所有地址信息(MAC和VTEP2_IP)。VTEP1封装新的数据包。然后

交给上联交换机。

   (2) 上联交换机收到服务器发来的UDP包,对比目的IP地址和自己的路由表,然后将数据报转发给相应的端口。

   (3) 目的VTEP收到数据包后检查器VNI,如果UDP报中VNI与VM2的VNI一致,则将数据包解封装后交给VM2进一步处理。至此

一个数据包传输完成。整个Vxlan相关的行为(可能穿越多个网关)对虚拟机来说是透明的,虚拟机不会感受传输的过程。

 

    虽然VM1与VM2之间启动了TCP来传输数据,但数据包一路上实际是以UDP的形式被转发,两端的VTEP并不会检查数据是否

正确或者顺序是否完整,所有的这些工作都是在VM1和VM2在接收到解封装的TCP包后完成的。也就是说如果说如果被UDP封装

的是TCP连接,那么UDP和TCP将做为两个独立的协议栈各自工作,相互之间没有交互。

    

5 Vxlan网关

 如果需要VXLAN网络和非VXLAN网络连接,必须使用VXLAN网关才能把VXLAN网络和外部网络进行桥接和

完成VXLAN ID和VLAN ID之间的映射和路由,和VLAN一样,VXLAN网络之间的通信也需要三层设备的支持,

即VXLAN路由的支持。同样VXLAN网关可由硬件和软件来实现。

 

 从封装的结构上来看,VXLAN提供了将二层网络overlay在三层网络上的能力,VXLAN Header中的VNI有

24个bit,数量远远大于4096,并且UDP的封装可以穿越三层网络,比VLAN有更好的扩展性。

 

6.部署

(1) 纯VXLAN部署场景

  对于连接到VXLAN内的虚拟机,由于虚拟机的VLAN信息不再作为转发的依据,虚拟机的迁移也就

不再受三层网关的限制,可以实现跨越三层网关的迁移。

 

 

(2) VXLAN与VLAN混合部署

 

   为了实现VLAN和VXLAN之间互通,VXLAN定义了VXLAN网关。VXLAN网关上同时存在两种类型的端口:VXLAN端口

和普通端口。

   当收到从VXLAN网络到普通网络的数据时,VXLAN网关去掉外层包头,根据内层的原始帧头转发到普通端口上;当有数据

从普通网络进入到VXLAN网络时,VXLAN网关负责打上外层包头,并根据原始VLAN ID对应到一个VNI,同时去掉内层包头

的VLAN ID信息。相应的如果VXLAN网关发现一个VXLAN包的内层帧头上还带有原始的二层VLAN ID,会直接将这个包丢弃。

之所以这样,是VLAN ID是一个本地信息,仅仅在一个地方的二层网络上其作用,VXLAN是隧道机制,并不依赖VLAN ID进行

转发,也无法检查VLAN ID正确与否。因此,VXLAN网关连接传统网络的端口必须配置ACCESS口,不能启用TRUNK口。

<think>我们正在处理用户关于Flannel网络配置的问题。用户在使用wget下载Flannel的配置文件(kube-flannel.yml)后,在运行时遇到问题。我们需要指导用户如何修改这个配置文件以解决运行失败的问题。首先,我们需要了解常见的失败原因。Flannel配置失败可能由多种原因引起,包括网络插件配置错误、Pod网段集群CIDR不匹配、CNI配置问题等。我们将重点放在配置文件的修改上。常见的修改点包括:1.网络后端(backend)配置:Flannel支持多种后端,如vxlan、host-gw、udp等。根据用户的环境选择合适的后端。2.Pod网段配置:确保Flannel的网段kube-controller-manager分配的Pod网段一致。3.接口选择:在多网卡环境中,可能需要指定Flannel绑定的网络接口。在kube-flannel.yml配置文件中,这些配置通常在ConfigMap中设置,特别是`net-conf.json`部分。接下来,我们将提供修改配置的步骤,并给出一个示例。注意:由于用户已经下载了kube-flannel.yml,我们建议用户编辑这个文件。步骤:1.使用文本编辑器打开kube-flannel.yml。2.找到ConfigMap部分,其中包含`net-conf.json`。 3.修改`Network`字段为Kubernetes集群的Pod网段(默认为10.244.0.0/16,但可能被修改过,需集群一致)。 4.根据需要修改后端类型,例如将`Type`设置为vxlan、host-gw等。5.如果节点有多个网络接口,可以在`net-conf.json`中指定`Backend`的`Interface`字段,或者使用`args`参数在DaemonSet中指定`--iface`。示例:修改`net-conf.json`部分```yamlnet-conf.json:|{"Network": "10.244.0.0/16","Backend": {"Type":"vxlan"}} ```另外,在DaemonSet中,可以为flannel容器添加参数来指定接口,例如:```yamlcontainers:-name:kube-flannelargs:---ip-masq---kube-subnet-mgr---iface=eth0#指定网络接口,如果节点有多个网卡,这里可以改为正确的接口名```注意:如果用户的环境是云环境(如AWS、GCP等),可能需要使用host-gw后端或者云供应商特定的后端以获得更好的性能。 如果用户遇到其他问题,比如镜像拉取失败,可能需要修改镜像地址为国内可访问的镜像源。最后,应用修改后的配置文件: ```bashkubectl apply-fkube-flannel.yml``` 如果问题仍然存在,建议查看flannel的Pod日志以获取错误信息:```bashkubectllogs -n kube-system<flannel-pod-name>``` 根据日志进一步排查。现在,我们将按照上述思路生成回答,并添加相关问题。</think>### Flannel 配置文件修改指南 当 `kube-flannel.yml` 运行失败时,通常需要调整以下关键配置部分: #### 1. **网络CIDR配置检查** 在 `net-conf.json` 部分确认 `Network` 字段集群CIDR一致: ```yaml net-conf.json: | { "Network": "10.244.0.0/16", # 必须 kube-controller-manager 的 --cluster-cidr 参数一致 "Backend": { "Type": "vxlan" } } ``` *若不一致会导致IP分配冲突[^1]*。 #### 2. **网络后端适配** 根据基础设施类型修改 `Backend.Type`: - **云环境**:推荐 `host-gw`(性能更好) - **物理机/VLAN环境**:使用 `vxlan`(默认) - **特殊网络**:尝试 `udp` 模式(兼容性最强) ```yaml Backend: { "Type": "host-gw" # 修改此处 } ``` #### 3. **网络接口指定** 多网卡环境需在 DaemonSet 中显式声明网卡: ```yaml containers: - name: kube-flannel args: - --ip-masq - --kube-subnet-mgr - --iface=eth0 # 指定物理网卡名称 ``` #### 4. **镜像加速配置** 国内环境建议替换镜像源(在 `spec.template.spec.containers.image` 字段): ```yaml image: docker.io/rancher/mirrored-flannelcni-flannel:v0.22.0 # 替换为 # 原始镜像: quay.io/coreos/flannel:v0.22.0 ``` #### 5. **关键权限配置** 确保已启用必要的 Linux 能力: ```yaml securityContext: capabilities: add: ["NET_ADMIN", "NET_RAW"] # 必须存在 ``` ### 验证步骤 1. 应用修改后的配置: ```bash kubectl apply -f kube-flannel.yml ``` 2. 检查 Pod 状态: ```bash kubectl get pods -n kube-system -l app=flannel ``` 3. 查看故障日志: ```bash kubectl logs -n kube-system <flannel-pod-name> --tail 100 ``` > **常见错误线索**: > - `"Subnet not found"` → 检查 CIDR 配置一致性 > - `"Failed to acquire lease"` → 检查网络接口绑定 > - `"MTU negotiation failed"` → 尝试在 Backend 中添加 `"MTU": 1450` ### 典型配置示例 ```yaml # 精简版有效配置片段 apiVersion: v1 kind: ConfigMap metadata: name: kube-flannel-cfg data: net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "host-gw", "MTU": 1500 } } --- apiVersion: apps/v1 kind: DaemonSet spec: template: spec: containers: - name: kube-flannel image: docker.io/rancher/mirrored-flannelcni-flannel:v0.22.0 args: ["--iface=eth0", "--ip-masq", "--kube-subnet-mgr"] securityContext: capabilities: { add: ["NET_ADMIN", "NET_RAW"] } ``` [^1]: Kubernetes 官方文档指出网络 CIDR 冲突是 Flannel 启动失败的常见原因。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值