当前位置: 首页 > news >正文

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

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

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


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

1、网络拓扑如下

在这里插入图片描述

2、网络拓扑构建

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

ip netns add ns1ip link add veth1a type veth peer name veth1bip link set veth1a netns ns1ip 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 upip netns exec ns1 route add default gw 10.244.1.3
ip route add 10.244.2.0/24 via 10.211.55.123echo 1 > /proc/sys/net/ipv4/ip_forward

在这里插入图片描述

route -n
ip netns exec ns2 route -n

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

ip netns add ns2ip link add veth2a type veth peer name veth2bip link set veth2a netns ns2ip 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 upip netns exec ns2 route add default gw 10.244.2.3
ip route add 10.244.1.0/24 via 10.211.55.122echo 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 mainimport ("encoding/json""fmt""net/http"
)type Stu struct {Age intMsg 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.goscp:scp http-web root@10.211.55.123:/rootall: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 sip 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 rsyslogsystemctl 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.lryc.cn/news/7161.html

相关文章:

  • 【pytorch框架】对模型知识的基本了解
  • SUP桨板电动气泵方案——鼎盛合方案
  • 小白系列Vite-Vue3-TypeScript:011-登录界面搭建及动态路由配置
  • C语言( 缓冲区和重定向)
  • 编程思想、方法论和架构的类型及应用
  • 【OA办公】OA流程审批大揭秘,带你看遍所有基础流程
  • 《零基础入门数据结构与算法》专栏介绍
  • 测试开发之Django实战示例 第九章 扩展商店功能
  • 【Spring】一文带你吃透AOP面向切面编程技术(下篇)
  • 【java】Spring Boot --40 个 Spring Boot 常用注解(建议收藏)
  • 《游戏学习》| 微信对话模拟生成器源码分析
  • 剑指 Offer 10- I. 斐波那契数列[c语言]
  • 【C#基础】C# 数据类型总结
  • 再创荣誉 | Softing工业荣获CAIMRS 2023 数字化创新奖
  • Multi Paxos
  • Android - dimen适配
  • 深度学习网络模型——RepVGG网络详解
  • 仓库拣货标签应用案例
  • 介绍一款HCIA、HCIP、HCIE的刷题软件
  • 线程池整理汇总
  • 华为OD机试真题Python实现【最短木板长度】真题+解题思路+代码(20222023)
  • VMware安装CentOS7
  • 力扣24.两两交换链表中的节点
  • AtCoder Regular Contest 137 题解(A~C)
  • 【C语言】预处理指令
  • Java基础之多线程JUC全面学习笔记
  • 13.CSS文本样式
  • 西恩科技更新招股书:IPO前大手笔分红“套现”, 赵志安为实控人
  • 【CentOS】有关时间的设置
  • OpenCV制作Mask图像掩码