Kubernetes深入学习之容器入门(一)
容器与虚拟化
Kubernetes(常缩写为 k8s)是一个用于自动管理成百上千容器的编排系统。要理解 Kubernetes,我们首先需要了解容器。
容器是什么?
容器是一种轻量化的虚拟技术,将应用和运行环境打包在一起,并且在操作系统的支持下隔离运行,即:
容器 = 应用 + 运行环境 + 隔离的运行空间
就像一个集装箱一样,打包整理了整个应用。这样应用和应用之间就有了边界不会互相干扰,而应用也可以像集装箱一样可以被轻易搬运、复制,即使在不同的操作环境中也可以方便运行。
如果要执行一个程序,首先就需要准备好一些文件,比如输入文件、输出文件、代码的执行文件,随后执行,操作系统接收指令,内存、CPU、各种I/O设备随之而动。
这样一个程序运行起来后的计算机执行环境的总和,就是进程。
进程的静止状态就是程序,
进程的动态表现是其在执行过程中涉及的数据与状态的总和。
容器技术的核心功能,就是通过约束和修改进程的动态表现,为其创建一个清晰的“边界”,从而实现隔离与封装。
容器的两大技术支柱
对于 Docker 等大多数 Linux 容器而言,实现隔离主要依赖以下两项技术:
Cgroups:用来制造约束;
Namespace:用于修改进程视图,营造隔离环境。
Namespace 技术
Namespace 技术是一种隔离机制,它使得同一台机器上的不同进程看起来像是在各自独立的系统中运行。
例如,使用PID Namespace时建立新进程时,这些新进程在自己的进程空间中看到的PID=1,而在宿主空间其实际 PID 可能完全不同。
除了刚刚用到的 PID Namespace,Linux 操作系统还提供了 Mount、UTS、IPC、Network 和 User 这些 Namespace,分别用于隔离文件系统、主机名、进程间通信、网络和用户身份等上下文。
所以Docker容器就是在创建容器进程时指定这个进程所需要启用的一组Namespace参数,这样容器就只能识别当前Namespace所限定的资源、文件、设备、状态或配置,对于宿主机和其他不相关的程序就完全无法观察到。所以实质上容器只是一种特殊的进程。
Docker技术和虚拟机的区别
虚拟化的核心是Hypervisor(虚拟机监控器),容器的核心是Docker Engine(容器引擎)。
「Hypervisor」和「Docker Engine」并不是具体的软件,而是一种技术概念或体系架构。 各自的概念都可以由多种软件来实现。
虚拟机
虚拟机的工作原理是通过Hypervisor(虚拟机监控器)虚拟出一整个计算机环境,用户的应用进程都运行在这个虚拟的机器中,也只能看到这个系统中的文件和目录,以及虚拟设备,允许用户在其中安装一个完整的操作系统(Guest OS)。因此虚拟机能隔离开不同的应用进程。
在虚拟机环境中,Hypervisor创建了一个实际存在的虚拟环境,对应用程序进程的隔离环境负责的是Hypervisor这类软件。
虚拟机技术的缺点
虚拟机的缺点显而易见,在最开始接触虚拟机时就可以感受到——资源消耗大,启动速度慢。
因为虚拟机是真实存在的,而且其中必须运行一个完整的操作系统才能执行用户的应用进程。首先虚拟机的存在和运行就占用了内存和计算资源,其次,用户在虚拟机中操作时,对宿主机操作系统的调用不可避免的要经过虚拟化软件的拦截和处理。
Docker容器
而Docker Engine(容器引擎)技术只是在创建进程时添加了一些Namespace参数进行限制,并不存在一个真正的Docker容器在运行,这让每个容器进程仿佛在一个完全独立的系统中运行,但实际上所有容器都共享宿主机的内核。
在容器技术中,任何容器管理工具都不会创建任何的实体容器,对应用程序进程的隔离环境负责的是宿主机操作系统本身。
容器的限制
容器实质上是一种特殊的进程,多个容器共享同一个宿主机的操作系统内核。
这种“共享内核”的特性导致了容器的限制:
容器类型的限制
由于容器依赖宿主机的内核,因此它 无法运行与宿主机操作系统类型不同的容器:
Linux 宿主机 只能运行 Linux 容器;
Windows 宿主机 只能运行 Windows 容器;
此外,容器也 不能运行需要高于宿主机内核版本的系统或应用。
容器所依赖的系统调用与内核特性必须由宿主机内核提供,否则容器将无法正常启动或运行。
容器权限的限制
容器内部的进程虽然拥有较高权限,但依旧受限于宿主机的安全机制。
在大多数情况下,容器 无法直接修改内核参数或访问宿主机的关键资源,以防止影响系统的整体稳定性和安全性。
容器参数的限制
容器对系统全局参数的修改能力有限,部分系统级参数在容器中无法修改,包括:
全局内核参数;
网络参数;
cgroup 参数。
隔离的不彻底性
容器的隔离本质上是一种进程级隔离,容器内的进程实质上仍然是宿主机上的普通进程,所有的容器都在使用同一个内核。
由于所有容器共享宿主机上的物理资源,必须对资源使用进行限制,否则某个容器可能耗尽系统资源,影响其他容器或宿主机。Linux Cgroups 正是 Linux 内核中用于为进程组设置资源限制的关键机制。
Cgroups技术
Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
Cgroups以文件和目录的形式存在于/sys/fs/cgroup/cpu
路径下。该目录下有多个目录,相当于多个子系统,每个子系统都有其独特的资源限制能力,只需要在每个子系统下创建一个控制组,并配置资源限制参数,即可实现对进程资源的精确控制。