flannel网络拓扑

测试环境创建

在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.mfbz.cn/a/403745.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 索引原理以及 SQL 优化

索引 索引&#xff1a;一种有序的存储结构&#xff0c;按照单个或者多个列的值进行排序。索引的目的&#xff1a;提升搜索效率。索引分类&#xff1a; 数据结构 B 树索引&#xff08;映射的是磁盘数据&#xff09;hash 索引&#xff08;快速锁定内存数据&#xff09;全文索引 …

华为OD机试真题-查找接口成功率最优时间段-2023年OD统一考试(C卷)--Python3--开源

题目&#xff1a; 考察内容&#xff1a; for 时间窗口list(append, sum, sort) join 代码&#xff1a; """ 题目分析&#xff1a;最长时间段 且平均值小于等于minLost同时存在多个时间段&#xff0c;则输出多个&#xff0c;从大到小排序未找到返回 NULL 输入…

PostgreSQL 的实体化视图介绍

PostgreSQL 实体化视图提供一个强大的机制&#xff0c;通过预先计算并将查询结果集存储为物理表来提高查询性能。本教程将使用 DVD Rental Database 数据库作为演示例子&#xff0c;指导你在 PostgreSQL中创建实体化视图。 了解实体化视图 实体化视图是查询结果集的快照&…

T-Dongle-S3开发笔记——分区表

参考&#xff1a; ESP32之 ESP-IDF 教学&#xff08;十三&#xff09;—— 分区表_esp32分区表-CSDN博客 分区表 - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com) 分区表是 ESP32 划分内部 flash 闪存的清单&#xff0c;它将 flash 划分为多个不同功能的区域用于…

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

一、需求分析 后台管理系统是一个集成了多种功能模块的系统&#xff0c;通过这些模块的协同工作&#xff0c;实现对网站、应用程序或系统的全面管理和控制。管理员通过后台管理系统可以高效地管理用户、内容、数据、权限等方面的工作&#xff0c;确保系统的正常运行和安全性。…

MariaDB落幕和思考

听过MySQL的基本也都知道 MariaDB。MariaDB由MySQL的创始人主导开发&#xff0c;他早前曾以10亿美元的价格&#xff0c;将自己创建的公司MySQL AB卖给了SUN&#xff0c;此后&#xff0c;随着SUN被甲骨文收购&#xff0c;MySQL的所有权也落入Oracle的手中。传闻MySQL的创始人担心…

【火猫TV】DOTA2-喀山未来运动会:LGD 战队2-0击败Neon

在2月22号进行的俄罗斯喀山未来运动会DOTA2项目淘汰赛上,LGD 战队以2-0击败Neon战队晋级下一轮。双方对阵第二局,LGD对线期三路优,中期圣堂小鱼越打越肥,轻松拿下了比赛的胜利,以下是对决战报。转载:火猫TV资讯https://www.huomaotv.com/ LGD战队在天辉,阵容是小鱼、圣堂、玛尔…

使用ffmpeg实现视频片段截取并保持清晰度

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg -i input.mp4 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-ve…

Python Web开发记录 Day2:CSS

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 二、CSS1、CSS-初始入门①快速了解②CSS应用方式…

SpringCloud(14)之SpringCloud Consul

我们知道 Eureka 2.X 遇到困难停止开发了&#xff0c;所以我们需要寻找其他的替代技术替代Eureka&#xff0c;这一小 节我们就讲解一个新的组件Consul。 一、Consul介绍 Consul 是 HashiCorp 公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。与其它分布式…

横空出世,Bright Data 低代码数据平台,即将颠覆你的认知!

大家好&#xff0c;我是锋哥&#xff0c;最近接了个监控平台的私活项目。由于监控公开的站点太多&#xff0c;在我无从下手迷茫之际&#xff0c;竟然无意中发现了这个宝藏级低代码数据平台 - 亮数据。功能强大&#xff0c;性能炸裂&#xff01; 传统开发 以前我们开发这种监控…

文件上传漏洞--Upload-labs--Pass10--双写绕过

一、什么是双写绕过 顾名思义&#xff0c;双写绕过就是双写文件后缀名来进行绕过&#xff0c;如&#xff1a;test.php 双写后为 test.pphphp。通常情况下双写绕过用于绕过源代码中的 str_ireplace()函数。 二、双写绕过原理 1、首先进行代码审计&#xff0c;源代码中有黑名单…

HTML5 Canvas 限定文本区域大小,文字自动换行,自动缩放

<!DOCTYPE html> <html> <body><h1>HTML5 Canvas 限定文本展示范围、自动计算缩放字体大小</h1><div id"tips">0</div> <div id"content">良田千顷不过一日三餐广厦万间只睡卧榻三尺良田千顷不过一日三餐…

六、回归与聚类算法 - 岭回归

目录 1、带有L2正则化的线性回归 - 岭回归 1.1 API 2、正则化程度的变化对结果的影响 3、波士顿房价预测 线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法&#xff1a;逻辑回归模型保存与加载无监督学习&#xff1a;K-means算法 1、带有L2正则化的线性回归 - 岭回…

ktorm + ktorm-ksp + springboot搭建RBAC后台模板 实践

本文代码仓库&#xff1a;https://github.com/okfanger/ktorm-ksp-springboot-demo 0. 前言 使用kotlin写springboot是前几个月突然萌生的想法&#xff0c;起因是看到了 ktorm 官网里的一个截图&#xff1a; 没错&#xff0c;你可以一眼看出这款 orm 框架的特点&#xff0c…

测斜孔造孔与测斜管安装有什么要求

在工程测量中&#xff0c;测斜孔的造孔和测斜管的安装是两个重要的环节&#xff0c;它们直接关系到测量结果的准确性和可靠性。为了确保测斜孔造孔和测斜管安装的质量&#xff0c;需要遵循一系列严格的要求和规范。 测斜孔的造孔应遵循以下要求&#xff1a;钻孔应呈铅直布置&am…

探索数据宝藏:填写《全国数据资源调查》的乐趣与技巧

2月19日&#xff0c;国家数据局等四部门发布关于开展全国数据资源调查的通知。通知提出&#xff0c;为贯彻落实《数字中国建设整体布局规划》工作部署&#xff0c;摸清数据资源底数&#xff0c;加快数据资源开发利用&#xff0c;更好发挥数据要素价值&#xff0c;国家数据局、中…

袋鼠云产品功能更新报告09期|更全面,更多样,更高效

欢迎阅读袋鼠云09期产品功能更新报告。在此期报告中&#xff0c;我们秉持创新与优化并重的理念&#xff0c;对产品进行了深度打磨与全面升级。每一处细节的改进&#xff0c;都是我们对卓越品质的不懈追求&#xff0c;期待这些新功能能助力您的业务运营与发展&#xff0c;让数字…

openssl 生成nginx自签名的证书

1、命令介绍 openssl req命令主要的功能有&#xff0c;生成证书请求文件&#xff0c; 查看验证证书请求文件&#xff0c;还有就是生成自签名证书。 主要参数 主要命令选项&#xff1a; -new :说明生成证书请求文件 -x509 :说明生成自签名证书 -key :指定已…

ChatGPT 是什么

文章目录 一、ChatGPT 是什么二、ChatGPT的发明者三、ChatGPT的运作方式四、ChatGPT的技术五、ChatGPT的优势六、ChatGPT的局限性七、ChatGPT的应用八、ChatGPT的未来九、总结 一、ChatGPT 是什么 OpenAI的ChatGPT&#xff0c;即Chat Generative Pre-Trained Transformer&…