Kubernets(k8s) 网络原理二:Pod访问外网

上一篇文章中,我们介绍了pod与宿主机通信,并且通过network namespace模拟了通信过程。回顾整个流程,无非就涉及到两个东西,通信设备和路由规则。

本文要讲的,也离不开这两个东西,只不过需要对容器IP进行额外处理。

pod访问外网

在展开讲述之前,先明确一个问题,外网的范围是什么?

这个外网范围可大可小,可能是同一个局域网的另外一台主机,也可能是局域网外的一台网路设备或主机。

讲到这里,可能会混淆,是不是扯到了集群容器间通信,毕竟集群的容器也是分散在不同主机上的。

因此为了避免混淆,我们这里先对这些主机做两个约定

  1. 两个主机间可以通过物理网络通信。
  2. 仅能修改源主机配置

试想,当我们访问百度时,你肯定只是配置自己的主机,你会去配置百度的网关吗?

好,基于两个约定,展开本文要讨论的话题。

同样,我们还是先建模,网络拓扑图如下:

注:这里用network泛指中间的网路设备

如上图,host A和host B可以通过物理网络连接,并且为host A和host B分配了IP 196.128.1.2和196.128.2.2,并且通过CIDR地址可以看到,他们分别归宿与两个不同的网段。

同时当主机A和主机B通信时,host A先将报文将给默认网关196.128.1.1,默认网关将报文转发至network,最终该报文会被交给196.128.2.1,即host B的默认网关,然后转交给host B。

试想一下,如果主机A上有一个pod-1,其IP为10.10.1.2/24,它的报文可以发送给主机B吗?

当然可以!!!因为pod-1发送的报文的目标IP是host B的IP,这个IP是可以在network中路由的。

那为什么我们说他们之间不能通信呢?

那是因为pod-1能发送报文,但是却收不到响应报文。

那这个响应报文被谁丢了呢?

如果回答是host B的网关,那证明你的基础网络知识还是比较过关,没错这里就是被host B的默认网关把报文丢了。

我们来看看这个过程发生了什么

  1. pod-1发起IP报文,源IP为10.10.1.2,目标IP为196.128.2.2
  2. host A具备转发功能,将报文转发给自己的默认网关196.128.1.1
  3. host A默认网关将报文转发至network
  4. network最终将报文交付给196.128.2.1,即host B的默认网关
  5. host B默认网关将报文转交给host B
  6. host B协议栈处理完报文准备响应
  7. host B将IP调换,发送响应报文,此时,源IP为196.128.2.2,目标IP为10.10.1.2
  8. host B上无10.10.1.2的直接路由,于是将报文交给它的默认网关
  9. host B默认网关收到报文,查找路由信息,发现无任何匹配,丢弃该报文。

最终pod-1无法收到响应报文。

因此在整个过程中,无法发送响应报文的核心的问题是:

host B的网关以及整个network中的网络设备都不认识10.10.1.2

讲到这里,可能你已经想到办法了。

既然不认识,我们让它认识不就完了吗?

确实可以这样做,但是却存在以下两个问题

  • 你需要配置整个网络中参与路由的所有设备
  • 10.10.1.2是我们虚拟的ip,它在我们虚拟的子网10.10.1.0/24这个域内不会产生冲突,但是保不齐其他域中也存在10.10.1.2这个IP。

因为存在这个问题,所以这个方案非常复杂并且几乎不可能实现。

既然中间网络设备不让修改,那我们就只能从IP入手了.

值得庆幸的是,pod-1所在的host A的IP在整个网络中是可以路由的。

即上面流程中第8条,如果host B收到的报文的目标IP是host  A的IP不就可以了吗?

那要如何修改IP呢?答案就是NAT

NAT

顾名思义,NAT就是网络地址转换,简单理解就是一种将私网地址转成公网地址的技术。

关于NAT技术的详情,不在这篇文章的讨论范围,感兴趣的可以自行查阅

既然有了NAT,我们将刚在的网络图改造以下,可以得到:

有了上一篇文章的基础,这张图看起来应该没有压力。

整个传输过程如下:

  1. host A中pod协议栈发起报文,源IP为10.10.1.2,目的IP为196.128.2.2
  2. 报文通过veth pair到达主机协议栈
  3. host A协议栈iptables中存在规则:源地址为10.10.1.2/24的报文需要做nat
  4. host A协议栈将原始报文的源IP替换为主机的IP地址,并记录该报文被snat过
  5. host A将报文从默认网关发出(图中已忽略)
  6. 报文经过网络传输,到达host B的默认网关(图中已忽略)
  7. host B的默认网关将报文转交给host B
  8. host B协议栈处理报文
  9. host B协议栈处理报文完毕将响应报文发送给默认网关
  10. host B默认网关根据规则将报文传输给下一跳
  11. 响应报文通过网络到达host A
  12. host A协议栈发现该报文应该做dnat(过程4中存有记录)
  13. host A将目标IP还原为10.10.1.2,并转发给veth 1
  14. host A中pod协议栈收到响应报文。

其它的流程都很熟悉,我们重点看看第3,4,12。

先看4和12,这里有snat和dnat,即将源地址转换和目标地址转换(上图IP首部)。至于内核转换细节,这里不讨论。

我们再看第3条,iptable规则,是一条什么样的规则完成了这个转换呢?

要回答这个问题,必须要了解iptable的工作原理,因为在后续的文章中,例如分析K8S service时我们会用到这个iptable,所以这里也不展开详细的讲述。

我们通过一个小实验来看看是不是和我们说的一样

实验

在这个实验中,我们仍然以network  namespace代指pod

因为实验环境的主机IP已经配置了,所以下面实验中的IP可能会和上图中分配的IP对不上,不过不影响我们做整个实验

在实验中,我们用192.167.11.126代指上图中host A,用192.167.11.127代指上图中host B

首先我们在host A中创建一个network namespace,并完成相关配置工作,因为这部分在第一篇文章中已经有讲述,所以这里就不展开讲每一条命令的作用

# ip netns add pod-1# ip link add eth0 type veth peer name veth1# ip link set eth0 netns pod-1# ip netns exec pod-1 ip addr add 10.10.1.10 dev eth0# ip netns exec pod-1 ip link set dev eth0 up# ip netns exec pod-1 ip route add 169.254.1.1 dev eth0# ip netns exec pod-1 ip route add default via 169.254.1.1 dev eth0# ip link set dev veth1 up # echo 1 > /proc/sys/net/ipv4/conf/veth1/proxy_arp# echo 1 > /proc/sys/net/ipv4/ip_forward

此时我们尝试在pod-1中ping host B

# ip netns exec pod-1 ping -c 1 192.168.11.127
PING 192.168.11.127 (192.168.11.127) 56(84) bytes of data.--- 192.168.11.127 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

不出意外,ping 不通。

我们在host B上抓包看看。

# tcpdump -n -i ens33 -p icmp
05:46:42.231478 IP 10.10.1.10 > 192.168.11.127: ICMP echo request, id 37196, seq 1, length 64
05:46:42.231505 IP 192.168.11.127 > 10.10.1.10: ICMP echo reply, id 37196, seq 1, length 64

可以看到host B是正确响应了报文的,和我们刚才的分析一致

此时,我们在主机上添加iptables规则

 # iptables -A POSTROUTING -t nat -s 10.10.1.0/24  -j MASQUERADE

这个规则的意思是所有来自10.10.1.0/24这个网段的IP做一次snat

配置好规则之后,这时候就可以ping通了,我们再次尝试在host B抓包

# tcpdump -n -i ens33 -p icmp
07:08:51.945389 IP 192.168.11.126 > 192.168.11.127: ICMP echo request, id 59199, seq 1, length 64
07:08:51.945405 IP 192.168.11.127 > 192.168.11.126: ICMP echo reply, id 59199, seq 1, length 64

和刚才抓包的结果对比,你会发现,源IP不再是容器IP,而是host A的IP

如果你的宿主机能访问百度,你这时候在pod-1内访问百度,也是可以的

# ip netns exec pod-1 ping -c 1 www.baidu.com
PING www.a.shifen.com (183.2.172.185) 56(84) bytes of data.
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=1 ttl=127 time=36.2 ms--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 36.291/36.291/36.291/0.000 ms

总结

本文介绍了宿主内的容器,如何访问外网,严格来说,他不是容器组网的关键。因为它解决的不是两个容器相互通信,而是pod访问其他主机这个单点问题。

关于容器组网的内容,将在下一篇文章中分析。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习c语言第24天(练习)

编程题 第一题 最大公约数最小公倍数求和 //求最大公约数和最小公倍数之和 //暴力求解 //int main() //{ // int n 0; // int m 0; // while (scanf("%d %d", &n, &m)2) // { // int min n < m ? n : m; // int max n > m ? n : m; //…

Stable Diffusion 使用详解(7)---AI 摄影

目录 背景 底模的选择 例子 majicMix GirlFriendMix&#xff08; Lora&#xff09; 对比效果 LEOSAMs MoonFilm ADetailer 使用 说明 例子 问题 处理方式 效果 背景 魔法师使用魔法作的画有时候太过完美&#xff0c;以至于有点脱离真实摄影的感觉&#xff0c;我们…

【电控笔记z14z16】增加霍尔元件分辨率

霍尔传感器用的不多?实际增量编码器更好 z14 假设60度内速度不变 z16(更简单的方法)BLDC

【机器学习】BP神经网络正向计算

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 BP神经网络正向计算1. 引言2. BP神经网络结构回顾3. 正向计算的基本原理4. 数学…

7.3.1.算法设计与分析-总结及真题讲解

总结 分治法特征&#xff1a;把一个问题拆分成多个小规模的相同子问题&#xff0c;一般可用递归解决。 经典问题&#xff1a;斐波那契数列、归并排序、快速排序、矩阵乘法、二分搜索、大整数乘法、汉诺塔 回溯法特征&#xff1a;系统的搜索一个问题的所有解或任一解。 经典问题…

ctfhub文件上传

⽆验证 上传⼀句话⽊⻢&#xff0c;发现上传成功 1.php ⼀句话⽊⻢内容&#xff1a; <?php eval($_POST[cmd]);?> 上传⼀句话⽊⻢&#xff0c;发现上传成功 http://challenge-8b27d18368ecc25c.sandbox.ctfhub.com:10800/upload/1.ph p 前端验证 开启题⽬ 上传⼀个…

[Modbus] Modbus协议开发-基本概念(一)

历史 ModBus官网是Modicon&#xff08;Modicon早年已被施耐德收购&#xff09;公司为其PLC通讯而开发的一种通讯协议。 概述 通过Modbus协议&#xff0c;控制器之间、或控制器经由网络&#xff08;如以太网&#xff09;可以和其它设备之间进行通信。 优点 免费、好用、成熟…

DIRB:一款强大的Web目录扫描工具使用指南

网安学习交流 DIRB是一款广泛使用的开源Web内容扫描工具&#xff0c;它专注于发现Web服务器上存在的目录和文件。对于安全研究员、渗透测试人员以及Web开发者来说&#xff0c;DIRB是一个不可或缺的工具&#xff0c;它能帮助他们识别潜在的入口点&#xff0c;从而进一步评估目标…

Java学习Day20

Vue学习 nodejs的安装与环境配置 1.直接去官网下载合适版本的nodejs( https://nodejs.org/zh-cn/download/prebuilt-installer) 2.解压下载的安装包&#xff0c;将文件路径配置到系统变量的path中&#xff0c;然后确认后退出。可以使用终端来查看安装的nodejs版本。使用winR…

【C++ Primer Plus】学习笔记 4

文章目录 前言一、结构类型1.在程序中使用结构2.C11结构初始化3. 结构可以将 string 类作为成员吗4.其他特性5.结构数组 二、共用体三、枚举1.设置枚举量的值2. 枚举的取值范围 前言 该笔记内容为书第四章——复合类型&#xff0c;加油加油 一、结构类型 结构是用户定义的类型…

文件:ls,ll,fcpgets,cpwr

1、fcpgets fgets和fputs用于处理文本文件&#xff0c;而不是二进制文件&#xff0c;因为会进行换行符的处理&#xff0c;图片文件包含二进制数据并且包含\0字符&#xff0c;会出现意外终止条件。 2、cprw fread&#xff1a;函数从文件流中读取数据&#xff0c;储存到指向空间…

【Android Studio】gradle文件、配置、版本下载、国内源(SDK版本、gradle版本以及gradle-plugin(AGP)版本)

文章目录 AS查看gradle-plugin版本及gradle版本&#xff08;图形&#xff09;查看gradle-plugin版本及gradle版本&#xff08;配置文件&#xff09;配置文件分析解决gradle下载失败、版本错乱等问题。 Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的自动化构建工具&…

Linux:多线程(二.理解pthread_t、线程互斥与同步、基于阻塞队列的生产消费模型)

上次讲解了多线程第一部分&#xff1a;Linux&#xff1a;多线程&#xff08;一.Linux线程概念、线程控制——创建、等待、退出、分离&#xff0c;封装一下线程&#xff09; 文章目录 1.理解Linux下线程——理解tid2. Linux线程互斥2.1相关概念2.2引入问题分析问题解决思路 2.3L…

牛客网每日刷题之 HJ99.自守数(C++)

在不断学习的过程中也不能忘记了基础知识的巩固&#xff0c;在学习新的知识后要学会去举一反三&#xff0c;前不久我刚刚了解了一些关于 string 类的知识&#xff0c;对牛客网的 自守数 有了新的解题思路&#xff0c;让我们一起看看这道题吧 思路解析 a. 整数方法 1. 首先我们知…

盘点5个PDF 怎么转换成 Word 的实用技巧

在日常的办公和学习中&#xff0c;要将 PDF 文件转换成 Word 是很常有的事。方便我们编辑、修改内容或者是提取其中的内容。一般都会用到一些工具&#xff1b;下面&#xff0c;我将为大家介绍5种高效且实用的 PDF 转 Word 的方法。 1、PDF365转换软件 直通车&#xff1a;www.…

模块化叙事的演变:DeFi借贷开发的模块化转型

随着区块链技术的不断发展&#xff0c;去中心化金融&#xff08;DeFi&#xff09;正经历一场深刻的变革。模块化借贷作为这一变革的重要部分&#xff0c;正逐渐成为加密金融领域的焦点。本文将探讨模块化借贷的起源、演变及其未来发展方向。 一、模块化的起源 模块化区块链的概…

nodejs/node-sass/sass-loader三者版本对应关系(已解决)

基本前提&#xff1a;了解版本对应关系 示例&#xff1a; 我的nodejs&#xff1a;v14.21.3&#xff0c; 则package.json: "node-sass": "^4.14.1", "sass-loader": "^8.0.0",扩展&#xff1a; 查看node历史版本&#xff1a; Node.js…

CVE-2017-15715~Apache解析漏洞【春秋云境靶场渗透】

Apache解析漏洞 漏洞原理 # Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。比如如下配置文件&#xff1a; AddType text/html .html AddLanguage zh-CN .cn# 其给 .html 后缀增加了 media-type &#xff0c;值为 text/html &#xff1b;给 …

【C++进阶学习】第十二弹——C++ 异常处理:深入解析与实践应用

前言&#xff1a; 在C编程语言中&#xff0c;异常处理是一种重要的机制&#xff0c;它允许程序员在运行时捕获和处理错误或异常情况。本文将详细介绍C异常处理的相关知识点&#xff0c;包括异常的定义、抛出与捕获、异常处理的原则、以及在实际编程中的应用。 目录 1. 异常处理…

【目标检测实验系列】YOLOv5高效涨点:基于NAMAttention规范化注意力模块,调整权重因子关注有效特征(文内附源码)

1. 文章主要内容 本篇博客主要涉及规范化注意力机制&#xff0c;融合到YOLOv5(v6.1版本&#xff0c;去掉了Focus模块)模型中&#xff0c;通过惩罚机制&#xff0c;调整特征权重因子&#xff0c;使模型更加关注有效特征&#xff0c;助力模型涨点。 2. 简要概括 论文地址&#x…