K8S为什么需要POD?

POD是什么?

       pod是Kubernetes项目中最小的API对象,也可说是Kubernetes项目中的原子调度单位。在通俗的概念里,pod是一个容器池,在这个池子里我们可以运行很多个容器,看起来就像虚拟机里可以运行很多服务一样。但在本质上,pod跟虚拟机几乎没有任何相似之处。为什么这样说呢?还要从容器的原理来看,毕竟pod中是运行了一个或多个容器的“组合”。

容器原理

    容器其实是一种沙盒技术。顾名思义,沙盒就像是一个箱子一样,把我们所写的应用装起来。这样,不同箱子里的应用会因为有箱子边界的限制而互不干扰,我们可以将其“搬到”任何宿主机上随意运行。这种边界技术的实现得益于Linux系统的Cgroup和Namespace技术。具体例子如下:

#我们在宿主机上运行一个容器
docker run -it busybox /bin/sh
#这时我们进入了容器中,查看一下容器中的进程
 ps
PID  USER   TIME COMMAND
  1 root   0:00 /bin/sh
  10 root   0:00 ps

      从以上代码可以看出,当我们运行容器的时候,容器最先运行的进程是/bin/sh,它是容器的1号进程,而且这个容器里面只有两个进程,这与我们在宿主机中看到的情况是截然不同的,这就说明这个容器的环境已经与宿主机的环境完全隔离开了。这是怎样实现的呢?其实如果这时你重新打开一个shell查看宿主机上的ps 进程就会发现,我们进入容器的exec命令在宿主机上的pid跟容器内的pid是不一样的,这是因为我们要通过 Docker 把这个 /bin/sh 程序运行在一个容器当中时,docker会使用namespace技术重新计算进程的编号,使得我们在容器中只能看到这些被重新计算过的进程,实际上在宿主机上的pid是没有任何改变的。这也是namespace技术的实现原理--修改被隔离进程的视图,让他只能“看到”在它的空间里的东西,比如network、文件系统等。在Linux系统中有多种namespace,如上文使用的pid namespace,还有Mount、UTS、IPC、Network 和 User 这些 Namespace,用来对各种不同的进程上下文进行“障眼法”操作。

      这就是容器的实现原理。即在创建容器进程时,指定了这个进程所需要启用的一组 Namespace 参数。这样,容器就只能“看”到当前 Namespace 所限定的资源、文件、设备、状态,或者配置。而对于宿主机以及其他不相关的程序,它就完全看不到了。        所以,容器本质上是一种特殊的进程!!!

POD原理

     上文提到,容器的本质是操作系统上的一个进程,即我们每启动一个容器就是在宿主机上启动了一个进程。POD作为一个“容器池”,我们可以认为它本质上是一个进程组,这个进程组中的所有进程(容器)都共享一个namespace资源。

      POD在k8s中其实只是一个逻辑实现,k8s实际上操作的还是宿主机操作系统上 Linux 容器的 Namespace 和 Cgroups,而并不存在一个所谓的 Pod 的边界或者隔离环境。POD中的所有容器都是共享了同一个Network Namespace资源,并且可以声明共享同一个Volume。这种方法跟docker里的container网络模式很相似,即:

docker run --net=B --vloume-from=B --name=A image-A

#上面这个命令表示创建了一个容器A,这个容器共享容器B的Net Namespace和Volume

  看起来已经实现了pod的基本要求,但是这种方式创建的容器A和容器B是拓扑关系而不是pod所追求的对等关系。即要想创建容器A,就必须先创建一个容器B,否则容器A是不能被创造出来的。 k8s在pod的实现中使用了一个中间容器----Infra。在创建pod的时候Infra容器是最早被创建的,然后再创建其他的容器通过Join Network Namespace 的方式,与 Infra 容器关联在一起。这样的组织关系,可以用下面这样一个示意图来表达:

                                                         

     如上图所示,这个 Pod 里有两个用户容器 A 和 B,还有一个 Infra 容器。很容易理解,在 Kubernetes 项目里,Infra 容器一定要占用极少的资源,所以它使用的是一个非常特殊的镜像,叫作:k8s.gcr.io/pause。这个镜像是一个用汇编语言编写的、永远处于“暂停”状态的容器,解压后的大小也只有 100~200 KB 左右。

    这个Infra容器的作用就是在创建pod的时候将这个pod所需要的资源都“hold”住,然后再创建其他的容器,该pod的所有网络出入口都是经过这个Infra容器的,而pod中的其他容器之间都是通过localhost:port的方式进行通信。而且pod的生命周期跟其他pod无关,只跟Infra容器的生命周期一致。这就是pod的设计和实现原理。

总结

    pod的本质可以认为是在扮演传统基础设施里“虚拟机”的角色;而容器,则是这个虚拟机里运行的用户程序。

参考资料

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值