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 # 名称是nginxlabels:  #标签申明app: web  #标签名称是 app:web
spec:   #容器详细信息nodeSelector:kubernetes.io/hostname: mastercontainers:  # 容器信息- name: nginx  #容器名称imagePullPolicy: Neverimage: app #容器镜像

pod1.yaml文件

apiVersion: v1  #定义k8s api的版本v1
kind: Pod  #kind资源类型为 Pod
metadata: #元数据声明name: nginx1 # 名称是nginxlabels:  #标签申明app: web  #标签名称是 app:web
spec:   #容器详细信息nodeSelector:kubernetes.io/hostname: node1containers:  # 容器信息- name: nginx  #容器名称imagePullPolicy: Neverimage: 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 veth11ifconfig 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 upip netns add vm1
ip netns add vm2ip link add veth0 type veth peer name veth1
ip link add veth00 type veth peer name veth11ifconfig veth1 up
ifconfig veth11 upip link set veth0 netns vm1
ip link set veth00 netns vm2ip 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 upip 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 veth00brctl 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://xiahunao.cn/news/2803658.html

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

相关文章

音视频技术-声反馈啸叫的产生与消除

目录 1.均衡调节: 2.移频法: 3.移相法: 4.比较法: 在扩音系统中,产生啸叫危害很大,一方面影响会议、演出等活动的正常进行,另一方面严重的啸叫会导致音响设备的损坏。 “啸叫”是“声反馈”的俗称,形成的机制复杂,消除的手段多样,专业调音师也对

Windows软件卸载基本思路

&#x1f4ab;作者&#xff1a;南城余 &#x1f31f;全平台账号&#xff1a;公众号、CSDN、GitHub、语雀、知乎 前提提要&#xff1a; 相信大家都被Windows软件卸载恶心过吧&#xff1f; 那Windows软件到底应该怎么卸载呢&#xff1f; 跟着下面方法&#xff0c;你一定可以成…

谷歌最新黑科技:Gemini 1.5携100万Token挑战AI多模态极限

最近科技圈再次迎来震撼弹&#xff01;除了火爆全球的openAI Sora文生视频模型外&#xff0c;谷歌发布了其大模型矩阵的最新成员——Gemini 1.5&#xff0c;一举将上下文窗口长度扩展至惊人的100万个tokens。这不仅仅是一个简单的数字增加&#xff0c;而是一次划时代的飞跃&…

SpringCloud-Gateway解决跨域问题

Spring Cloud Gateway是一个基于Spring Framework的微服务网关&#xff0c;用于构建可扩展的分布式系统。在处理跨域问题时&#xff0c;可以通过配置网关来实现跨域资源共享&#xff08;CORS&#xff09;。要解决跨域问题&#xff0c;首先需要在网关的配置文件中添加相关的跨域…

linux逻辑卷/dev/mapper/centos-root扩容增加空间

centos7中/dev/mapper/centos-root扩容 问题文件系统根目录&#xff0c;/dev/mapper/centos-root空间满了&#xff0c;导致k8s不停重启 1.查看磁盘情况 df -h #查看最大占用目录 du -h -x --max-depth12.查看磁盘信息 fdisk -l3.查看磁盘分区层级 lsblk可见剩余空闲60G空间…

二十三、视频处理和保存

项目功能实现&#xff1a;获取视频的参数信息&#xff0c;对视频文件进行转换到HSV色域空间并保存到指定路径中去 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 video_save.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class Vid…

Redis(十六)缓存预热+缓存雪崩+缓存击穿+缓存穿透

文章目录 面试题缓存预热缓存雪崩解决方案 缓存穿透解决方案 缓存击穿解决方案案例&#xff1a;高并发聚划算业务 总结表格 面试题 缓存预热、雪崩、穿透、击穿分别是什么?你遇到过那几个情况?缓存预热你是怎么做的?如何避免或者减少缓存雪崩?穿透和击穿有什么区别?他两是…

websocket了解下

websocket请求长啥样 GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ Sec-WebSocket-Version: 13 啥是websocket websocket是http的一种&#xff0c;服务器可以主动向客户端推送信息&#xff0c;…

电阻篇 | 二、压敏电阻

电阻篇 | 二、压敏电阻 定义 压敏电阻是一种具有非线性伏安特性得电阻器件&#xff0c;无极性&#xff0c;主要用在电路承受过压时进行电压钳位&#xff0c;吸收多余得电流以保护敏感器件&#xff0c;英文名称 Voltage Dependent Resistor&#xff0c;简称VDR&#xff0c;或者…

适合上班族使用的便签备忘录推荐哪个?

在如今较为繁忙的职场中&#xff0c;上班族家人们经常需要处理各种琐碎的工作任务。为了更好地管理时间、提高工作效率&#xff0c;一款好用的便签备忘录成为了不少上班族的首选工具。市面上各式各样的便签备忘录都有&#xff0c;但好用便签以其简洁方便的操作方式和多样化功能…

Excel快速下拉填充数据至9999行,再筛选出想要的数据

1 测试计算公式 2 选中单元格 3 批量赋值 4 数据筛选&#xff1a; 数据 -> 自动筛选 &#xff0c;列头出现三角箭头&#xff0c;进行过滤就可以了

证件照(兼容H5,APP,小程序)

证件照由uniappuyui开发完成&#xff0c;并同时兼容H5、App、微信小程序、支付宝小程序&#xff0c;其他端暂未测试。 先看部分效果图吧具体可以下方复制链接体验demo 首页代码 <template><view class""><view class"uy-m-x-30 uy-m-b-20"…

记一次 Flink 作业启动缓慢

记一次 Flink 作业启动缓慢 背景 应用发现&#xff0c;Hadoop集群的hdfs较之前更加缓慢&#xff0c;且离线ELT任务也以前晚半个多小时才能跑完。此前一直没有找到突破口所以没有管他&#xff0c;推测应该重启一下Hadoop集群就可以了。今天突然要重启一个Flink作业&#xff0c…

大模型分布式训练方法FDSP和DeepSpeed

备注&#xff1a; 本文部分内容参考自其他作者的内容&#xff0c;如有不妥&#xff0c;请联系&#xff0c;立即删除。 pytorch单精度、半精度、混合精度、单卡、多卡&#xff08;DP / DDP&#xff09;、FSDP、DeepSpeed模型训练 相关代码&#xff1a;pytorch-model-train-temp…

python递归算法

递归算法 一、嵌套调用的过程二、递归的基本原则1、递归的基本原则2、无限递归调用3、正常递归调用4、阶乘问题5、力扣&#xff1a;231. 2 的幂6、力扣面试题 08.05. 递归乘法7、力扣、326. 3 的幂8、力扣342. 4的幂 一、嵌套调用的过程 def show1():print("show 1 run s…

Node.js安装及环境配置

1. 前言 Node.js简介 Node.js 是一个开源的、跨平台的 JavaScript 运行环境&#xff0c;它允许开发者使用 JavaScript 编写服务器端代码。Node.js 基于 Google 的 V8 JavaScript 引擎构建&#xff0c;该引擎是 Chrome 浏览器中用于解析和执行 JavaScript 的核心组件。因此&am…

聊天敏感词监控该怎样实现?

当员工在日常工作中&#xff0c;经常使用企业微信、钉钉等聊天通讯软件进行沟通和管理&#xff0c;不可避免地会出现员工和客户之间敏感行为的出现。 例如员工飞单、辱骂客户、私自承诺、收取红包等违规行为&#xff0c;这些不仅会影响公司形象&#xff0c;还会造成经济损失。…

MATLAB Function转C代码实战

文章目录 前言1. 准备工作2. 使用MATLAB Coder2.1 确定输入输出的类型2.2 MATLAB Coder过程 3. 代码调整和优化4. 编译和测试5. 性能分析和优化结语 前言 在科学与工程领域&#xff0c;MATLAB&#xff08;Matrix Laboratory&#xff09;是一种广泛使用的高级技术计算软件&…

云图极速版限时免费活动

产品介绍 云图极速版是针对拥有攻击面管理需求的用户打造的 SaaS 应用&#xff0c;致力于协助用户发现并管理互联网资产攻击面。 实战数据 (2023.11.6 - 2024.2.23) 云图极速版上线 3 个月以来&#xff0c;接入用户 3,563 家&#xff0c;扫描主体 19,961 个&#xff0c;累计发…

什么是ChatGPT

国外有篇文章解释了ChatGPT的开发技术是什么&#xff0c;GPT-3和GPT-4的区别&#xff0c;以及未来的可能性。 截至 2023 年&#xff0c;ChatGPT 等生成式 AI 服务正在全球引起关注&#xff0c;并且正在探索在广泛领域的应用。 您可能想知道 ChatGPT 是使用哪种开发技术制作的&a…