理解Kubernetes网络:pods篇

这篇文章将试图揭开在kubernetes集群中运行的网络的多层神秘感。 Kubernetes是一个功能强大的平台,其中包含许多智能的设计选择,但讨论交互的方式可能会造成混淆:Pod网络,服务网络,集群IP,容器端口,主机端口,节点端口……这会让我们更加迷惑。如果您想试一试,并弄清楚每一层是如何工作的,那么以一种相当优雅的方式来说,这一切都是有意义的。

为了突出重点,我将把该系列分为三个部分。第一部分将研究容器和Pod。第二个将介绍服务,服务是允许Pod临时使用的抽象层。最后一篇文章将探讨入口以及如何从集群外部为您的Pod提供流量。首先是一些声明。这篇文章并非旨在成为有关容器,kubernetes或pod的基本介绍。要了解有关容器如何工作的更多信息,请参阅Docker的概述。可以在这里找到kubernetes的高级概述,并在这里专门了解Pod的概述。最后,对网络IP地址空间有基本的了解会有所帮助。

f-01.png

Pods

那么什么是Pod呢?Pod由在同一主机上的一个或多个容器组成,并配置为共享网络堆栈和其他资源(例如卷)。 Pod是构建kubernetes应用程序的基本单位。 “共享网络堆栈”实际上是什么意思?实际上,这意味着Pod中的所有容器都可以在localhost上相互访问。如果我有一个运行nginx并在端口80上侦听的容器,另一个运行scrapyd的容器,则第二个容器可以通过http://localhost:80 连接到第一个容器。但是,这实际上如何工作?让我们看一下在本地计算机上启动docker容器时的典型情况:

f-02.png

从上至下,我们有一个物理网络接口eth0。附加到该网桥的是网桥docker0,附加到网桥的是虚拟网络接口veth0。请注意,docker0和veth0都在同一网络上,在此示例中为172.17.0.0/24。在该网络上,docker0被分配了172.17.0.1,并且是veth0的默认网关,它被分配了172.17.0.2。由于启动容器时配置网络名称空间的方式,容器内部的进程只能看到veth0,并通过docker0和eth0与外界通信。现在启动第二个容器:

f-03.png

如上图所示,第二个容器获得一个新的虚拟网络接口veth1,该接口连接到相同的docker0网桥。此接口分配为172.17.0.3,因此它与网桥和第一个容器位于同一逻辑网络上,并且两个容器都可以只要他们能够以某种方式发现另一个容器的IP地址,就可以通过网桥进行通信。

很好,但所有这些并不能使我们进入kubernetes连网的“共享网络堆栈”。幸运的是,名称空间非常灵活。 Docker可以启动一个容器,而不是为其创建一个新的虚拟网络接口,而是指定它共享一个现有接口。在这种情况下,上图看起来有些不同:

f-04.png

现在,第二个容器看到veth0,而不是像前面的示例那样获得自己的veth1。这有一些含义:首先,两个容器都可以从外部在172.17.0.2上寻址,而在内部,每个容器都可以命中在本地主机上由另一个打开的端口。这也意味着两个容器不能打开同一端口,这是一个限制,但与在单个主机上运行多个进程时的情况没有什么不同。这样,一组过程可以充分利用容器的去耦和隔离功能,同时在最简单的网络环境中进行协作。

Pod创建一个特殊的容器来实现这种模式,其唯一目的是为其他容器提供网络接口。如果您将SSH调度到已安排了Pod的kubernetes集群节点并运行docker ps,您将看到至少一个用pause命令启动的容器。pause命令将暂停当前进程,直到接收到信号为止,因此这些容器除了睡眠以外什么都不做,直到kubernetes向其发送SIGTERM为止。尽管缺乏活动,“pause”容器仍然是Pod的核心,它提供了虚拟网络接口,所有其他容器都将使用此接口与彼此以及与外界进行通信。因此,在假设的Pod中,最后一张图片看起来像这样:

f-05.png

Pod 网络

一切都很酷,但是一个装满了可以互相访问的容器的Pod并没有给我们提供系统。由于在下一篇我讨论服务的文章中将变得更加清楚的原因,kubernetes的设计核心是要求Pod能够与其他Pod通信,无论它们是在同一本地主机上还是在单独的主机上运行。要查看这种情况如何发生,我们需要上一级并查看集群中的节点。本节将包含一些对网络路由的介绍,我意识到这是所有人都希望避免的主题。很难找到清晰,简短的IP路由教程。

kubernetes集群由一个或多个节点组成。节点是一个主机系统,无论是物理系统还是虚拟系统,都具有容器运行时及其依存关系(即主要是docker)以及几个kubernetes系统组件,该主机系统连接到网络以使其能够访问群集中的其他节点。一个由两个节点组成的简单群集可能看起来像这样:

f-06.png

如果您是在GCP或AWS等云平台上运行集群,则绘制的图很近似于单个项目环境的默认网络架构。为了便于说明,在本示例中,我使用专用网络10.100.0.0/24,因此路由器为10.100.0.1,两个实例分别为10.100.0.2和10.100.0.3。通过此设置,每个实例可以在eth0上彼此通信。太好了,但请记住,我们上面看过的Pod不在此专用网络上:它完全悬挂在另一个网络上的桥上,该网络是虚拟的,仅存在于特定节点上。为了更加清楚,让我们将之前Pod的东西放到图片中:

f-07.png

左侧的主机的接口eth0地址为10.100.0.2,其默认网关为路由器10.100.0.1。连接到该接口的是地址为172.17.0.1的网桥docker0,并连接到地址为172.17.0.2的接口veth0。 veth0接口是使用pause容器创建的,并且通过共享网络堆栈在所有三个容器中可见。由于在创建网桥时设置了本地路由规则,因此到达eth0且目标地址为172.17.0.2的任何数据包都将转发到网桥,然后将其发送到veth0。到目前为止还可以。如果我们知道在此主机上有一个位于172.17.0.2的容器,则可以向路由器添加规则,将该地址的下一跳设置为10.100.0.2,它们将从那里转发到veth0。现在,让我们看看另一台主机。

右侧的主机也具有eth0,其地址为10.100.0.3,使用相同的默认网关10.100.0.1,并且再次连接到该主机是地址为172.17.0.1的docker0网桥。嗯这将是一个问题。现在,该地址实际上可能与主机1上的另一个网桥不同。我在这里做了相同的设置,因为这是最糟糕的情况,如果您刚刚安装了docker并让它做的话,它很可能会以这种方式解决它的东西。但是,即使选择的网络不同,这也突出了一个更基本的问题,即一个节点通常不知道将哪个专用地址空间分配给另一节点上的网桥,并且我们需要知道是否要发送数据包并让他们到达正确的地方。显然需要一些结构。

Kubernetes通过两种方式提供该结构。首先,它为每个节点上的网桥分配一个总体地址空间,然后根据网桥所基于的节点在该空间内分配网桥地址。其次,它在10.100.0.1处向网关添加了路由规则,告诉它应如何路由发往每个网桥的数据包​​,即可以通过哪个节点访问网桥的eth0。虚拟网络接口,网桥和路由规则的这种组合通常称为覆盖网络。在谈论kubernetes时,我通常将此网络称为“pod网络”,因为它是一个覆盖网络,允许Pod在任何节点上来回通信。这是上面kubernetes实际运行的图:

f-08.png

应该看出来的一件事是,已将网桥的名称从“ docker0”更改为“ cbr0”。Kubernetes不使用标准的docker网桥设备,实际上“ cbr”是“自定义网桥”的缩写。虽然不了解自定义的所有信息,但这是在kubernetes上运行的docker与默认安装之间的重要区别之一。另外要注意的是,在此示例中,分配给网桥的地址空间为10.0.0.0/14。取自我们在Google Cloud中的一个登台集群,因此是一个真实示例。您的群集可能会分配一个完全不同的范围。

通常,您无需考虑此网络的功能。当一个Pod与另一个Pod通信时,通常是通过抽象服务来实现的,服务是一种软件定义的代理,它将成为本系列下一篇文章的主题。但是pod网络地址将在日志中打印,并且在调试时,在某些情况下,您可能需要显式路由此网络。例如,默认情况下,离开kubernetes pod绑定到10.0.0.0/8范围内任何地址的流量不会进行NAT,因此,如果您与该范围内另一个专用网络上的服务进行通信,则可能需要设置规则以路由数据包回到Pod。希望本文将帮助您采取正确的步骤以使此类方案正确运行。

Image placeholder
TAO12332166
未设置
  39人点赞

没有讨论,发表一下自己的看法吧

推荐文章
Kubernetes 基础信息:什么是 Kubernetes?

简介 Kubernetes(常简称为K8s,在希腊语意为“舵手”或“驾驶员”)是用于自动部署、扩展和管理容器化(containerized)应用程序的开源系统。 由JoeBeda、BrendanBur

Twitter 宣布抛弃 Mesos,全面转向 Kubernetes

作者|阿里云智能高级技术专家张磊划重点Twitter的基础设施从Mesos全面转向Kubernetes阿里云容器平台团队即将开源 Kubernetes高级作业管理集合美国西部时间5月2日下午7点,Tw

通过一个示例了解kafka connect连接器

什么是kafka连接器connect在实际工作中使用kafka,有时候会有类似这样的场景。我们需要把某些数据源的数据导入到kafka,或者把kafka作为数据源导出数据。或者两种场景的需求都要。这算是

【Kubernetes系列】第5篇 Ingress controller – traefik组件介绍

1.概述为了能够让Ingress资源能够工作,在Kubernetes集群中必须至少有一个运行中的ingresscontroller组件。也就是说如果在kubernetes集群中没有一个ingressc

Chaos Mesh —— 让应用跟混沌在 Kubernetes 上共舞

作者:殷成文2019年12月31日,我们在GitHub上正式开源了ChaosMesh。作为一个云原生的混沌测试平台,ChaosMesh提供在Kubernetes平台上进行混沌测试的能力。本篇文章将围绕

云端的生存之道,第 1 单元:将 Spring Boot 部署到 Kubernetes

初始化Kubernetes集群 第一步是初始化IBMCloud上的Kubernetes集群。IBMCloud可能需要几分钟时间来启动新的Kubernetes集群;因此,通过先执行初始化操作,可以在后台

我如何将博客迁移到 Kubernetes(上)

最近Kubernetes的发展,以及在我司的大量应用,自己也迫不及待想要尝尝鲜,虽然我的博客是基于Hexo的纯静态站点,但这并不能阻挡我把它迁移上Kubernetes!毕竟...相比于GitHubPa

我如何将博客迁移到 Kubernetes(下)

前面的部分介绍了如何为我的博客打包Docker镜像,接下来就是重头戏——部署到Kubernetes。 GoogleKubernetesEngine 没错,我现在自用的Kubernetes集群就是

使用 Kubernetes 来部署你的 Laravel 程序

说明 Laravel是开发PHP应用程序的优秀框架。无论您是需要构建新想法的原型,开发MVP(最小可行产品)还是发布成熟的企业系统,Laravel都可以促进所有开发任务和工作流程。 如何处理部署应用

为什么说谷歌Anthos是kubernetes的翻版?

在本周纽约的一次会议活动中,谷歌谈到了Anthos。那么,Anthos到底是什么?有哪些新功能?本文将逐一解答!什么是Anthos?从官方资料来看,Anthos是谷歌的混合云平台,主要作用是保护客户的

当Kubernetes成为云操作系统的标准应用,AWS也亮出了“杀手锏”!

作为云计算领域的排头兵,AWS一直是“老大哥”形象,他的一举一动都牵动着无数人的神经。AWS不仅在云计算领域投入时间早、运行时间长、客户多,在无服务器、容器以及现代化应用工具开发方面,也是当之无愧的引

为什么说Kubernetes的崛起预示着云原生时代到来?

现在,云原生、Kubernetes已经成为企业IT领域的时髦概念,几乎所有的企业都在关注;如果不提这些概念,好像企业就会在云市场竞争中失去绝对话语权。那么,云原生和Kubernetes是怎样一种关系?

美团点评Kubernetes集群管理实践

背景作为国内领先的生活服务平台,美团点评很多业务都具有非常显著、规律的“高峰”和“低谷”特征。尤其遇到节假日或促销活动,流量还会在短时间内出现爆发式的增长。这对集群中心的资源弹性和可用性有非常高的要求

如何应对Kubernetes中的存储管理挑战?

Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。对于那些工作负载多样化、不断变化的企业来说,使用Kubernetes是非常有利的。与容器一样,

Kubernetes监控在小米的落地

本文介绍了高可用、持久存储、可动态调整的Kubernetes监控方案的实现过程。小米的弹性调度平台(Ocean)以及容器平台主要基于开源容器自动化管理平台kubernetes(简称k8s)来提供服务,

K8s有多热?传统银行转型拥抱Kubernetes案例

Kubernetes已经成为标准的基础设施API,像RedHat、Mesosphere(现在的D2IQ)和Pivotal等供应商都无法避免。如果您希望使企业能够合理构建应用程序,那么Kubernete

Spark in action on Kubernetes – 存储篇

作者|阿里云智能事业群技术专家莫源前言在上篇文章中,SparkinactiononKubernetes–SparkOperator的原理解析我们分析了SparkOperator内部的机制,今天我们会讨

如何在生产环境中部署Kubernetes集群?

如果把kubernetes集群应用于生产环境中,需要做哪些准备?我们先要弄清楚一个词,什么是“生产就绪”?生产就绪,是我们经常听到的一个专业术语,大概意思是已经准备好并已处于即将生产的状态。但是,到底

Kubernetes 未来一年会有哪些变化?

试图预测历史上发展最快的开源项目的未来几乎是徒劳的,从谷歌到社区其他成员的“传承”已经发展成为编排的实际标准,从来没有一个项目以这种方式获得了整个企业社区的集体支持。从CNCF成员的长名单就可以看出,

Kubernetes1.14 版发布,增强了云原生平台的Windows节点支持

Kubernetes1.14GA版本,是开源云原生平台Kubernetes在2019年的一次重大更新。自3月25日开始,这一版本正式推出,供开发者全面使用。  Kubernetes,由云原生计算基金会

白话 Kubernetes 基础概念

Kubernetes简介微服务框架的流行,使得服务越来越精细化,服务也变的越来越多,对于发布和管理而言产生了巨大的挑战,而Docker的诞生,给与微服务的资源治理和控制提供了很好的基础。容器化可以解决

一小时快速搭建基于阿里云容器服务-Kubernetes的Web应用

本文面向的读者如果您是一个Kubernetes的初学者,本文可以帮助你快速在云上搭建一个可实际使用的集群环境,并发布自己的第一个应用。你无须提前准备任何的硬件资源或者下载任何的软件包。 如果您已经有一

Talos网卡负载优化:基于个性化一致性哈希的负载均衡

本文将详细介绍基于个性化一致性哈希的流量均衡方法。 目录  业务增长带来的流量均衡需求基于一致性哈希的调度策略个性化一致性哈希的负载均衡流量均衡在Talos中的实现前文《小米消息队列的实践》介绍了小米

中兴陈河堆:PostgreSQL在5G网管中的应用

2019年是中国5G试商用元年,各大电信运营商正在进行紧张的5G实验局测试。5G网络基于SDN/NFV虚拟化技术进行构建,组网架构非常复杂,由无线接入网、承载网、核心网等部分组成,包含了大量的网元设备

从网络接入层到 Service Mesh,蚂蚁金服网络代理的演进之路

本文作者:肖涵(涵畅)上篇文章《 诗和远方:蚂蚁金服ServiceMesh深度实践|QCon实录》中, 介绍了ServiceMesh在蚂蚁金服的落地情况和即将来临的双十一大考,帮助大家了解Servic