本文作者:何文强 — CODING 高级解决方案架构师 具有一线互联网、物联网独角兽、全国股份制银行、新型智慧交通等跨行业从业经历,历任 Java 开发高级工程师、DevOps 技术专家、高级研发经理等职,对微服务、敏捷、DevOps、容器技术有深刻的理解和丰富的实践。
容器技术
容器是打包代码及其所有依赖项的标准软件单元,因此应用程序可以从一个计算环境快速可靠地运行到另一个计算环境。
容器技术早在 20 世纪 70 年代末就已出现雏形。1979 年~2012 年,以Choot、Jail/zone、Openvz、cGroup、LXC 等为代表的资源隔离和控制技术开发出现,拉开了虚拟化和容器的序幕。
在 1970s 年代,计算资源匮乏,想要通过快速销毁和重建基础设施来解决测试环境污染问题变得几乎不可能。为隔离出可供软件进行构建和测试的环境,chroot(change root)系统调用程序横空出现。
在 1979 年 Unix V7 的开发过程中,正式引入 chroot 系统调用,为每个进程提供一个独立的磁盘空间,将一个进程及其子进程的根目录改变到文件系统中的新位置,让这些进程只能访问到该目录。这个被隔离出来的新环境被叫做 Chroot Jail。这标志着进程隔离的开始,隔离每个进程的文件访问权限。
2000 年,FreeBSD 操作系统正式发布 FreeBSD jails 隔离环境,真正意义上实现进程的沙箱化。这为文件系统、用户、网络等隔离增加了进程沙盒功能,实现了客户服务之间的隔离和管理。
这种沙箱的实现,依靠操作系统级别的隔离与限制能力而非硬件虚拟化技术。FreeBSD Jails 允许管理员将 FreeBSD 计算机系统划分为几个独立的、较小的系统,称为“ jails”,并能为每个系统和配置分配 IP 地址,可以对软件的安装和配置进行定制。
Openvz(Open Virtuzzo)是 Linux 操作系统级虚拟化技术,它通过 Linux 内核补丁形式进行虚拟化、隔离、资源管理和状态检查。
操作系统级虚拟化有一些限制,因为容器共享相同的体系结构和内核版本,当客户需要不同于主机的内核版本情况下,这种缺点就会显现出来。该代码未作为正式 Linux 内核的一部分发布。每个 OpenVZ 容器都有一套隔离的文件系统、用户、用户组、进程树、网络、设备和 IPC 对象。
Process Containers(由 Google 在 2006 年推出)旨在用于限制、计算和隔离一系列流程的资源使用(CPU、内存、磁盘 I / O、网络)。一年后(2007),为了避免和 Linux 内核上下文中的“容器”一词混淆而改名为 ControlGroups 简称 Cgroups,并最终合并到 Linux 内核 2.6.24 中。
Linux 容器(LXC)是第一个、最完整的 Linux 容器管理器的实现方案。2008 年,通过将 Cgroups 的资源管理能力和 Linux Namespace 的视图隔离能力组合在一起,LXC 完整的容器技术出现在 Linux 内核中,并且可以在单个 Linux 内核上运行而无需任何补丁。
LXC 存在于 liblxc 库中,提供各种编程语言的 API 实现,包括 Python3、Python2、Lua、Go、Ruby 和 Haskell。现在 LXC project 由 Canonical 公司赞助并托管的。
2013 年,Docker 开源,打开了容器化的正确姿势,以应用分发和交付的理念将容器技术发展带到新高度,容器技术得到极大的接受和认可,为容器技术普及和云原生技术的发展奠定了坚实的基础。
Docker 真正核心的创新是容器镜像(docker image),一种新型的应用打包、分发和运行机制。容器镜像将应用运行环境,包括代码、依赖库、工具、资源文件和元信息等,打包成一种操作系统发行版无关的不可变更软件包。
lmctfy(“Let Me Contain That For You”)是操作系统级虚拟化的实现,它基于 Linux 内核的 cgroups 功能。
它提供了与其他容器相关的 Linux 工具(如 Docker 和 LXC )类似的功能。Lmctfy 是 Google 容器工具的发行版,是受 Apache 许可 2.0 版条款约束的免费开源软件。
维护者在 2015 年 5 月表示他们努力将他们的概念和抽象合并到 Docker 的底层库 libcontainer 中,因此停止了 lmctfy 的积极开发。
2014 年 Google 基于内部使用的 Borg 系统创建了开源项目 Kubernetes(简称 K8s),用于解决大规模集群的容器部署、运行、管理等问题。Kubernetes 在容器的基础上增加了一层的新的管理抽象 Pod,以便更好地利用容器进行应用的功能模块切分。得益于 Google 在大规模集群基础设施建设的强大积累,脱胎于 Borg 的 K8s 很快成为了行业的标准应用。
2016 年 3 月,Docker 1.11 的 Docker Engine 包含了 containerd,Containerd 向 docker 提供运行容器的 API,二者通过 grpc 进行交互,containerd 最后会通过 runc 来实际运行容器。2016 年 12 月,Docker 公司宣布将将容器运行时相关的程序从 docker daemon 剥离出来,形成了 containerd。
Google 带头成立了 Cloud Native Computing Foundation(CNCF),旨在“构建云原生计算 —— 一种围绕着微服务、容器和应用动态调度的、以基础设施为中心的架构,并促进其广泛使用”。通过 CNCF 基金会,众多技术厂商一起制定了一些列行业实施标准,包括与容器相关的最为重要的几个规范,例如 CRI、CNI、CSI、OCI Distribution Spec、OCI Image Spec、OCI Runtime Spec 和 Shimv2。
容器技术通过共享内核导致资源隔离不彻底而引发的安全问题得到业界越来越多的关注和担忧,为“安全”而生的 Kata 容器技术出现。
Kata Containers 是一个 Novel 实现的轻量虚拟机,可以无缝地与容器生态系统进行集成。Kata Containers 项目的主要目标是将虚拟化的安全隔离优势和容器的快速启动特点结合起来。
Kata Containers 让每个容器 /pod 采用其单独的内核,运行在一个轻量级的虚拟机中。由于每个容器 /pod 现在都运行在专属虚拟机中,恶意代码无法再利用共享内核来访问邻近的容器。
TKE 是腾讯云推出的托管容器服务,可以在云中和本地运行和扩展 Kubernetes 应用程序。
EKS 是亚马逊云服务推出的托管容器服务,可以在云中和本地运行和扩展 Kubernetes 应用程序。
GKE 是谷歌推出的托管容器服务,可以在云中和本地运行和扩展 Kubernetes 应用程序。
AKS 是微软 Azure 推出的托管容器服务,可以在云中和本地运行和扩展 Kubernetes 应用程序。
ACK 是阿里云推出的托管容器服务,可以在云中和本地运行和扩展 Kubernetes 应用程序。
CCE 是华为云推出的托管容器服务,可以在云中和本地运行和扩展 Kubernetes 应用程序。
AWS推出的混合云管理平台。
Google推出的混合云管理平台。
微软推出的混合云管理凭条。
Cgroup 是 Control Groups 的简称,被直译为控制组,它主要是做资源控制,用于限制和隔离一组进程(Process Groups)对系统资源 (如 CPU Memory I/O 等) 的使用。
其原理是将一组进程放在一个控制组里,通过给这个控制组分配指定的可用资源,达到控制这一组进程可用资源的目的。
从实现的角度来看,Cgroup 实现了一个通用的进程分组的架构,而不同资源的具体管理则是由各个 Cgroup 子系统实现的。
Cgroup 的 api 以一个伪文件系统的实现方式,用户的程序可以通过文件系统实现 Cgroup 的组件管理;
Cgroup 的组件管理操作单元可以细粒度到线程级别,另外用户可以创建和销毁Cgroup,从而实现资源载分配和再利用;
所有资源管理的功能都以子系统的方式实现,接口统一子任务创建之初与其父任务处于同一个 Cgroup 的控制组。
资源限制:可以对任务使用的资源总额进行限制;
优先级分配:通过分配的 CPU 时间片数量以及磁盘 IO 带宽大小,实际上相当于控制了任务运行优先级;
资源统计:可以统计系统的资源使用量,如 CPU 时长,内存用量等;
任务控制:Cgroup 可以对任务执行挂起、恢复等操作。
Namespace 是 Linux 内核用来隔离内核资源的方式。通过 Namespace 可以让同一Namespace中的进程相互可见,不同 Namespace 中的资源互相不可见。
Linux Namespaces 是对全局系统资源的一种封装隔离,使得处于不同 Namespace 的进程拥有独立的全局系统资源,改变一个 Namespace 中的系统资源只会影响当前 Namespace 里的进程,对其他 Namespace 中的进程没有影响。
Docker 就是通过 Namespace 和 Cgroup 这两个技术打了一套组合拳,实现了用户从 Linux 系统的 Namespace,到 Namespace 其他能力的范围圈定,再到具体能力的实现,Cgroup 将整体结合起来,让 Docker 实现成为了可能。
《数字化 IT 从业者知识体系》背景
数字化和可持续发展是中国企业未来发展的两大主题,掌握数字化知识,具备数字化能力,应用数字化技术是我们 IT 从业者未来核心竞争力所在。《数字化 IT 从业者知识体系》的初衷是为 IT 从业者提供的系统性的数字化知识体系,内容涵盖管理实践、工程实践、技术实践三个层次,涉及软件开发方法、应用技术架构、应用部署与管理、软件交付与协作四大方面。
在接下来的《数字化 IT 从业者知识体系》系列文章,何文强将从软件开发方法、应用技术架构、应用部署与管理、软件交付与协作四个方面,为大家进行逐一分享介绍:
1. 软件开发方法主要包括瀑布、敏捷、精益等;
2. 应用技术架构主要包括微服务架构、服务网格架构、无服务器架构、分布式多运行架构等;
3. 应用部署与管理主要包括但不限于虚拟化技术、容器技术与容器编排等;
4. 软件交付与协作主要包括但不限于 CMMI、ITIL、DevOps 等。
相信该知识体系有利于 IT 从业者构建丰富的技术体系、全面的技术视野和系统的能力建设。欢迎大家前往《数字化 IT 从业者知识体系》话题进行详细阅读。