flannel网络拓扑

news2024/12/25 14:01:56

测试环境创建

在k8s中部署flannel网络插件

https://blog.csdn.net/weixin_64124795/article/details/128894411

参考文章部署k8s集群和flannel网络插件

我的k8s集群物理环境

我的集群中只有两个节点master和node1节点

[root@master sjs]# kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   2d    v1.18.0
node1    Ready    <none>   44m   v1.18.0

允许master节点可以调度

kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule-

创建两个pod分别部署到两个节点上

pod.yaml文件

apiVersion: v1  #定义k8s api的版本v1
kind: Pod  #kind资源类型为 Pod
metadata: #元数据声明
  name: nginx # 名称是nginx
  labels:  #标签申明
    app: web  #标签名称是 app:web
spec:   #容器详细信息
  nodeSelector:
    kubernetes.io/hostname: master
  containers:  # 容器信息
    - name: nginx  #容器名称
      imagePullPolicy: Never
      image: app #容器镜像

pod1.yaml文件

apiVersion: v1  #定义k8s api的版本v1
kind: Pod  #kind资源类型为 Pod
metadata: #元数据声明
  name: nginx1 # 名称是nginx
  labels:  #标签申明
    app: web  #标签名称是 app:web
spec:   #容器详细信息
  nodeSelector:
    kubernetes.io/hostname: node1
  containers:  # 容器信息
    - name: nginx  #容器名称
      imagePullPolicy: Never
      image: app #容器镜像

kubectl apply -f pod1.yaml
kubectl apply -f pod.yaml

pod使用的镜像是我自己创建的,在master和node1节点上都执行

  1. 生成可执行文件 aa

    aa.c文件
    
    #include <stdio.h>
    #include <unistd.h>
    int main(){
            while(1) {
            sleep(100000);
            }
    }
    
    编译执行 gcc aa.c -o aa

  2. 编写dockerfile文件

    FROM ubuntu
    RUN apt update && apt install -y git curl net-tools  iputils-ping
    COPY aa .
    CMD ["./aa"]
    

  3. 生成镜像

    docker build -t app .

 

查看测试环境

查看创建的两个pod

可以看到两个pod分别运行在master和node1两个节点上,并且pod的ip不在同一个网段,这是因为在flannel网络插件中是每个节点一个网段的,master上的pod同属于一个网段,node1节点同属于一个网段。

在kube-flannel网络命名空间的kube-flannel-cfg的ConfigMap中全局定义了10.244.0.0/16网段,以后加入k8s的每个节点都会分配一个掩码为24的小网段给节点,比如在我的环境中给master节点分配了10.244.0.0/24网段,给node1分配了10.244.1.0/24的网段

[root@master sjs]# kubectl get pod -owide
NAME     READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx    1/1     Running   0          23m   10.244.0.14   master   <none>           <none>
nginx1   1/1     Running   0          23m   10.244.1.6    node1    <none>           <none>

flannel全局网段10.244.0.0/16

master网段10.244.0.0/24

node1网段10.244.1.0/24

pod互通测试

[root@master home]# kubectl exec -it nginx /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
root@nginx:/# ping 10.244.1.6
PING 10.244.1.6 (10.244.1.6) 56(84) bytes of data.
64 bytes from 10.244.1.6: icmp_seq=1 ttl=62 time=1.41 ms
64 bytes from 10.244.1.6: icmp_seq=2 ttl=62 time=1.10 ms

拓扑图

根据拓扑图来分析网络流量的流程

  1. 假设nginx访问nginx1,流量的过程 ping 10.244.1.6

  2. 首先查看nginx的pod里面的路由情况,匹配到默认路由,网关是10.244.0.1即是master节点的cni0

    root@nginx:/# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         10.244.0.1      0.0.0.0         UG    0      0        0 eth0
    10.244.0.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
    10.244.0.0      10.244.0.1      255.255.0.0     UG    0      0        0 eth0
    

  3. 因此访问nginx1的时候首先到达cni0,然后将报文送入master节点协议栈的网络层即ip_recv函数中,会经过netfilter点的prerouting(没有更改),经过master节点的路由判定发现ip地址10.244.1.6不是本机的地址,因此走转发流程即netfilter的forward的hook点,前面在进行路由匹配的时候已经知道了网关是10.244.1.0和出口flannel.1网卡,因此会将报文发到flannel网卡,进入后会组装报文的目的mac地址,那么网关10.244.1.0的mac地址是什么哪,下面可以看出,会将e6:1a:63:79:93:46组装入报文作为目的mac地址。

    [root@master home]# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.202.2   0.0.0.0         UG    0      0        0 ens33
    0.0.0.0         192.168.40.1    0.0.0.0         UG    100    0        0 ens38
    0.0.0.0         192.168.100.1   0.0.0.0         UG    101    0        0 ens37
    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
    172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
    192.168.40.0    0.0.0.0         255.255.255.0   U     100    0        0 ens38
    192.168.100.0   0.0.0.0         255.255.255.0   U     101    0        0 ens37
    192.168.202.0   0.0.0.0         255.255.255.0   U     0      0        0 ens33
    
    [root@master home]# ip neigh show dev flannel.1
    10.244.1.0 lladdr e6:1a:63:79:93:46 PERMANENT
    

  4. 因为flannel.1是vxlan口,接下来需要进行vxlan封装了,需要知道外层的ip地址是啥,这个是根据fdb表来根据mac地址查询的,查询出的ip地址是192.168.202.131

    [root@master home]# bridge fdb show flannel.1|grep e6:1a:63:79:93:46
    e6:1a:63:79:93:46 dev flannel.1 dst 192.168.202.131 self permanent

  5. 由于vxlan是将二层的报文封装到udp里,所有这里内核会将报文传入到传输层,进行port封装,再到网络层,将刚才查到的ip封装,然后进行路由从指定的网卡发出

  6. 在master的ens33上抓包

    tcpdump -i ens33 'udp[39]=1' -nv -w aa.cap

手动构建flannel拓扑

master节点配置

brctl addbr cni0                        #创建网桥名字为br0
ifconfig cni0 192.168.10.1/24 up

#创建两个网络命名空间
ip netns add vm1
ip netns add vm2

# 创建两对veth pair
ip link add veth0 type veth peer name veth1
ip link add veth00 type veth peer name veth11

ifconfig veth1 up
ifconfig veth11 up

# 将veth pair的一端放入网络命名空间
ip link set veth0 netns vm1
ip link set veth00 netns vm2

# 设置网络命名空间的网卡ip
ip netns exec vm1 ip addr add 192.168.10.2/24 dev veth0
ip netns exec vm2 ip addr add 192.168.10.3/24 dev veth00
ip netns exec vm1 ip link set veth0 up
ip netns exec vm2 ip link set veth00 up

# 设置网络命名空间的默认路由,192.168.10.1是cni0的网卡
ip netns exec vm1 ip route add default via 192.168.10.1 dev veth0
ip netns exec vm2 ip route add default via 192.168.10.1 dev veth00

# 将veth pair的一端放入到cni0
brctl addif  cni0 veth1               #将eth1网口和br0网口创建联系
brctl addif  cni0 veth11              #将eth2网口和br0网口创建联系

# 创建vxlan口,并指定出口网卡
ip link add flannel.1 type vxlan id 100 remote 192.168.202.130 dstport 4789 dev ens33   
ip link set flannel.1 up                        #开启vxlan接口
ip addr add 192.168.10.0/24 dev flannel.1        #为网桥配置ip地址

# 添加路由将流量引入到flannel.1网卡
route add -net 192.168.20.0/24  dev flannel.1
route add -net 192.168.20.0/24 gw 192.168.20.0 dev flannel.1

#添加vxlan对端的mac地址
ip neigh add 192.168.20.0 lladdr 9a:0c:28:83:52:e2 dev flannel.1

node节点

brctl addbr cni0                        #创建网桥名字为br0
ifconfig cni0  192.168.20.1/24 up

ip netns add vm1
ip netns add vm2

ip link add veth0 type veth peer name veth1
ip link add veth00 type veth peer name veth11

ifconfig veth1 up
ifconfig veth11 up

ip link set veth0 netns vm1
ip link set veth00 netns vm2

ip netns exec vm1 ip addr add 192.168.20.2/24 dev veth0
ip netns exec vm2 ip addr add 192.168.20.3/24 dev veth00
ip netns exec vm1 ip link set veth0 up
ip netns exec vm2 ip link set veth00 up

ip netns exec vm1 ip route add default via 192.168.20.1 dev veth0
ip netns exec vm2 ip route add default via 192.168.20.1 dev veth00


brctl addif  cni0 veth1               #将eth1网口和br0网口创建联系
brctl addif  cni0 veth11              #将eth2网口和br0网口创建联系


ip link add flannel.1 type vxlan id 100 remote 192.168.202.129 dstport 4789 dev ens33   
ip link set flannel.1 up                        #开启vxlan接口
ip addr add 192.168.20.0/24 dev flannel.1        #为网桥配置ip地址

route add -net 192.168.10.0/24  dev flannel.1
route add -net 192.168.10.0/24 gw 192.168.10.0 dev flannel.1

#添加vxlan对端的mac地址
ip neigh add 192.168.10.0 lladdr a6:e0:77:01:e4:17 dev flannel.1

验证

  1. node1的vm1 ping master的vm1

    [root@node1 ~]# ip netns exec vm1 ping 192.168.10.2
    PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
    64 bytes from 192.168.10.2: icmp_seq=1 ttl=62 time=0.991 ms
    64 bytes from 192.168.10.2: icmp_seq=2 ttl=62 time=2.32 ms
    64 bytes from 192.168.10.2: icmp_seq=3 ttl=62 time=4.42 ms
    

  2. node1的vm1 ping node1的flanneld.1

    [root@node1 ~]# ip netns exec vm1 ping 192.168.20.1
    PING 192.168.20.1 (192.168.20.1) 56(84) bytes of data.
    64 bytes from 192.168.20.1: icmp_seq=1 ttl=64 time=0.036 ms
    64 bytes from 192.168.20.1: icmp_seq=2 ttl=64 time=0.044 ms
    64 bytes from 192.168.20.1: icmp_seq=3 ttl=64 time=0.094 ms
    

  3. node1的vm1 ping node1的vm2

    [root@node1 ~]# ip netns exec vm1 ping 192.168.20.3
    PING 192.168.20.3 (192.168.20.3) 56(84) bytes of data.
    64 bytes from 192.168.20.3: icmp_seq=1 ttl=64 time=0.034 ms
    64 bytes from 192.168.20.3: icmp_seq=2 ttl=64 time=0.067 ms
    64 bytes from 192.168.20.3: icmp_seq=3 ttl=64 time=0.104 ms
    

  4. node1的vm1 ping master的flannel.1

    [root@node1 ~]# ip netns exec vm1 ping 192.168.10.1
    PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
    64 bytes from 192.168.10.1: icmp_seq=1 ttl=63 time=0.821 ms
    64 bytes from 192.168.10.1: icmp_seq=2 ttl=63 time=0.992 ms
    64 bytes from 192.168.10.1: icmp_seq=3 ttl=63 time=2.15 ms
    64 bytes from 192.168.10.1: icmp_seq=4 ttl=63 time=1.33 ms
    

  5. node1的vm1 ping node1的其他网卡

    [root@node1 ~]# ip netns exec vm1 ping 192.168.100.200
    PING 192.168.100.200 (192.168.100.200) 56(84) bytes of data.
    64 bytes from 192.168.100.200: icmp_seq=1 ttl=64 time=0.065 ms
    64 bytes from 192.168.100.200: icmp_seq=2 ttl=64 time=0.079 ms
    64 bytes from 192.168.100.200: icmp_seq=3 ttl=64 time=0.101 ms
    

  6. node1的vm1 ping外部网络,没ping通,这是因为vm1的ip是一个内部ip

    [root@node1 ~]# ip netns exec vm1 ping 192.168.100.1
    PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
    
    
    

  7. 在外部网络的192.168.100.1网卡上抓包是能够收到报文的,只是返回的时候找不到路所有访问不通

  8. 那么怎么解决访问不通的问题,可以想到使用snat可以实现,将源ip地址是192.168.20.0/24的转换为192.168.100.200

  9. 在node1上执行

    iptables -t nat -A POSTROUTING  -s 192.168.20.0/24  -j SNAT --to-source 192.168.100.200

  10. 在master执行

    iptables -t nat -A POSTROUTING  -s 192.168.10.0/24  -j SNAT --to-source 192.168.100.100

  11. 再从node1的vm1 ping外部网络

    [root@node1 ~]# ip netns exec vm1 ping 192.168.100.1
    PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
    64 bytes from 192.168.100.1: icmp_seq=1 ttl=127 time=0.484 ms
    64 bytes from 192.168.100.1: icmp_seq=2 ttl=127 time=0.818 ms
    64 bytes from 192.168.100.1: icmp_seq=3 ttl=127 time=0.789 ms
    64 bytes from 192.168.100.1: icmp_seq=4 ttl=127 time=0.785 ms
    

  12. 抓包查看

https://zhuanlan.zhihu.com/p/550273312?utm_id=0

https://blog.csdn.net/qq_36963950/article/details/130542890?spm=1001.2014.3001.5506

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1463136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧安防/视频监控汇聚平台EasyCVR如何通过接口调用获取设备录像回看的流地址?

视频云存储/视频融合/安防监控EasyCVR视频汇聚系统可兼容各品牌的IPC、NVR、移动单兵、智能手持终端、移动执法仪、无人机、布控球等设备的接入&#xff0c;支持的接入协议包括&#xff1a;国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&am…

【DDD】学习笔记-领域事件

作为一种领域分析建模方法&#xff0c;事件风暴将事件视为一种建模的手段&#xff0c;将不同的团队角色统一到一个共同的业务场景下&#xff0c;同时又利用了事件的因果关系驱动我们把握业务的整体流程。在这个过程中&#xff0c;领域事件在事件风暴中起到了核心的驱动作用&…

JSON.stringify() 第三个参数的使用

语法 JSON.stringify(value[, replacer[, space]]) 参数说明&#xff1a; value: 必需&#xff0c; 要转换的 JavaScript 值&#xff08;通常为对象或数组&#xff09;。 replacer: 可选。用于转换结果的函数或数组。 如果 replacer 为函数&#xff0c;则 JSON.stringify …

C++从入门到精通 第十四章(STL容器)【上】

写在前面&#xff1a; 本系列专栏主要介绍C的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程&#xff0c;笔者的原创部分主要在示例代码的注释部分。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C教材&#xff08;比…

分享58个NodeJs爬虫源码总有一个是你想要的

分享58个NodeJs爬虫源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1_Im6ituI4izxP05oyA2z3Q?pwd8888 提取码&#xff1a;8888 项目名称 anyproxy 、nodejs …

【算法 - 动态规划】最长回文子序列

上篇文章中&#xff0c;我们学习一个新的模型&#xff1a; 样本对应模型&#xff0c;该模型的套路就是&#xff1a;以结尾位置为出发点&#xff0c;思考两个样本的结尾都会产生哪些可能性 。 而前篇文章中的 纸牌博弈问题 属于 [L , R]上范围尝试模型。该模型给定一个范围&…

爬虫基本库的使用(requests库的详细解析)

注&#xff1a;本文一共4万多字&#xff0c;希望读者能耐心读完&#xff01;&#xff01;&#xff01; 前面,我们了解了urllib库的基本用法&#xff08;爬虫基本库的使用(urllib库的详细解析)-CSDN博客&#xff09;。其中&#xff0c;确实又不方便的地方。例如处理网页验证…

P2670 [NOIP2015 普及组] 扫雷游戏 ---- 洛谷

题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n 行 m 列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。玩家翻开一个非地雷格时&#xff0c;该格将会出现一个数字——提示周围格子…

【前端素材】推荐优质后台管理系统Xoric平台模板(附源码)

一、需求分析 当我们从多个层次来详细分析后台管理系统时&#xff0c;可以将其功能和定义进一步细分&#xff0c;以便更好地理解其在不同方面的作用和实际运作。 1. 功能层次 a. 用户管理功能&#xff1a; 用户注册和登录&#xff1a;管理用户账户的注册和登录过程。权限管…

C#上位机与三菱PLC的通信08---开发自己的通讯库(A-1E版)

1、A-1E报文回顾 具体细节请看&#xff1a; C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析 C#上位机与三菱PLC的通信04--MC协议之A-1E报文测试 2、为何要开发自己的通讯库 前面使用了第3方的通讯库实现了与三菱PLC的通讯&#xff0c;实现了数据的读写&#xff0c;对于通…

熬夜整理的考研考公学习资料,祝愿大家成功上岸

现如今大学生毕业大都在考研、考公这两条道路上选一个。今天给这些朋友同学分享一下考研、考公的学习资料。希望能够帮助到部分努力的同学&#xff01; 以下就是考研、考公的学习资料 学习资料获取地址 点击获取学习资料 就拿考研来说这里不仅包含了深入浅出的复习笔记&#x…

steam搬砖项目还能不能做,新手小白月入过万真的假的

steam搬砖项目还能不能做&#xff1f;今天&#xff0c;我们将通过实际数据来告诉你&#xff0c;当前市场上存在着大量没有实操过Steam搬砖项目的人&#xff0c;他们也开始参与其中&#xff0c;导致市场格局混乱。这些人可能是第一次接触该项目&#xff0c;但却毫不犹豫地发表自…

Facebook Horizon:探索虚拟现实中的社交空间

随着科技的不断进步&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正成为社交互动和娱乐体验的新前沿。在这个数字时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;正在引领虚拟社交的新时代&#xff0c;其推出的虚拟社交平台Facebook Horizon成为了…

如何使用Docker部署MongoDB并结合内网穿透实现远程访问本地数据库

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 …

Fiddler工具 — 19.Fiddler抓包HTTPS请求(二)

5、查看证书是否安装成功 方式一&#xff1a; 点击Tools菜单 —> Options... —> HTTPS —> Actions 选择第三项&#xff1a;Open Windows Certificate Manager打开Windows证书管理器。 打开Windows证书管理器&#xff0c;选择操作—>查看证书&#xff0c;在搜索…

【webrtc】m77 PacedSender

mediasoup是m77的代码,m77的代码并没有paced controller ,而且与paced sender 的逻辑混在了一起。结合大神们的代码分析,对照m77 进行 理解。m77 有ProbeController。给pacersender 更新飞行数据:PacedSender::InsertPacket(size_t bytes) 对应的是 PacingController::OnPa…

微信小程序错误----config is not defined

微信小程序出错 请求头发生错误 修改 options.header {// 为请求头对象添加 token 验证的 Authorization 字段Access-Token: token,platform: MP-WEIXIN,// 保留原有的 header...options.header,}

运维SRE-11 备份服务及备份项目

1.第一个服务-rsync备份服务-守护进程模式 1.1概述 守护进程&#xff1a;持续运行的进程&#xff0c;也可以叫作服务服务一般分为&#xff1a;服务端与客户端服务端&#xff1a;linux服务器上运行的各种服务软件客户端&#xff1a;linux中的客户端可能是一个命令&#xff0c;…

Android 11以上获取不到第三方app是否安装

开年第一篇&#xff0c;处理了一下年前的小问题。 问题&#xff1a;本地app跳转到第三方app地图进行导航&#xff0c;获取不到第三方地图是否安装。 解决&#xff1a; 1.添加包名 This can be done by adding a <queries> element in the Android manifest.在app下的…

性能全面提升!探索ONLYOFFICE最新8.0版:更快速、更强大,PDF表单编辑轻松搞定!

文章目录 PDF表单功能表单模板 屏幕朗读器功能EXCEL新增功能单变量求解图表向导数字排序 PPT 新增功能新增语言区域设置和优化插件界面 ONLYOFFICE 是由 Ascensio System SIA 推出的一款功能强大的办公套件&#xff0c;其中提供了适用于文本文档、表格以及演示文稿的在线编辑软…