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

news2025/2/24 10:36:59

《零入门kubernetes网络实战》视频专栏地址
https://www.ixigua.com/7193641905282875942

本篇文章视频地址(稍后上传)


本篇文章继续提供测试案例:
基于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服务器作为路由器的注意点

在这里插入图片描述

对比下,下面的图,可能更熟悉
在这里插入图片描述

假设将整个master节点作为一个私有网络,该私有网络的网段是10.244.1.0/24;

eth0作为该私有网络的网关。

slave节点同样的道理;

那么,该私有网络的数据包要访问slave节点的私有网络时,master节点的私有网络的数据包得通过本节点的

网关eth0进行发送,下一条地址就是slave节点的私有网络的网关,即10.211.55.123

同样的道理,slave节点的私有网络要想访问master节点的私有网络的原理是一样的。

也就是说,服务节点master有点类似于路由器的功能,实现了数据包的跨网络的路由转发的能力。

因此,将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模式的核心,你已经掌握了。


点击 下面 返回 专栏目录

<<零入门kubernetes网络实战>>技术专栏之文章目录

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

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

相关文章

【第二章】(1)了解系统内核和 Shell 终端的关系与作用

&#x1f427;2.1强大好用的Shell&#x1f9ca;1.什么是Shell&#xff1f;&#x1f9ca;2.Bash解释器的优势&#x1f427;2.2 执行命令的必备知识&#x1f9ca;1.Linux命令的格式&#x1f9ca;2.四个快捷键/组合键小技巧&#x1f9ca;1.什么是Shell&#xff1f; ​ 一台…

shell脚本的编写以及shell中语句(嵌入式学习)

shell学习shell脚本编写步骤shell变量功能性语句1.read2.expr3.let4.test逻辑运算符的书写格式结构性语句1.if…then…fi2、case...esac3、for..do..done4、while..do..doneshell脚本 将shell命令按照一定的逻辑顺序实现指定功能&#xff0c;放到一个文件中。文件叫脚本文件&a…

几个Base64编码工具,也有蹊跷

起因 需求&#xff1a;对一段内容进行base64加密&#xff0c;然后通过url的get请求进行发送到后台&#xff0c;由于加密的内容比较少&#xff0c;base64串也不是很长&#xff0c;我认为此方案可行。 于是找了三个base64编码的在线工具&#xff0c;分别是&#xff1a; 平台1&…

设计模式第六讲:责任链模式和迭代器模式详解

一. 责任链模式 1. 背景 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象的处理条件或权限不同。例如&#xff0c;公司员工请假&#xff0c;可批假的领导有部门负责人、副总经理、总经理等&#xff0c;但每个领导…

【Java基础】020 -- 常见API

目录 一、游戏打包exe 二、Math 1、Math类的常用方法 ①、代码实现 2、小结 3、练习 ①、练习一&#xff1a;改进判断一个数是否为一个质数 ②、练习二&#xff1a;自幂数 三、System 1、时间原点 2、常用方法 3、课堂练习 4、注意事项 5、小结 四、Runtime 1、常用方法 2、练习…

微服务项目【商品秒杀接口压测及优化】

生成测试用户 将UserUtils工具类导入到zmall-user模块中&#xff0c;运行生成测试用户信息&#xff0c;可根据自身电脑情况来生成用户数量。 UserUtils&#xff1a; package com.xujie.zmall.utils;import com.alibaba.nacos.common.utils.MD5Utils; import com.fasterxml.j…

【黄啊码】我问ChatGPT如何学习PHP语言,它是这么说的

大家好&#xff0c;我是黄啊码&#xff0c;最近大家都在流行整chatGPT&#xff0c;今天它来了&#xff01;别人都在吹嘘它万能&#xff0c;能够代替程序员写代码&#xff0c;今天我们就让它教教我们学习PHP语言&#xff1a; 黄啊码&#xff1a; 如何有效学习php语言&#xff1…

关于剩余电流动作继电器在配电系统中的应用探讨

摘 要&#xff1a;据了解&#xff0c;我国每年剩余电流动作继电器&#xff08;RCD&#xff09;的使用量超过2.7亿台&#xff0c;属于CCC认证产品&#xff0c;广泛应用于住宅、办公、商业、酒店、学校等民用建筑和数据中心及工业场所。 现在剩余电流动作继电器依据的标准是GB/T…

vue项目如何使用 SheetJS(xlsx)插件?

简言 SheetJS是一款非常好用的前端处理表格文件的工具。它分社区版和专业版&#xff0c;我们今天来介绍如何简单使用它的社区版。 SheetJS社区版官网 介绍 你应该打开官网浏览具体使用详情。 安装 打开官网在如上图的Installation板块中可以找到各种运行模块的使用方式。 …

MongoDB 覆盖索引查询

MongoDB 覆盖索引查询 官方的MongoDB的文档中对覆盖查询做了说明&#xff1a; 所有的查询字段是索引的一部分所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分&#xff0c; MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询…

【半监督医学图像分割 2023 CVPR】UCMT 论文翻译

文章目录【半监督医学图像分割 2023 CVPR】UCMT 论文翻译摘要1. 介绍2. 相关工作2.1 半监督学习2.2 半监督分割2.3 不确定性引导的半监督语义分割3. 方法3.1 问题的定义3.2 总览3.3 协作式均值教师3.4 不确定性指导混合4. 实验和结论5. 总结【半监督医学图像分割 2023 CVPR】UC…

webpack(4版本)使用

webpack简介&#xff1a;webpack 是一种前端资源构建工具&#xff0c;一个静态模块打包器(module bundler)。在 webpack 看来, 前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理。它将根据模块的依赖关系进行静态分析&#xff0c;打包生成对应的静态资源(bundle)…

sentinel持久化方案

一.sentinel规则推送原理 1.原有内存规则存储原理 (1)dashborad中请求到服务器后&#xff0c;在controller中通过http把规则直接推送给client&#xff0c;client接收后把规则放入内存&#xff1b; 2.持久化推送规则原理 ![在这里插入代码片](https://img-blog.csdnimg.cn/1…

质量保障体系建设演进案例

在业务早期发展阶段&#xff0c;主要是产品驱动、研发和测试互相配合。不同的测试方法是验证和保障交付质量的手段&#xff0c;而不是构建质量体系的基石。测试的努力带来的更多是一些“安全感”&#xff0c;而非安全保障。因此&#xff0c;要做到高质量的交付&#xff0c;就需…

k8s简单搭建

前言 最近学习k8s&#xff0c;跟着网上各种教程搭建了简单的版本&#xff0c;一个master节点&#xff0c;两个node节点&#xff0c;这里记录下防止以后忘记。 具体步骤 准备环境 用Oracle VM VirtualBox虚拟机软件安装3台虚拟机&#xff0c;一台master节点&#xff0c;两台…

Wails简介

https://wails.io/zh-Hans/docs/introduction 简介 Wails 是一个可让您使用 Go 和 Web 技术编写桌面应用的项目。 将它看作为 Go 的快并且轻量的 Electron 替代品。 您可以使用 Go 的灵活性和强大功能&#xff0c;结合丰富的现代前端&#xff0c;轻松的构建应用程序。 功能…

mac上安装mysql

mac上安装mysql1. 关于Linux上安装mysql2. 下载安装2.1 下载2.2 安装3. 客户端连接mysql3.1 先查看mysql服务3.2 连接mysql客户端3.2.1 终端使用命令连接3.2.2 可视化工具连接3.3 其他简单操作&#xff08;启动服务等&#xff09;3.3.1 可视化界面操作4. 配置环境变量4.1 配置环…

视图、索引、存储过程、触发器

视图、索引、存储过程、触发器 group by补充&#xff1a; 规范来说&#xff0c;分组查询中&#xff0c;select后的字段只能是group by的字段或者是聚合函数。mysql在这有一个小优化&#xff0c;分组后如果某个字段的所有记录相同&#xff0c;同样可以select。 视图 视图是虚拟…

一文详解java.nio.ByteBuffer

java.nio.ByteBuffer是一个可以进行缓冲区分配、读取和写入的缓冲区&#xff0c;其持有一个字节数组&#xff0c;并通过4个属性&#xff1a;capacity、limit、position、mark来管理缓冲区&#xff0c;进行字节级别读取和数据写入。基于此&#xff0c;ByteBuffer常被用来处理网络…

MySql数据库约束

概述、目的 概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a;保证数据库中数据的正确性、有效性和完整性。 分类&#xff1a; 约束描述关键字非空约束限制该字段的数据不能为nullNOT NULL唯一约束保证该字段的所有数据都…