基本概念
虚拟化技术VM
虚拟化技术通过 Hypervisor 实现虚拟机与底层硬件的解耦,虚拟机实现依赖 Hypervisor 层,Hypervisor 是整个虚拟机的核心所在。
Hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。
Hypervisor 虚拟机可以模拟机器硬件资源,协调虚拟机对硬件资源的访问,同时在各个虚拟机之间进行隔离。
每一个虚拟机都包括执行的应用,依赖的二进制和库资源,以及一个完整的 OS 操作系统,虚拟机运行以后,预分配给它的资源将全部被占用。
容器化技术
容器化技术有哪些好处?
Docker 不同于 VM,只包含应用程序及依赖库,处于一个隔离的环境中,这使得 Docker 更加轻量高效,启动容器只需几秒钟之内完成。
由于 Docker 轻量、资源占用少,可以更方便地部署标准化应用,一台主机上可以同时运行上千个 Docker 容器。
实际部署一般是把两种技术结合起来,比如一个虚拟机中运行多个容器,这样既保证了较好的强隔离性和安全性,也有了快速扩展、灵活性和易用性。
镜像
镜像是一个特殊的文件系统,它提供了容器运行时所需的程序、软件库、资源、配置等静态数据。
即镜像不包含任何动态数据,镜像内容在构建后不会被改变。
实现原理:
镜像是由一系列的镜像层(Layer )组成,每一层代表了镜像构建过程中的一次提交,当我们需要修改镜像内的某个文件时,只需要在当前镜像层的基础上新建一个镜像层,并且只存放修改过的文件内容。分层结构使得镜像间共享镜像层变得非常简单和方便。
容器
镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的本质是一个进程,但与直接在宿主执行的进程不同,容器进程有自己独立的命名空间隔离和资源限制。
因此容器可以拥有自己的Root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
仓库
仓库(Repository)是存储和分发 Docker 镜像的地方。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。
总结:镜像是容器的基石,容器是由镜像创建的。一个镜像可以创建多个容器,容器是镜像运行的实体。仓库就是用来存放和分发镜像的。
基本原理
Namespace
Namespace对内核资源进行隔离,使得容器中的进程都可以在单独的命名空间中运行并且只可以访问当前容器命名空间的资源。
Namespace 可以隔离进程ID、主机名、用户ID、文件名、网络访问和进程间通信等相关资源。
Cgroup
一种Linux内核功能,可以限制和隔离进程的资源使用情况(CPU、内存、磁盘I/O、网络等)。
联合文件系统
又叫UnionFS,是一种通过创建文件层进程操作的文件系统。常用的联合文件系统:AUFS、Overlay和Devicemapper。
联合文件系统非常轻快,Docker通过联合文件系统为容器提供构建层,使得容器可以实现写时复制以及镜像的分层构建和存储。
容器编排
Docker三种常用的编排工具:Docker Compose、Docker Swarm 和 Kubernetes。
K8S
基本架构
有两种Node节点,一个是Master、一个是Work。
Work Node是真正承担服务的机器节点:
- 如服务A部署到K8S后,它的运行环境就在WorkNode节点。
Master Node可以理解为大管家:
- 它会知道现有Work Node的资源运行情况,决定服务安排到哪些Work Nodes上。
在Work Node节点上面有2个重要的组件,一个是Pod、一个是Container:
- Pod是K8S的最小单元,它里面可以有多个Container。
- Container就是服务/组件运行的环境。
一般情况下一个Pod只有一个业务服务Container。
- 而其他的Container是系统所需要的容器(其实就是一些进程组件,如网络组件、Volume组件等)。
所以一般可以理解为我们的服务就在Pod里面。