kubernetes Pod到底是什么?
官方文档 对其有详细描述及定义
提到Pod
我们不得不了解下容器
,pod
实质是一个容器集合。
什么是容器?
我们所说的容器
本身其实并不存在,是一个抽象的概念。在Linux
中没有所谓的容器
,容器
的实质是一个视图被隔离、资源受限的进程。
众所周知,容器是使用Linux
内核的两个特性——命名空间和cgroup
来执行的普通进程。
命名空间/名称空间
命名空间允许您为进程提供一个视图
,该视图隐藏那些名称空间之外的所有内容,从而为进程提供自己的运行环境。
常用命名空间包括:
Cgroup
命名空间: 隔离控制组根目录 (Linux 内核4.6
新增)IPC
命名空间: 隔离系统进程通信等 (Linux 内核2.6.19
新增)MNT
命名空间: 隔离挂载点(Linux 内核2.4.19
新增)NET
命名空间: 隔离网络设备、栈、端口等(Linux 内核2.6.24
新增)PID
命名空间: 隔离进程ID
(Linux 内核2.6.24
新增)USER
命名空间: 隔离用户、用户组ID
(Linux 内核2.6.23
新增,Linux 内核3.8
完善)UTS
命名空间: 隔离主机名和NIS
域名(Linux 内核2.6.19
新增)
控制组
默认情况下,一个进程可以使用它所运行的物理机器上的所有资源,从而消耗其他进程的资源。
为了限制这种情况,Linux
有一个叫做cgroups
的特性。进程可以在cgroup
中运行,就像一个命名空间,但是cgroup
限制了进程可以使用的资源。
这些资源包括CPU
、RAM
、块I/O
、网络I/O
等。CPU
通常受微核(单个CPU
核心的1/1000
)的限制,内存受RAM
字节的限制。
进程本身可以正常运行,但它只能使用cgroup
所允许的CPU
,如果超过cgroup
设置的内存限制,就会出现内存不足错误。
linux
通过命名空间与控制组使进程视图被隔离、资源受限,此时该进程即可称为一个容器
。