写在前面

最近用kubeadm鼓捣了几个cluster集群测试用,网络用的flannel。因为这些机器都不是纯净的环境(以前部署过其他的k8s或者有一些特别的设置),所以部署起来遇到了很多问题。看了下相关的文章,梳理了flannel的vxlan的工作原理,成功对这几个环境进行了排障。本文主要是相关流程的笔记记录。

容器间通信

本文以两个节点上的两个容器间通信为例,介绍网络报文的流转过程以及可能出现的问题。

flannel使用的镜像为quay.io/coreos/flannel:v0.11.0-amd64

我现在部署有两个node节点,节点ip为10.10.10.21610.10.10.217。本文将以这两个节点上的容器为例。介绍两个容器是如何通讯的。

节点 容器IP段 容器IP
10.10.10.216 10.244.0.0/24 10.244.0.6
10.10.10.217 10.244.1.0/24 10.244.1.2

首先讲下 10.244.0.6 和 10.244.1.2 两个容器间的通信流程。我们这里以从10.244.0.6向10.244.1.2 发送数据包为例。

10.244.0.6容器在节点10.10.10.216。我们可以通过ip add命令查看到容器在物理机上的veth卡。

[root@node-64-216 ~]# ip add
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether e0:db:55:13:7a:74 brd ff:ff:ff:ff:ff:ffinet 10.10.10.216/24 brd 10.10.10.255 scope global em1valid_lft forever preferred_lft forever
23: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default link/ether 8a:28:fa:8e:8c:4b brd ff:ff:ff:ff:ff:ffinet 10.244.0.0/32 scope global flannel.1valid_lft forever preferred_lft forever
24: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000link/ether ee:b2:9e:95:af:9d brd ff:ff:ff:ff:ff:ffinet 10.244.0.1/24 scope global cni0valid_lft forever preferred_lft forever
29: vethb547248d@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP group default link/ether 8e:f6:51:f5:9b:a3 brd ff:ff:ff:ff:ff:ff link-netnsid 2

因为这里使用了cni接口标准,这个veth卡会桥接在cni0的网桥上。这个我们可以通过brctl show进行查看。

[root@node-64-216 ~]# brctl show
bridge name bridge id       STP enabled interfaces
cni0        8000.eeb29e95af9d   no      vethb547248dvethe527455bvetheb3a1d6b

数据包走到了cni0的网桥后,根据已经的目标ip,10.244.1.2,可以查找路由表,根据路由和掩码,选择对应的iface,也就是flannel.1。且下一跳,也就是10.244.1.0。

[root@node-64-216 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.10.10.1       0.0.0.0         UG    0      0        0 em1
10.10.10.0       0.0.0.0         255.255.255.0   U     0      0        0 em1
10.244.0.0      0.0.0.0         255.255.255.0   U     0      0        0 cni0
10.244.1.0      10.244.1.0      255.255.255.0   UG    0      0        0 flannel.1

进入到flannel.1如何知道应该发向哪个物理机呢。这个时候,其实是通过arp来获取。可以通过arp命令查看到对应的mac地址。

[root@node-64-216 ~]# arp -e
Address                  HWtype  HWaddress           Flags Mask            Iface
10.244.1.0               ether   3e:01:ed:47:de:7f   CM                    flannel.1

这个mac地址在vxlan中,可以通过bridge fdb show来进行查看。可以看到,如果是发向3e:01:ed:47:de:7f的地址,则目标机器在10.10.10.217机器上。则数据就会流转到10.10.10.217上了。经过vxlan封包后的数据包就会经过em1设备发向到10.10.10.217上。

[root@node-64-216 ~]# bridge fdb show
3e:01:ed:47:de:7f dev flannel.1 dst 10.10.10.217 self permanent

在10.10.10.217上,首先经过了iptables链,而后在flannel.1的Iface上则接收到该数据包。这里我们可以看到,flannel.1的mac地址就是3e:01:ed:47:de:7f

这里我曾经就是遇到过被iptables的forward链拦住的情况。如果数据包在216的flannel.1上可以监测到,但是217的flannel.1中断了,则可以检查216到217之间的路由情况以及217的iptables链的情况。

[root@node-64-217 ~]# ip add
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 90:b1:1c:33:b4:b1 brd ff:ff:ff:ff:ff:ffinet 10.10.10.217/24 brd 10.10.10.255 scope global em1valid_lft forever preferred_lft forever
152: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default link/ether 3e:01:ed:47:de:7f brd ff:ff:ff:ff:ff:ffinet 10.244.1.0/32 scope global flannel.1valid_lft forever preferred_lft forever
153: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000link/ether 36:11:ab:93:2f:6f brd ff:ff:ff:ff:ff:ffinet 10.244.1.1/24 scope global cni0valid_lft forever preferred_lft forever
154: veth7f8b8e9e@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP group default link/ether 06:2f:35:74:cd:de brd ff:ff:ff:ff:ff:ff link-netnsid 0

到达flannel.1后,根据路由表,查看10.244.1.2的路由应送到217的cni0的网桥上。

[root@node-64-217 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.10.10.1       0.0.0.0         UG    0      0        0 em1
10.10.10.0       0.0.0.0         255.255.255.0   U     0      0        0 em1
10.244.0.0      10.244.0.0      255.255.255.0   UG    0      0        0 flannel.1
10.244.1.0      0.0.0.0         255.255.255.0   U     0      0        0 cni0

这里我们查看cni0的网桥信息。

[root@node-64-217 ~]# brctl show
bridge name bridge id       STP enabled interfaces
cni0        8000.3611ab932f6f   no      veth5a89e906veth7f8b8e9e

到达网桥后,就可以根据地址将数据送到10.244.1.2的对应的veth上,进而在容器中收到对应的数据包了。

以上就是两个处于不同物理机上的容器间发送数据包的流程。相比较来说,从容器到物理机的ping就简单多了。这个流程就是veth->cni0->em1->对端物理机ip。这里就不详细叙述了。

同一台物理机上不同容器的ping只需要经过cni0的网桥就可以了。

排障的主要思路

在梳理了数据包的正常流转过程后,就可以用tcpdump来进行问题的定位,进而排查出哪个环节出现了问题,进而查看问题产生的原因。

还是以两个物理机上的两个容器之间的通信为例,可以从一个容器向另一个容器进行ping,然后使用tcpdump分别在发起ping的容器的物理机上抓cni0,flannel.1,以及目标容器的物理机上抓flannel.1,cni0上进行抓包。看看是在哪个环节丢失的数据包。

比如在发起ping的物理机的cni0上有数据包,但是发起ping的物理机的flannel.1上没有,则可能路由发生了问题,需要查看路由表。

又比如前文中提到过的在发起ping的容器的物理机上flannel.1上可以抓到数据包,但是在目标容器的物理机的flannel.1上抓不到,则可能是二者之间的路由问题或者iptables导致的。

参考资料

  • vxlan 协议原理简介 https://cizixs.com/2017/09/25/vxlan-protocol-introduction/
  • VXLAN技术研究 https://blog.csdn.net/sinat_31828101/article/details/50504656
  • Flannel中vxlan backend的原理和实现 http://dockone.io/article/2216

转载于:https://www.cnblogs.com/xuxinkun/p/11003375.html

flannel vxlan工作基本原理及常见排障方法相关推荐

  1. FTP基础知识及排障方法

    FTP基础知识及排障方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" / ...

  2. 工业以太网交换机故障的排障步骤

    工业以太网交换机在工业安防领域的应用可以说是非常的广泛了,我们在使用工业交换机的过程中,难免会遇到各种各样的故障问题,但是工业以太网交换机的故障有多种多样,不同的故障有不同的表现形式,那么,我们在遇到 ...

  3. 总结 Underlay 和 Overlay 网络,在k8s集群实现underlay网络,网络组件flannel vxlan/ calico IPIP模式的网络通信流程,基于二进制实现高可用的K8S集群

    1.总结Underlay和Overlay网络的的区别及优缺点 Overlay网络:  Overlay 叫叠加网络也叫覆盖网络,指的是在物理网络的 基础之上叠加实现新的虚拟网络,即可使网络的中的容器可 ...

  4. 5大网络排障工具,擅长使用这些的网工受益无穷

    网络排障作为每个网工的必备技能,也是工作上的一个难点,如果能用好网络故障排除工具能高效提升你的工作效率,非常的好用!还不快来看看吗? 1.局域网分析工具 IP Tools:Network Utilit ...

  5. Traceroute网络排障实用指南

    目录 一.概述 1.1 什么是Traceroute 1.2Traceroute的问题所在 二.Traceroute原理 2.1Traceroute实现原理 2.2Traceroute实现细节 2.3T ...

  6. MySQL集群节点宕机,数据库脑裂!如何排障?

    作者介绍 王晶,中国移动DBA,负责"移动云"业务系统的数据库集成架构设计.运维.优化等工作:擅长技术领域MySQL,获Oracle颁发的"MySQL DBA" ...

  7. 【干货】掌握这5招,Linux排障不再怕

    Linux排障技巧在数据中心十分受人重视.数据中心专家对此提供了一些Linux服务器排障相关的性能问题.优化和便利工具参考. 1.Linux性能工具好用吗? 也许你从没使用过pchar.pidstat ...

  8. 浏览器卡怎么办_【十全十美】宽带断线、wifi连不上怎么办?自助排障帮到你!...

    如您接到第三方调研电话,期待您给予我们"10分",您的满意是我们前行的动力! 疫情期间少走动宅在家里看新闻听消息,突然发现上网卡顿,网络断开了?小编在这里为您提供了一份线上自助排障 ...

  9. flannel vxlan 实现原理【转】

    flannel是coreos为kubernets提供的网络解决方案,主要为打通跨节点的容器通信,其中vxlan模式为flannel实现的一种后端模式,其他模式还包括udp, host-gw等,可以通过 ...

最新文章

  1. 【FFmpeg】如何通过字符串到对应的封装器,以flv为例
  2. 开发板运行linux下虚拟机ubuntu的ping
  3. M - Kill the tree 计蒜客 - 42552(2019icpc徐州/树的重心/树形dp)
  4. Oracle 制造死锁和查询死锁
  5. windows下配置tensorflow
  6. linux c语言 文件拷贝,怎么在linux下用c编程实现文件的复制
  7. apache php 503,宝塔linux面板 apache网站访问报错503 Service Unavailable解决
  8. 跨境电商站外引流?FB必不可少!
  9. 【Java】HBase_thrift/thrift2_使用指南
  10. 计算机专业直接工作简历,计算机专业个人简历工作经验怎么写
  11. The Dominant Color (20)
  12. camera 自动对焦手动对焦
  13. 茶 与 茶道 之 人生如茶
  14. UVC驱动分析一条龙
  15. 用思维导图赏析老舍话剧著作《茶馆》
  16. python取整数部分的几种方法
  17. telegram如何扫码加人
  18. 医疗器械计算机培训,深度学习,AI医疗器械“学然后知不足”
  19. java爬虫爬取互联网上的各大影视网站---360影视(附源码下载)
  20. 2022年高教社杯全国大学生数学建模竞赛解题思路

热门文章

  1. 高校云计算机中心建设方案,最新某大学云数据中心建设方案.pdf
  2. php getlastid,PHP-获取最后一个插入ID
  3. java图片框架_Java图片处理开源框架
  4. vue的v-html使用
  5. Java中Double保留后小数位的几种方法
  6. IDEA 修改项目名称
  7. Git如何创建本地分支并推送到远程仓库
  8. 【赠书活动】清华社的两本Android技术书籍
  9. Kotlin入门(7)循环语句的操作
  10. 新微擎 v1.7.9 图文回复 标题emoji