物理机到容器的发展历程
- 物理主机
- 虚拟化技术
- 什么是虚拟化?
- 虚拟化分类
- 主流的虚拟化技术
- KVM
- LXC
- 容器
- Docker与Containerd
- 容器编排
- 为什么要编排工具
- 容器编排工具有哪些?
物理主机
从传统的物理服务到现如今的云服务的发展离不开应用服务的拆分,由大而全的服务拆分为各个解耦合的微服务,离不开服务的CI/CD ,持续集成,持续交付,持续部署的发展,离不开IT服务自动化管理,自动化治理的发展;一切发展都基于传统服务中的场景,逐步优化解决其中遇到的些许问题,让敏捷开发,敏捷部署,快速迭代,快速上线运行,更好的服务大众。
当然,不论虚拟化的,还是容器化,其基础设施都离不开原始的物理服务器
传统单纯物理机服务部署大致过程
- 服务器选型及采购
- IDC选择
- 服务器系统选择、系统安装、上架
- 应用规划及部署
- 域名选择及注册
- DNS映射
- 测试外网访问
随着互联网的技术改变了一些传统场景的定义,优化人民衣食起居的生活方式,IT规模集聚增加,传统的数据中心面临一些问题
- 服务器资源利用率低下,CPU、内存等不能共享
- 资源分配不合理
- 初始化成本高
- 自动化能力差
- 集群环境需要大量的服务器主机
为了解决上面的一些问题,诞生出了服务器的虚拟化技术,将每一台物理机虚拟出来台服务器,以增加资源的利用率,从而降低成本
虚拟化技术
什么是虚拟化?
在计算机技术中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个计算机配置环境,并重新分割、重新组合,以达到最大化合理利用物理资源的目的。
1959 年 6 月,牛津大学的计算机教授,克里斯·托弗(Christopher Strachey)在国际信息处理大会(International Conference on Information Processing)上发表了一篇名为《大型高速计算机中的时间共享》(Time Sharing in Large Fast Computer)的学术报告,他在文中首次提出了 “虚拟化” 的基本概念,还论述了什么是虚拟化技术。这篇文章被认为是最早的虚拟化技术论述
作为服务器运行的系统多为Linux,所以这里我们主要讨论基于Linux的虚拟化技术。
虚拟化分类
Linux虚拟化技术中,解决方案有
-
完全虚拟化
-
硬件辅助虚拟化
-
部分虚拟化
-
超虚拟化(Paravirtualization)
-
操作系统级虚拟化
完全虚拟化:
虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无需进行修改。(如ⅤMware Workstation、ⅤirtualBox、QEMU等)
硬件辅助虚拟化:
用硬件(主要是CPU)辅助支持(目前x86体系结构上可用的硬件辅助虚拟化技术包括Intel-ⅤT和AMD-Ⅴ)处理敏感指令来实现完全虚拟化的功能,客户操作系统无需修改(如VMware Workstation、Xen、Kvm)
部分虚拟化:
只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化。
超虚拟化:
部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的Xen。
操作系统级虚拟化:
内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术即在这个范畴。(如Docker)
主流的虚拟化技术
什么是Hypervisor
Hypervisor 是一种运行在物理服务器和操作系统之间的中间软件层,因此也可以看作是虚拟环境中 的“元”操作系统。它可以协调访问服务器上的所有物理设备和虚拟机,也叫 虚拟机监视器(VMM:Virtual Machine Monitor)
虚拟化的Hypervisor两种分类:
- Type 1:基于直接安装在物理机上的Hypervisor,虚拟机直接运行在Hypervisor (如:Xen 和 VMWare 的 ESXi)
- Type2:物理机先装常规操作系统,Hypervisor作为操作系统上的程序运行,对虚拟机管理。(如:KVM、VirtualBox 和 VMWare Workstation)
由于主机型 Hypervisor的效率问题 ,多数厂商采用了裸机型 Hypervisor 中的 Linux KVM 虚拟化,即为 Type-I(裸金属型)
主流的虚拟化技术有LXC、KVM(Kernel-based Virtual Machine)
KVM
KVM:
KVM是基于硬件虚拟化扩展(Intel VT- X)和 QEMU 的修改版,KVM最早被Linux作为一个内核模块集成到 Linux Kernel 2.6.20 版本中,只有加载了该模块后,才能进一步通过工具创建虚拟机。
QEMU:
QEMU(Quick Emulator)最早于 2001 由 Fabrice Bellard 发布,是一款采用了动态二进制翻译技术的 Type2 (宿主式类型)VMM 软件。
QEMU-KVM:
KVM 和 QEMU 各有优缺点、互为补充,所以后来在 KVM 开发者社区对 QEMU 进行优化,推出了 QEMU-KVM 分支发行版(一个特殊的 QEMU 版本)现已经被广泛的集成(二次开发)到各种著名的商业产品中,包括:AWS、阿里云等等。
虽然,在后来的 QEMU 1.3 版本中,开发者社区又将 QEMU 和 QEMU-KVM 两个分支合并了,但为了清晰的区分两者,所以还是习惯性的在 KVM 语境中将其称之为 QEMU-KVM。
LXC
LXC于2008年首次引入,从其之前的Solaris Containers(或Solaris Zones)和FreeBSD jail中采用了其大部分功能
LXC无需创建完整的虚拟机,而是可以通过自己的进程和网络空间来实现虚拟环境。通过使用命名空间(Namespace)来强制执行进程隔离,并利用内核本身的控制组(Cgroup)功能来限制,说明和隔离进程的CPU,内存,磁盘I / O和网络使用情况。是一个高级的chroot
LXC特性
- Kernel namespaces (ipc, uts, mount, pid, network and user)
- Apparmor and SELinux profiles
- Seccomp policies
- Chroots (using pivot_root)
- Kernel capabilities
- CGroups (control groups)
命名空间(Namesapce):
Linux使用如下技术实现容器运行空间的相互隔离
隔离类型 | 功能 | 系统调用参数 | 内核版本 |
---|---|---|---|
MNT Namespace (mount) | 提供磁盘挂载点和文件系统的隔离能力(mount允许不同名称空间的进程看到的文件结构不同,因此不同名称空间中的进程所看到的文件目录就被隔离了。另外,每个名称空间中的容器在/proc/mounts的信息只包含当前名称的挂载点。) | CLONE NEWNS | Linux 2.4.19 |
IPC Namespace (Inter-Process Communication) | 提供进程间通信的隔离能力(容器中进程交互还是采用Linux常见的进程交互方法(interprocess communication -IPC),包括信号量、消息队列和共享内存等。) | CLONE NEWIPC | Linux 2.6.19 |
UTS Namespace (UNIX Timesharing System) | 提供主机名隔离能力(允许每个容器拥有独立的hostname和domain name,使其在网络上可以被视作一个独立的节点而非主机上的一个进程) | CLONE NEWUTS | Linux 2.6.19 |
PID Namespace (Process Identification) | 提供进程隔离能力(不同容器就是通过pid名字空间隔离开的,不同名字空间中可以有相同的pid。) | CLONE NEWPID | Linux 2.6.24 |
Net Namespace (network) | 提供网络隔离能力(每个Net有独立的网络设备,IP地址,路由表,/proc/net目录。这样每个容器的网络就能隔离开来) | CLONE NEWNET | Linux 2.6.29 |
User Namespace (user) | 提供用户隔离能力(每个容器可以有不同的用户和组id,也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户) | CLONE NEWUSER | Linux 3.8 |
控制组(Cgroups):
是Linux内核提供的一种可以限制、记录、隔离进程组的物理资源机制。因为Namespace技术只能改变进程的视觉范围,不能真实地对资源做出限制。所以就必须采用Cgroup技术对容器进行资源限制,防止某个容器把宿主机资源全部用完导致其它容器也宕掉。在Linux的/sys/fs/cgroup目录中,有cpu、memory、devices、net_cls等子目录,可以根据需要修改相应的配置文件来设置某个进程ID对物理资源的最大使用率。
切根(change to root):
切根的意思就是改变一个程序运行时参考的根目录位置,让不同容器在不同的虚拟根目录下工作,从而相互不直接影响。
容器
容器想虚拟化技术的一种解决方案,是一种轻量化的虚拟机。
什么是运行时:
就是要掌控和实现容器运行的整个生命周期的功能,这些功能均可由小的组件单独实现,且没有相互依赖。而后 Docker 公司与 CoreOS 和 Google 共同创建了 运行时的开放容器标准规范:OCI (Open Container Initial),凡是满足这个标准的,都可以作为运行时,而非docker刚出来时,只能使用docker作为运行时。
这个规范包括了:运行时规范、镜像规范
常见的容器运行时
-
Containerd
-
Cir-o
-
Docker
-
Mirantis Container Runtime
Docker、Google等开源了用于运行容器的工具和库 :Runc(Docke 将 libcontainer
捐献出来改名为 runc
),作为 OCI 的一种实现参考。在此之后,各种运行时工具和库也慢慢出现,然而这些工具所拥有的功能却不尽相同,有的只有运行容器(runc、lxc),而有的除此之外也可以对镜像进行管理(Containerd、cri-o)
目前较为流行的说法是将容器运行时分成了 low-level 和 high-level 两类。
low-level
指的是仅关注运行容器的容器运行时,调用操作系统,使用 namespace 和 cgroup 实现资源隔离和限制。high-level: 指包含了更多上层功能,例如 grpc调用,镜像存储管理等。
目前常见的 low-level runtime有:
- lmctfy :Google的一个项目,它是Borg使用的容器运行时
- Runc :目前使用最广泛的容器运行时。它最初是作为Docker的一部分开发的,后来被提取出来作为一个单独的工具和库。其实现了 OCI 规范,包含config.json文件和容器的根文件系统。
- Rkt : CoreOS开发的Docker/runc的一个流行替代方案,提供了其他 low-level runtimes (如runc)所提供的所有特性。
high-level runtime
较于low-level runtimes位于堆栈的上层。low-level runtimes负责实际运行容器,而High-level runtimes负责传输和管理容器镜像,解压镜像,并传递给low-level runtimes来运行容器。
目前主流的 high-level runtime 有:
- docker
- containerd
- rkt
Docker与Containerd
现在的架构中组件 containerd 就会负责集群节点上容器的生命周期管理,并向上为 Docker Daemon 提供 gRPC 接口。(说明:docker daemon(守护进程):相当就是一个代理了;)
Docker Daemon (不再直接创建容器)请求 containerd 来创建一个容器,containerd 收到请求后,创建一个叫做 containerd-shim 的进程,让这个进程去操作容器。我们指定容器进程是需要一个父进程来做状态收集、维持 stdin 等 fd 打开等工作的。
假如这个父进程就是 containerd,那如果 containerd 挂掉的话,整个宿主机上所有的容器都得退出了,而引入 containerd-shim (可以认为是托管容器父进程的一个工具)就可以来规避这个问题了
容器编排
为什么要编排工具
容器多了,管理众多的容器就是一个任重道远的任务了,基于传统机器中需要考虑的服务问题,容器的管理同样需要考虑解决,并且实现自动化的管理容器来解决这些问题。
传统服务需要考虑的一些问题:
- 可扩展性
- 高可用
- 高并发
- 监控
- 故障检测、故障自愈
容器编排工具有哪些?
docker-compose
基于docker的编排工具,使容器的操作能够批量的,可视的执行。比如可以解决容器之间的依赖关系,当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容器出错,这个时候推荐使用 dockerd的单机编排工具 docker-compose
Docker Swarm
Docker Swarm是管理跨节点容器的编排工具,相较于Docker Compose而言,Compose只能编排单节点上的容器,Swarm将一群Docker节点虚拟化为一个主机,使得用户只要在单一主机上操作就能完成对整个容器集群的管理工作
Kubernetes
Kubernetes是一个开源的,开箱即用的容器集群管理器和业务流程。它具有出色的构建调度器和资源管理器,用于以更有效和高度可用的方式部署容器。
v1.24 之前的 Kubernetes 版本直接集成了 Docker Engine 的一个组件,名为 dockershim。 这种特殊的直接整合不再是 Kubernetes 的一部分 (这次删除被作为 v1.20 发行版本的一部分宣布)。
OpenShift
Openshift建立在kubernetes之上。由Redhat维护(具有开源版本(openshift orgin)和企业版(openshift容器平台))连同核心的Kubernetes功能,它提供了用于容器管理和编排的开箱即用组件。
参考:
KVM-虚拟化技术之Hypervisor-架构
虚拟化技术 — QEMU-KVM 基于内核的虚拟机
常见的几种虚拟化方案
深入理解container–容器运行时
容器编排工具