docker 如何加入kubernetes_玩转Kubernetes之---Pod的实现原理

大家好,今天分享的主题是Pod的实现原理,学习Kubernetes的时候,为了弄明白Pod到底是个啥,为什么这么重要,翻看了许多资料,有许多自己的理解,在此整理成文字,分享。

Pod是一个或一个以上的 容器(例如Docker容器)组成的,且具有共享存储/网络/UTS/PID的能力,以及运行容器的规范。并且在kubernetes中,Pod是最小的可被调度的原子单位。

上面是官方文档中对Pod的定义。如果想要彻底明白Kubernetes的原理,最重要的一点就是搞明白Pod是如何实现的。

一种新兴的技术,肯定有一些新的概念,那么理解这些新概念,有助于你一步步解析它的核心原理,加速你的学习,下面先来看一下,为什么会有Pod这个概念。

知道Kubernetes的人,想必已经了解了Docker。Docker已经成为了容器技术的标准,因此在Kubernetes项目中,容器的表现形式也是Docker,当然Pod也支持其他容器环境。稍微有点研究的人,应该知道,容器的本质是什么,是进程,并且只能管理一个进程。但是在一个操作系统中,一个应用往往有多个进程,或者说一组进程,并且多个进程相互之间有依赖,不能分开,而且只能跑在一台主机上。否则,应用的运行、通信就会有问题,这里举一个打乒乓球的例子。

按照常规来说,我要完成打乒乓球这项操作,我至少需要球、拍、台这三样元素紧密合作才行,缺一不可,主机呢就是你打乒乓球的场地。在这个主机里面,缺了任何一项,都无法完成这个操作。而Pod的作用就是,将有紧密关系的几个容器放到一起,在同一个Pod里供集群进行调度管理,而不用考虑各种依赖关系。

dbacb2c83e4772c1f83466a7e7c595ca.png

图1

通过以上的分析,可以得出结论:Pod的出现是为了将一个或多个互相协作的进程(容器)以一个或多个容器的形式,组合成一个完整的服务单元,方便Kubernetes集群进行调度管理等。

讲到这里或许你会有个疑问:Kubernetes提出Pod这个新概念,讲了这么一堆,仅仅只是为了方便调度?当然不是。通过下面这个图例来讲解Pod出现的另外一个原因。

2791529f9a3ff2aa0236f970efca726c.png

图2

图2中除了用户定义的拍、球、台三个容器外,在Pod里还有一个特殊的容器,Pause容器。

Pause容器,全称Infrastructure container,又称Infra容器。直译为基础容器,有的书里又叫根容器,因为它是Pod里面第一个被创建,第一个被启动的容器。为什么需要Pause容器呢?

下面是K8s官网中的解释,意思是:Pause是基础设施的一部分。在所有Pod里,它是一个第一个被启动的并且为Pod设置网络的容器。

it's part of the infrastructure. This container is started first in all Pods to setup the network for the Pod.

现在你已经知道,Pod里往往存放着一组有关联的容器,但是你有没有想过,在图1的例子中,如果球这个容器挂掉了,而其他两个容器还是正常运行的,那么此时我该如何定义这个Pod的状态呢?是down?还是up?因此为了解决这个状态的问题,引入了与用户容器无关的Pause容器,以它的状态来代表整组容器的状态。Pause容器,极其稳定,体积很小,解压后100-200KB左右。如果你对这个Pause容器比较好奇,可以去GitHub上查看它的源码。图

9602cf5ae75772db3384491d1df64994.png

图3

那么,Pause容器在Pod里与其他的用户容器是什么关系呢?请看图3。所有的用户容器都通过Pause这个容器相连,每加入一个用户容器,都会与Pause容器进行相联。官网中的定义也说了,Pause容器还负责设置Pod的网络,也就是说,用户容器是通过network的形式跟Pause容器连接在一起。用过docker的同学应该知道,如何自定义一个网络将几个不同的容器连接起来呢,首先,你要创建一个net,这个net就是k8s.gcr.io/pause,然后每个容器都用这个网络进行连接,那么上面的图3就成了下面的样子。

3e3b0178a9b5e42fd13efc4ea3c8ec8f.png

图4

上面的讲解可以总结为:

用户容器都与Pause网络相联,即相当于共享了Pause所在的网络,也就是Pause容器的Network Namespace。研究过Docker核心原理的人,应该都知道,Linux的namespace除了network,还有pid、ipc等等。

除了共享网络之外,还可以共享存储,即volume。有了共享网络的设计,那么共享volume也就简单许多了,只需要在Pod的配置文件里定义即可。关于这一点,会在后续的文章里进行演示。

好了,通过以上的讲解,Pod的特性总结如下:

1.Pod是一个或多个容器组成的服务单元,方便Kubernetes集群调度管理。

2.Pod通过共享网络和存储的方式来跟Pod内的容器进行通信。

许多资料中将Pod理解成一个虚拟机,逻辑上的。虚机里跑的应用都是有许多关联的进程组成的,即所谓的紧耦合。Pod不也是有这个特性吗,从这方面来说,理解成一个虚拟机,也无不可。

最后我想说的是,为什么要引入Pod这个概念,我觉得除了架构设计上的原因之外,还有最重要的一个原因是“编排”。Kubernetes是一个容器编排平台,有了Pod这个概念,才能更好的实现编排。如何编排,就看你的“功力”了。网上有多关于编排的文章,大家可以搜搜看。

好了,今天的分享就到这里,如果我的文章有错误,欢迎小伙伴们,批评指正。

8efa5b03048fbc13cb39e6c0b3b44105.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值