零入门容器云网络-6:基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信测试案例

news2024/12/24 10:04:26

已发表的技术专栏(订阅即可观看所有专栏)
0  grpc-go、protobuf、multus-cni 技术专栏 总入口

1  grpc-go 源码剖析与实战  文章目录

2  Protobuf介绍与实战 图文专栏  文章目录

3  multus-cni   文章目录(k8s多网络实现方案)

4  grpc、oauth2、openssl、双向认证、单向认证等专栏文章目录


本篇文章继续提供测试案例:
基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信

1、网络拓扑如下

在这里插入图片描述

2、网络拓扑构建

2.1、第1步:在master上执行下面的命令

ip netns add ns1

ip link add veth1a type veth peer name veth1b

ip link set veth1a netns ns1

ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns1 ip link set veth1a up
ip addr add 10.244.1.3/24 dev veth1b
ip link set veth1b up

ip netns exec ns1 route add default gw 10.244.1.3
ip route add 10.244.2.0/24 via 10.211.55.123

echo 1 > /proc/sys/net/ipv4/ip_forward

在这里插入图片描述

route -n
ip netns exec ns2 route -n

2.2、第2步:在slave上执行下面的命令

ip netns add ns2

ip link add veth2a type veth peer name veth2b

ip link set veth2a netns ns2

ip netns exec ns2 ip addr add 10.244.2.2/24 dev veth2a
ip netns exec ns2 ip link set veth2a up
ip addr add 10.244.2.3/24 dev veth2b
ip link set veth2b up

ip netns exec ns2 route add default gw 10.244.2.3
ip route add 10.244.1.0/24 via 10.211.55.122

echo 1 > /proc/sys/net/ipv4/ip_forward

在这里插入图片描述

route -n
ip netns exec ns2 route -n

3、跨主机通信测试

登录到master节点上,进行跨主机通信测试

测试两种协议,ICMP协议和HTTP协议。

3.1、测试案例1:在master节点上跨主机ping slave节点上ns2里的veth2a网卡

针对ICMP协议,进行测试。

ip netns exec ns1 ping 10.244.2.2

在这里插入图片描述

3.2、测试案例2:在master节点上跨主机远程访问slave节点上ns2里的http-web服务

针对HTTP协议,进行测试。

3.2.1、http-web服务代码

提供一个http-web服务,代码如下

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

type Stu struct {
	Age int
	Msg string
}

const ip = "10.244.2.2"

func sayHello(w http.ResponseWriter, r *http.Request) {
	stu := Stu{Age: 12, Msg: "hello world! this is Veth pair Test!"}
	stuJson, e := json.Marshal(&stu)
	if e != nil {
		panic(e)
	}

	w.Write(stuJson)

	fmt.Printf("Reply MSG:%v\tlen(Msg):%d\n", string(stuJson), len(stuJson))
}

func main() {
	http.HandleFunc("/", sayHello)
	fmt.Printf(fmt.Sprintf("App URL: http://%s:%d\n", ip, 9090))

	err := http.ListenAndServe(fmt.Sprintf("%s:%d", ip, 9090), nil)
	if err != nil {
		fmt.Printf("http server failed, err:%v\n", err)
		return
	}
}

在这里插入图片描述

本地编译,上传到slave服务器上

build:
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o http-web main.go

scp:
	scp http-web root@10.211.55.123:/root

all:
	make build && make scp

在本地执行

make all

即可。

3.2.2、namespace 隔离说明(为什么在ns2命名空间里可以访问本地宿主机的文件)

说明一点:

namespace仅仅是对网络资源的隔离,

namespace隔离的网络跟宿主机的网络是互不影响的。

但是,在namespace里是可以访问本地的宿主机的。

如下:

在这里插入图片描述

3.2.3、在slave节点上,ns2命名空间里启动http-web服务

ip netns exec ns2 ./http-web 

在这里插入图片描述

3.2.4、在master节点上,ns1去测试ns2里的http-web服务

ip netns exec ns1 ip a s

ip netns exec ns1 curl 10.244.2.2:9090

在这里插入图片描述

4、原理介绍

4.1、测试用例中可以实现跨主机通信的原理?

观察网络拓扑创建命令,似乎跟以前差不多。

只是新增了一条路由而已,如下:

ip route add 10.244.2.0/24 via 10.211.55.123

就可以实现跨主机通信了。

主要原因是:

  • 将每个节点作为路由器来使用了。
    • 如,将master节点,slave节点分别作为路由器来使用。
  • 既然是将节点作为路由器来使用,那么,当节点如master节点收到数据包后,对数据包进行一层一层的解析,依次获取目的MAC地址,发现MAC地址是自己的MAC地址,继续获取目的IP地址,
  • 查询本地的路由表,判断是否有去往目的地址的路由
    • 如果有,就将此数据包转发到此路由上
    • 如果没有,就采取其他策略,如丢弃。
  • 当然,存在目标路由的话,还不行,还要查看iptables规则,查看FORWARD是否允许转发。

4.2、如何将一个linxu服务器作为路由器使用呢?

配置如下命令即可

echo 1 > /proc/sys/net/ipv4/ip_forward

准确的说:

配置完成后,服务器就具备了路由器的路由转发功能了。

4.3、具体如何使用呢?

4.3.1、将Linux服务器作为路由器的注意点

为了更好的理解,将Linux服务器作为路由器来使用,

可以先将原来的网络拓扑图转换为下面的形式,

在这里插入图片描述

假设master节点上的10.244.1.0/24网段的数据包的目的地址是10.244.2.0/24

slave节点上的10.244.2.0/24网段的数据包的目的地址是10.244.1.0/24

那么,
对于10.244.1.0/24网段的下一跳的地址,并不是本主机的对外的地址,

而是目的IP所在宿主机的对外物理地址,即10.211.55.123

同理,10.244.2.0/24的下一跳的地址是10.211.55.122

因此,将Linux服务器作为路由器有一个暗含要求:
节点必须在同一个网段呢。

4.3.2、具体设置路由

在master节点上,假设10.244.1.0/24网段的数据包的目的地址是10.244.2.0/24
那么,需要在master节点上,添加的路由是

ip route add 10.244.2.0/24 via 10.211.55.123

在这里插入图片描述

在slave节点上,假设10.244.2.0/24网段的数据包的目的地址是10.244.1.0/24
那么,需要在slavae节点上,添加的路由是

ip route add 10.244.1.0/24 via 10.211.55.122

5、传输过程,数据包的报文内容变化

5.1、在master节点上,抓取veth1b网卡的数据包

tcpdump -nn -i veth1b -w icmp-veth1b.pcap

在这里插入图片描述

5.2、在master节点上,抓取eth0网卡的数据包

tcpdump -nn icmp -i eth0 -w icmp-eth0.pcap

在这里插入图片描述

5.3、根据抓包情况,分析一下报文

在这里插入图片描述

直接路由转发数据包的方式,性能比较高。

不像vxlan模式没有经过额外的封包,解封包过程。

6、整个传输过程,经历过哪些iptables规则链

为了验证测试,分别在master节点、slave上添加日志埋点;

此过程,需要使用到rsyslog服务

6.1、在master节点上安装rsyslog服务

yum -y install rsyslog

6.1.1、更新配置文件

echo "kern.*     /var/log/iptables.log" >> /etc/rsyslog.conf 

在这里插入图片描述

.*,表示所有等级的消息都添加到iptables.log文件里

信息等级的指定方式

  • .XXX,表示 大于XXX级别的信息
  • .=XXX,表示等于XXX级别的信息
    • 如,kern.=notice /var/log/iptables.log, 将notice以上的信息添加到iptables.log里
  • .!XXX, 表示在XXX之外的等级信息

6.1.2、重启rsyslog服务

systemctl restart rsyslog

systemctl status  rsyslog

在这里插入图片描述

6.2、在slave节点上安装rsyslog服务

可完全参考master节点安装过程

6.3、添加针对icmp协议的DNAT规则

如果测试的是tcp服务的协议的话,添加日志埋点时,可能存在测试不足的情况。

因为tcp协议,除了我们自己测试在用外,其他服务也可能在用tcp服务等等吧。

因此,这里使用icmp协议来测试。

(因为测试环境只有我们在用icmp协议,可以唯一确定,然后将规则链的匹配条件设置到最大)

6.4、添加日志埋点

6.4.1、在master节点上,添加日志埋点

将当前的日志统计清零

iptables -t nat -Z
iptables -t filter -Z

插入日志埋点前,先查看一下,当前的现状

iptables -t nat -nvL PREROUTING --line-number
iptables -t filter -nvL FORWARD --line-number
iptables -t nat -nvL POSTROUTING --line-number

插入日志埋点

iptables -t nat -I PREROUTING -p icmp -j LOG --log-prefix "Nat-PREROUTING-1-"
iptables -t filter -A FORWARD -p icmp -j LOG --log-prefix "Filter-FORWARD-1-"
iptables -t nat -I POSTROUTING -p icmp -j LOG --log-prefix "Nat-POSTROUTING-1-"

在这里插入图片描述

实时查看日志

tail -f /var/log/iptables.log

6.4.2、在slave节点上,添加日志埋点

将当前的日志统计清零

iptables -t nat -Z
iptables -t filter -Z

插入日志埋点前,先查看一下,当前的现状

iptables -t nat -nvL PREROUTING --line-number
iptables -t filter -nvL FORWARD --line-number
iptables -t nat -nvL POSTROUTING --line-number

插入日志埋点

iptables -t nat -I PREROUTING -p icmp -j LOG --log-prefix "Nat-PREROUTING-1-"
iptables -t filter -A FORWARD -p icmp -j LOG --log-prefix "Filter-FORWARD-1-"
iptables -t nat -I POSTROUTING -p icmp -j LOG --log-prefix "Nat-POSTROUTING-1-"

slave节点上的日志埋点跟master节点是一样的

6.5、第1次请求时,经过的iptables规则链

在这里插入图片描述

6.6、第1次反馈时,经过的iptables规则链

在这里插入图片描述

反馈时,只经过了FORWARD链。

6.7、第2次以及以后的请求、反馈时,经过的iptables规则链

在这里插入图片描述

请求、反馈时,只经过了FORWARD链。

7、总结

本机主要是利用了Linux服务器可以作为路由器转发功能,这一特点

实现了不同宿主机上不同命名空间的跨主机通信

这种方式,性能比较高。

当然,要求是必须是宿主机在同一个网段。

如果,你已经理解了本文的测试方案,那么,

恭喜你了!

flannel中的Host-gw模式的核心,你已经掌握了。

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

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

相关文章

ROS系列:第六章 机器人建模

文章目录六、机器人系统仿真1.概述仿真优势:仿真缺陷:2. URDF集成Rviz基本流程1.创建功能包,导入依赖2.编写 URDF 文件3.在 launch 文件中集成 URDF 与 Rviz4.在 Rviz 中显示机器人模型5.优化 rviz 启动3. URDF语法详解3.1 URDF语法详解01_robotrobot1.属性2.子标签…

Promethus实操部署ARM架构 麒麟系统

由于有个地市局的等保测评要求安装监控软件,实操安装普罗米修斯和Zabbix,原本想安装Zabbix在本地安装非常顺利,但是服务器是华为鹏鲲的、ARM架构,Zabbix的有些东西找不到ARM的,所以两个都尝试了下。本篇讲解下Promethu…

协同过滤推荐算法

协同过滤:利用集体智慧,借鉴相关人群的观点进行推荐。 过去兴趣相似的用户在未来的兴趣也会相似;相似的用户会产生相似的历史行为数据。 根据历史行为,产生相似用户,分析出推荐结果。 用一句大白话说,其实也…

Android请求应用权限

文章目录前言参考一、请求应用权限基本原则二、请求权限的流程(官网摘抄)三、请求权限编码1.允许系统管理权限请求代码2.自行管理权限请求代码总结前言 学习Android为什么需要动态申请危险权限 学会Android应用危险权限申请的方式 参考 Android官方文档…

8 种 Python 定时任务的解决方案

在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond 结合命令行实现,另外一种方式是直接使用Python。 最近我整理了一下 Python 定时任务的实现方式,内容较长,建议收藏后学习&a…

uni-app云开发(我直接访问后端)

uniCloud 是 DCloud 联合阿里云、腾讯云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。 熟悉的js的程序员,轻松搞定前后台整体业务。实现了前端完成前后端工作的可能 用法: 第一步新建uniCloud项目 点击文件 ——>新建—…

Hue编译安装使用

简介 由于大数据框架很多,为了解决某个问题,一般来说会用到多个框架,但是每个框架又都有自己的web UI监控界面,对应着不同的端口号。比如HDFS(9870)、YARN(8088)、MapReduce(19888)等。这个时候有一个统一的web UI界面去管理各个大…

高斯混合模型下的变分推断

大概从下面几个部分学习: 1.EM算法 人人都懂EM算法 - 知乎 (zhihu.com) 18分钟理解EM算法 - 知乎 (zhihu.com) 变分贝叶斯深度学习综述 - 知乎 (zhihu.com) 【未看完】 EM算法存在的意义是什么? - 知乎 (zhihu.com)【八种境界】 EM 算法具备收敛性…

java计算机毕业设计ssm体育赛事管理系统App2qrcr(附源码、数据库)

java计算机毕业设计ssm体育赛事管理系统App2qrcr(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#x…

[附源码]Python计算机毕业设计Django酒店物联网平台系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

小目标检测文章阅读

无人机上目标检测的特点: 1、图像特点 在多数情况下,无人机的拍摄视野很大,包含丰富的视觉内容,虽然它提供了更全面的场景信息。 缺点: 1)但是待检测的目标对象通常在图像中占比较小,且没有足…

法国巴黎索邦大学博士后—实验物理学

【国外博士后招聘-法国博士后】法国巴黎索邦大学博士后—实验物理学 索邦大学(法文:Sorbonne Universit;英文:Sorbonne University)简称“索邦”(Sorbonne),是一所位于法国巴黎拉丁区…

多线程环境下的单例模式

✨✨hello,愿意点进来的小伙伴们,你们好呐! 🐻🐻系列专栏:【JavaEE初阶】 🐲🐲本篇内容:基于多线程的单例模式 🐯🐯作者简介:一名现大二的三非编程…

Linux虚拟化网络之路由配置

一、Linux路由配置 如果要在不同网段直接通讯,需要添加路由,Linux添加路由命令如下: route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If] add : 添加一条路由规则;del : 删除一条路由规则;-net …

Win11如何开启移动中心页面的操作方法教学

Win11如何开启移动中心页面的操作方法教学分享。有用户不知道怎么去打开移动中心,开启这个页面我们可以去进行屏幕亮度调整、声音调整、笔记本电池状态、外接显示器/投影仪、以及幻灯片显示模式等功能集中到一个面板上进行管理设置。如何开启这个页面,来…

【教程】超详细通过Shizuku转生支付宝集成XQ_Crystal来自动收能量

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.blog.csdn.net] 通过Shizuku是比应用转生更好更稳定的方法! 可以先看这篇:免Root使用Xposed插件并开启蚂蚁森林自动偷能量,比应用转生好 还不会的,继续往下。看完还不会&#xff…

手机银行APP评测系列:天津银行持续优化手机银行用户体验,但仍需加强细节提升

易观分析:作为银行金融服务线上场景渗透的有效抓手,当前手机银行APP已经成为其触达用户的重要渠道。随着银行发力场景服务平台成为发展趋势,5G技术问世对金融服务场景端提出新要求,用户体验反馈成为银行线上场景化运营的重要一环。…

JavaScript—分支结构和循环结构整理

目录 一、流程控制 二、分支结构 1. if语句 2. if…else语句 3. if…else if语句 4. switch语句 5. 条件表达式构成的选择结构 三、循环结构 1.while循环 2. do-while循环 3. for循环 3.1 for循环转换为while循环 3.2 断点调试 4. 循环嵌套 JavaScript 是一种解释…

微服务框架 SpringCloud微服务架构 16 SpringAMQP 16.6 FanoutExchange

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构16 SpringAMQP16.6 FanoutExchange16.6.1 发布订阅 - Fanout Exchange16.6…

火山引擎DataTester:一个爆款游戏产品,是如何用A/B测试打磨出来的?

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 随着国内游戏用户数量趋于饱和,中国游戏产业也从高速成长期逐渐转型,市场成熟度提升,竞争趋于精细化。 随着游戏出海以及私域流…