k8s pod以及pause容器

k8s中有一个东西叫pod,pod可以放多个容器,然后每个pod中都存在一个pause容器。

一下内容主要是来自如下两篇文章:


Joker:一篇文章为你揭秘何谓Kubernetes Podzhuanlan.zhihu.com


kubernetes pod 解析不了域名 kubernetes中pod的pause容器_Pod


Joker:kubernetes pod为什么需要pause容器zhuanlan.zhihu.com

kubernetes pod 解析不了域名 kubernetes中pod的pause容器_Pod_02


Linux中的容器

这里主要大致描述一下再Linux中是怎样进行容器级的虚拟化的。具体见这里。

资源的隔离主要是靠namespace,

许多人已经知道Linux“容器”并不是真实存在的。Linux中没有所谓的“容器”。众所周知,容器使用了Linux内核中的两个特性(命名空间和cgroups)来执行的普通进程。命名空间允许我们为进程提供一个“视图”,该视图将所有内容隐藏在这些命名空间之外,从而为进程提供自己的运行环境。这使得进程无法看到或干扰其他进程。
这里所说的命名空间包括一下几部分:
主机名
进程id
文件系统
网络接口
进程间通信(IPC)

如果几个进程被放在了完全不同的namespace中,彼此之间完全不可见,完全隔离了,那么就算是实现虚拟化了,它们彼此之间如下图所示:


kubernetes pod 解析不了域名 kubernetes中pod的pause容器_Pod_03


但是如果它们之间共享了某些命名空间,但是其他命名空间又不共享,即它们彼此之间部分可见,则如下图所示:


kubernetes pod 解析不了域名 kubernetes中pod的pause容器_虚拟化_04


所以利用Linux的namespace以及cgroups机制来实现虚拟化,可以灵活地实现虚拟一部分,共享一部分的神奇效果。

为什么要有pod

Pod这种东西之所以会搞出来,主要是因为很多时候,大家需要把多个程序部署在一起。这些程序它们不是像Linux下面的普通进程一样跑在一起,因为那样就缺少了好的隔离性。但是它们最好又能共享一些东西,例如网络或者存储,这样子最方便。

所以就是传统上,大家感觉虚拟化就是share nothing,你如果两个程序之间要通信,那就放在一起share everything。这两种都是不太好的。很多时候,大家只需要share something。Pod就很好地解决了这个问题,要share的东西如网络,存储由pause container来创建,然后子container假如这个namespace就可以。不需要share的东西,就每个container在pod的namespace里面再建一个其他的namespace,这样子就实现了虚拟化的隔离了。说到底都是因为Linux的namespace还有cgroups机制太巧妙了。