k8s网络通信原理

简介: k8s网络通信原理

要了解和分析Pod中的container容器网络,那么首先肯定是要了解docker容器网络的几种模式以及常见用法。之后我们再带着这个问题一步一步地去进行实操验证一下我们的推断是否正确。

1.docker容器网络模式

1.1 默认bridge桥接网络

默认分配docker0网桥网段上的ip给容器, 每个容器的network namespace都是相互隔离的。docker自身生成一个veth pair(虚拟网卡对) 一端放在docker0网桥上, 一端放在容器内部。

通过docker inspect 容器查看容器网络模式信息:

网络详情:

1.2 共享宿主机host的网络栈

容器的直接使用宿主机的网络栈 以及端口port范围。

通过docker inspect 容器查看容器网络模式信息:

1.3 container共享模式

可以指定容器,与另外某个已存在的容器共享它的网络栈。 这个和上面共享宿主机网络栈类似 ,不同点是这次共享的对象由宿主机转变成了某个容器而已。

K8S里面多个container共享一个pod的网络栈以及端口范围也是基于此模式实现的。 每当一个Pod被创建,那么首先创建一个 “pause” 容器, 之后这个pod里面的其他容器通过共享这个pause容器的网络栈,实现与外部pod进行通信 , 然后通过localhost进行pod内部的container的通信。如下图所示:

我们可以发现共享的这种模式, 相比bridge桥接模式有3个eth0网卡而言, 只有一个eth0网卡只出现在了"pause容器"里面,nginx和php-fpm复用了"pause容器"的network namespace,简单理解就是使用了"pause容器"的eth0网卡与外部进行通信。

通过docker inspect 容器查看容器网络模式信息:

如果NetworkMode是conatiner共享类型,则Networks字段为空。应该再去找到共享conatiner的详细信息才能查看。

1.4 none模式

此模式只会给容器分配隔离的network namespace, 不会分配网卡 ip地址等。默认假设我们没有手动配置网络信息, 那么这样网络模式下的容器不能上网。 那么该模式给我了我们配置容器网络的很大的发挥自由度, 也就意味着我们可以自己配置这个容器的 网卡信息 ip地址等。简单理解,docker给了你裸机容器,后面网卡veth 网卡信息 ip地址等等你可以自行分配。

网络详情:

docker netwokr ls // 显示当前docker存在的网络模式列表:

k8s网络插件也是基于此去做网络分配,插件负责分配ip地址 网卡等给"pause容器"即可,继续往下看会详细分析。

2.举例分析

2.1 验证一个Pod中多个conatiner是否共享这个Pod的ip以及端口范围

运行一个deployemnt, 这个deployment里面的Pod要运行3个容器:

  1. nginx
  2. busybox
  3. php-fpm

用这个例子类验证一下K8S容器之间通信以及使用的docker网络模式是否和我们上面预想的一致。

docker ps 看到这个pod运行了4个容器:

第一个: 8bf44ff2b133是Pod里面运行的php容器

第二个: 2e10bc93d413是这个Pod的nginx容器

第三个: ed2fc5bf201e 是这个Pod的busybox容器

第四个: 9bafb86e521c 是这个Pod的pause容器

我们分别进入这个3容器看看分配的内部eth0的ip地址:

php-fpm容器内部ip信息: 10.244.0.34

nginx容器内部ip信息: 10.244.0.34

busybox容器内部ip信息: 10.244.0.34

我们发现了3个容器内部的ip地址都是一样, 那现在来看看K8S Pod分配的ip是不是也是和上面3个容器内部的ip地址一样?

完全一致。这也证实了同一个Pod里面确实多个container共享这个Pod的ip地址。 其实可以再验证共享Pod的端口范围, 在这个Pod基础上再运行一个nginx容器会报错。 因为80端口已经被占用 , 再运行的第二个nginx默认还是监听80端口所以报错 ,可以自行尝试一下。

2.2 验证多个container是否是共享了pause容器的network namespace?

pause容器的id简写是: 9bafb86e521c

分别执行docker inspect -f ‘{{.HostConfig.NetworkMode}}’ 上面3个容器的(NetworkMode)这个字段可以看到当前这个容器的网络模式:

php容器docker inspect:

可以看到当前这个php容器的networkMode使用的是 "容器共享network namespace"的模式, 共享的是下面这个容器的network namepsace

container: 9bafb86e521c43d9cc33757ecef2d4ef8342c17cce032fabe0c9d7a543ac7960

nginx容器inspect:

container: 9bafb86e521c43d9cc33757ecef2d4ef8342c17cce032fabe0c9d7a543ac7960

busybox容器inspect:

container: 9bafb86e521c43d9cc33757ecef2d4ef8342c17cce032fabe0c9d7a543ac7960

由此可见 这3个container的都采用了"共享conatiner network namespace"的模式,来与外部通信。 并且这个被共享的容器就是Pod里面的pause容器。

2.3 在busybox容器中查看端口监情况

由此看出,busybox以及nginx php-fpm 3个容器通过localhost通信, 并且共享这个Pod的端口范围,其实也会是"pause容器"的ip和端口范围。(K8S中的Pod只是一个逻辑概念, 这个4个容器逻辑上组成了一个逻辑Pod,这一点要明确,底层还是一个个容器而已)。

2.4 查看pause容器的网络模式

那么我们现在来看看"pause容器"的docker inspect 详细信息:

我们发现当前这个puase使用的docker网络模式是:

none类型且模式的id是

9b9cd04e8d5742aaea058d8d72a450641058cbd71e13219c17564960b7b3c747

查看当前docker的网络模式列表:

docker  network  ls   
1

9b9cd04e8d57 这个网络模式是none类型。

两者一致。

3.总结

(本环境使用flannel网络插件).由此验证K8S网络插件负责管理ip地址分配以及veth pair(虚拟网卡对)以及网桥连接工作, pause容器采用了docker的none网络模式, 网络插件再将ip和veth虚拟网卡分配给Pod的pause容器, 其它的容器再采用"共享container"的网络模式来共享这个pause的网络即可与外部进行通信。

k8s只是提供了CNI接口,只要任何overlay网络分配解决方案或者具体实现,屏蔽了底层网络分配实现,只要去对接或者说实现了CNI接口规范,那么k8s就能使用该插件为k8s中的pod进行网络配置。市面上目前有常见的一些CNI插件例如Flannel, Calico等。


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5月前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
11月前
|
机器学习/深度学习 存储 算法
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
反向传播算法虽是深度学习基石,但面临内存消耗大和并行扩展受限的问题。近期,牛津大学等机构提出NoProp方法,通过扩散模型概念,将训练重塑为分层去噪任务,无需全局前向或反向传播。NoProp包含三种变体(DT、CT、FM),具备低内存占用与高效训练优势,在CIFAR-10等数据集上达到与传统方法相当的性能。其层间解耦特性支持分布式并行训练,为无梯度深度学习提供了新方向。
624 1
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
|
5月前
|
监控 负载均衡 安全
WebSocket网络编程深度实践:从协议原理到生产级应用
蒋星熠Jaxonic,技术宇宙中的星际旅人,以代码为舟、算法为帆,探索实时通信的无限可能。本文深入解析WebSocket协议原理、工程实践与架构设计,涵盖握手机制、心跳保活、集群部署、安全防护等核心内容,结合代码示例与架构图,助你构建稳定高效的实时应用,在二进制星河中谱写极客诗篇。
WebSocket网络编程深度实践:从协议原理到生产级应用
|
6月前
|
机器学习/深度学习 人工智能 算法
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
608 11
|
6月前
|
机器学习/深度学习 算法 搜索推荐
从零开始构建图注意力网络:GAT算法原理与数值实现详解
本文详细解析了图注意力网络(GAT)的算法原理和实现过程。GAT通过引入注意力机制解决了图卷积网络(GCN)中所有邻居节点贡献相等的局限性,让模型能够自动学习不同邻居的重要性权重。
1219 0
从零开始构建图注意力网络:GAT算法原理与数值实现详解
|
6月前
|
安全 测试技术 虚拟化
VMware-三种网络模式原理
本文介绍了虚拟机三种常见网络模式(桥接模式、NAT模式、仅主机模式)的工作原理与适用场景。桥接模式让虚拟机如同独立设备接入局域网;NAT模式共享主机IP,适合大多数WiFi环境;仅主机模式则构建封闭的内部网络,适用于测试环境。内容简明易懂,便于理解不同模式的优缺点与应用场景。
959 0
|
8月前
|
机器学习/深度学习 人工智能 PyTorch
零基础入门CNN:聚AI卷积神经网络核心原理与工业级实战指南
卷积神经网络(CNN)通过局部感知和权值共享两大特性,成为计算机视觉的核心技术。本文详解CNN的卷积操作、架构设计、超参数调优及感受野计算,结合代码示例展示其在图像分类、目标检测等领域的应用价值。
485 7
|
10月前
|
监控 应用服务中间件 Linux
掌握并发模型:深度揭露网络IO复用并发模型的原理。
总结,网络 I/O 复用并发模型通过实现非阻塞 I/O、引入 I/O 复用技术如 select、poll 和 epoll,以及采用 Reactor 模式等技巧,为多任务并发提供了有效的解决方案。这样的模型有效提高了系统资源利用率,以及保证了并发任务的高效执行。在现实中,这种模型在许多网络应用程序和分布式系统中都取得了很好的应用成果。
287 35
|
10月前
|
机器学习/深度学习 算法 测试技术
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
本文探讨了基于图的重排序方法在信息检索领域的应用与前景。传统两阶段检索架构中,初始检索速度快但结果可能含噪声,重排序阶段通过强大语言模型提升精度,但仍面临复杂需求挑战
347 0
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
|
10月前
|
Kubernetes 数据安全/隐私保护 容器
K8s中Flannel网络插件安装提示forbidden无权限的解决方法
总的来说,解决“forbidden无权限”的问题,需要从权限和配置两个方面来考虑。只有当用户或者服务账户有足够的权限,且Flannel的配置文件设置正确,才能成功地安装Flannel。希望这个解答能够帮助你解决问题。
439 13

热门文章

最新文章

推荐镜像

更多