kubernetes学习

容器概念入门

容器,其实是一种特殊的进程而已

容器技术核心

通过 约束 和 修改进程的动态表现, 为其创造出一个 ‘边界’

1
2
3
4
总结: 
1. 容器只是特殊的进程, 真正对隔离环境负责的是宿主机操作系统本身
2. 隔离技术: 使用 cgroups技术 制造约束(限制资源) , 使用 namespace技术 修改进程视图
3. 隔离不彻底: 使用的都是宿主机的内核,无法namespace化的资源多容器公用

cgroups : control group

1
2
3
4
5
6
制造约束。 
Linux 内核中用来为进程设置资源限制, 包括 CPU、内存、磁盘、网络带宽等等
理解: 一个子系统目录加上一组资源限制文件的组合



namespace

1
2
3
4
5
6
7
8
9
10
修改进程视图
namespace技术 只是修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容

linux中,创建一个新的进程用 clone(), 其中有多个可选参数。 如pid进程号,每次创建可选择创建新的PID namespace,则不同namespace之间就看不到进程号

启动容器,其实还是启动的进程,只是为这个进程加了很多 namespace参数
对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。

linux 提供的namespace:
PID, Mount、UTS、IPC、Network 和 User 这些,用来对各种不同的进程上下文进行“障眼法”操作
  • 虚拟机Hypervisor 和 Docker Engine
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Docker Engine 不对应用进程的隔离环境负责, 真正对隔离环境负责的是宿主机操作系统本身

虚拟机消耗大,本身启动就需要一定的内存, 对宿主机进行系统调用又不可避免需要经过虚拟化软件处理和拦截。 计算,网络,磁盘IO消耗都很大
而容器化的应用,本质还是一个普通进程,由宿主机操作系统统一管理,性能消耗都是忽略不计


容器优点:
“敏捷”和“高性能”

缺点: 隔离不彻底
容器只是运行在宿主机上的一种特殊的进程,多个容器之间使用的还是同一个宿主机的操作系统内核
所以跨内核跑容器是不可能的
在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,最典型的例子就是:时间。
所以修改了宿主机时间,所有容器的时间都会变