首页 > 其他分享 >从容器的发展历史理解容器的本质

从容器的发展历史理解容器的本质

时间:2023-12-25 12:35:49浏览次数:29  
标签:容器 隔离 Kubernetes 本质 CCE 理解 LXC 进程

本文分享自华为云社区《容器化学习——从容器的发展历史理解容器的本质》,作者:breakDawn 。

近期工作上开始接触了相关容器化的内容,因此整理学习了一堆有关容器化的知识,特此进行分享。

首先,理解K8S和容器,首先需要学习以下它的发展历史,才能逐步理解容器的意义和作用。

阶段一:隔离文件——chroot命令的诞生

在1979年,Unix系统引入了一个革命性的命令,它允许系统管理员将进程的根目录锁定在指定的位置,从而有效地限制了该进程访问的文件系统范围。这个命令成为了早期容器技术的基石,因为它实现了基本的文件系统隔离,确保进程不能访问其指定根目录之外的任何文件或目录。

这种隔离能力对于安全性至关重要,特别是在监控潜在的恶意活动时。通过创建一个隔离的环境,或所谓的“黑盒”,系统管理员能够更安全地运行和监控可疑的代码或程序。

因此这个以文件形式进行隔离的命令为现代容器技术奠定了一个重要的思想基础:隔离。 后续的很多演变也都是基于“隔离”进行变化。

阶段二: 隔离访问——namespace名称空间

在2002年,Linux社区迎来了一个重要的里程碑:引入了Linux名称空间(namespace)功能。

名称空间是一种轻量级的虚拟化技术,它允许不同的进程拥有自己的独立视图,包括文件系统、进程ID(PID)、用户ID(UID)、网络接口等关键系统资源。

因此每个进程都在一个独立的环境中运行,这意味着在一个名称空间中所做的更改(例如文件系统的修改、网络配置等)不会影响到其他名称空间。
这种隔离不仅提高了系统的安全性,因为它限制了进程可能造成的潜在影响,也使得多个应用能够在同一个物理服务器上同时运行,而互不干扰。

在容器化的上下文中,名称空间提供了实现容器隔离的关键技术。因为每个容器实际上就是一组不同的名称空间和一些其他资源(如下文提到的cgroups)的集合。

阶段三: 隔离资源——Cgroups控制组特性

Cgroups(控制组)是Linux内核的一个特性,最初由Google工程师Paul Menage和Rohit Seth在2006年提出。
它通过将进程分组,并对这些分组进行资源控制和隔离,从而允许系统管理员精确地控制和限制进程组使用的资源量,如CPU时间、系统内存、网络带宽或磁盘I/O等。通过这种方式,能够有效避免一个进程出现问题把同机器上的其他进程的资源耗尽或占用, 成为了实现资源隔离和保证系统稳定性的强大工具。

因此Linux的cgroups是现代容器技术中不可或缺的一部分,它提供核心的资源隔离和限制的底层实现原理。

阶段四: 封装系统——LXC虚拟化(Linux Containers)

lxc是linux发布的系统级虚拟化功能。它允许用户在同一宿主机上运行多个隔离的Linux系统实例。每个实例,或称为容器,都拥有自己的文件系统、网络配置和进程空间,但与传统虚拟机相比,LXC容器共享宿主机的内核,使得它们更为轻量级和高效。

lxc的理念在于封装系统,这意味着每个LXC容器都运行着完整的操作系统,包括其所有的服务和进程。

缺点在于每个LXC的体积相当大,当系统内的部件需要修改,必须重写很多配置,导致维护和更新过程相对繁琐和耗时。

基于LXC的缺点,有了相应改进,才有了后面Docker容器的诞生和迅猛发展。

阶段五: 封装应用——Docker容器

Docker的容器化能力直接来源自lxc。后面Docker的开发人员又自己用go语言开发了libcontainer避免了对lxc的强依赖。

对比于LXC, Docker容器的理念在于封装应用。容器通常只包含运行单个应用所必需的最小环境,这使得它们非常轻量级和快速。当应用或其依赖需要更新时,只需修改有关部分并重新构建容器,这通常可以在几秒钟内完成。

除了轻量化以应用为中心的构建外,docker对比LXC还有以下七点优势

  • 跨机器的绿色部署: 将所有环境依赖打包到一起,避免对机器的依赖。
  • 自动构建: 无需关注目标机器具体配置,使用任务构建工具在容器中自动构建。
  • 多版本支持: 支持git一样管理容器版本。
  • 组件重用, 可以在基础镜像上构建专业化镜像。
  • 共享,有公共的镜像仓库。
  • 工具生态可以很方便扩展。

但Docker并不是没有缺点。由于它主要关注应用层,这就需要开发者和系统管理员对应用的依赖和环境有深入的了解,以确保在不同环境中一致性和安全性的维护。

阶段六:封装集群——kubernetes

k8s(kubernetes)是容器编排框架, 把大型软件系统运行所依赖的集群环境也进行了另一种形式的虚拟化,令集群得以实现跨数据中心的绿色部署,实现自动扩缩。

可以用一个例子来理解k8s和docker之间的关系:

Kubernetes 则相当于餐厅的经理,负责整体的流程和调度。它确保所有菜肴(容器)都能按时准备好,并且根据顾客的需求(负载)来增减特定的菜肴数量。比如,如果一道菜特别受欢迎,Kubernetes可以指示厨房(集群)制作更多的这道菜(即扩展容器)。如果某个炉子坏了(节点故障),它会将菜肴分配到其他炉子上(重新调度容器)。

按工程语言描述,Kubernetes负责管理由这些容器组成的应用集合,确保它们按预期方式运行。它处理部署、替换故障容器、服务发现、负载均衡、扩展和缩减容器数量等任务。

虽然k8s最开始完全绑定依赖docker, 但通过引入容器运行时接口(Container Runtime Interface, CRI), 允许 Kubernetes 与多种容器运行时兼容,如CRI-O、containerd等, 因此Kubernetes 能够更加专注于其核心目标:集群场景下的容器编排,并成为了

从容器的发展历史理解容器的本质_Docker

阶段七:封装容器服务——基于云服务的容器化(CCE)

对于传统本地搭建K8S集群而言,具有以下劣势:

  • 高成本: 自行搭建和维护Kubernetes集群需要大量的前期投资,包括硬件、网络设施等。
  • 复杂性: 搭建和维护一个高效、稳定的k8s环境需要深厚的技术知识和经验。
  • 维护负担: 需要持续投入人力去管理和维护硬件、软件、网络等。
  • 缩放困难: 根据业务需求快速扩展或缩小资源可能会非常复杂和耗时。在业务初期发展阶段,纯靠经验很难快速覆盖各种缩放场景。

因此随着云计算的普及和成熟,容器化技术也开始步入云服务时代。这一时期,云服务提供商纷纷推出了各自的容器服务产品,如华为云的CCE(云容器引擎)服务等, 企业和开发者也越来越多地转向云平台来部署和管理容器应用,享受云计算带来的灵活性、可扩展性和成本效益。

通过使用云服务提供的容器化能力,可以做到:

  • 简化管理: 云服务提供商通常提供易于使用的管理界面和API,简化了集群的搭建、管理和扩展。
  • 快速部署: 可以在十几分钟内就能启动和配置一个完整的k8s环境。例如通过CCE快速入门,我们可以快速熟悉容器创建的整个过程。
  • 自动扩缩容: 云服务通常提供自动扩缩容功能,根据实际负载自动调整资源。比如CCE的弹性伸缩,可以从工作负载和节点两个维度进行伸缩。CCE弹性伸缩概述

同时我们能够见到的各种云服务也会依赖CCE云容器引擎的能力快速构建基础核心能力,例如大数据或AI等服务也可以利用CCE的高度可扩展性和弹性来处理海量数据,支持复杂的数据处理和分析任务。

总结

可以看到,随着时间的推进,容器化技术经历了丰富的演变过程,从早期的简单隔离到如今的云服务时代,每一个阶段都为信息技术领域带来了深远的影响,也是对市场需求快速响应的结果。

因此随着技术的不断进步和创新,相信容器化会继续引领软件行业的发展,推动更多创新应用的诞生。

点击关注,第一时间了解华为云新鲜技术~

标签:容器,隔离,Kubernetes,本质,CCE,理解,LXC,进程
From: https://blog.51cto.com/u_15214399/8965579

相关文章

  • 从容器的发展历史理解容器的本质
    本文分享自华为云社区《容器化学习——从容器的发展历史理解容器的本质》,作者:breakDawn。近期工作上开始接触了相关容器化的内容,因此整理学习了一堆有关容器化的知识,特此进行分享。首先,理解K8S和容器,首先需要学习以下它的发展历史,才能逐步理解容器的意义和作用。阶段一:隔离文......
  • 深入理解Python http包:构建HTTP服务与客户端
    Python作为一门强大的编程语言,其标准库中包含了丰富的模块,用于应对各种编程需求。在网络编程领域,http是一个值得关注的包,尤其适用于开发HTTP服务器和客户端。本文将深入探讨http包的核心模块http.server和http.client,并通过示例来展示如何使用这些模块构建简单的HTTP服务及客户端交......
  • 性能测试:通过简单的例子理解并发量,线程数,吞吐量,TPS
    看个简单的例子①老王开了家餐厅我们的主角老王,在M市投资新开业了一家,前来用餐的顾客络绎不绝:餐厅里有4种不同身份的人员: 用户一次完整的用餐流程如下:1.顾客到店小二处付款点餐  =>  2.小二将订单转发给后厨  =>  3.后厨与备菜工配合,取材完成烹饪后交给小......
  • 饮冰十年-人工智能-FastAPI-01- 深入理解 Python 协程
    Python协程是一种强大的异步编程工具,可以有效地处理并发任务,提高程序性能。在这篇博客中,我们将深入探讨协程的概念、用法以及如何在Python中使用它们。一、什么是协程协程定义协程(Coroutine)是一种特殊的函数,它可以在执行中暂停并在稍后的时间点继续执行。这种能力使得我们能......
  • 深入理解串口通信原理及应用
    串口通信作为一种异步串行通信方式,被广泛地应用在计算机与外部设备之间的数据交互上。本文将详细介绍串口的工作原理、数据格式、通信协议、常见应用等内容。一、串口通信原理串口通信是利用串行通信协议在计算机与外部设备之间进行异步通信的一种技术。串行通信是按照时间顺序,按......
  • 人工智能入门实战:推荐系统的理解与实践
    1.背景介绍推荐系统是人工智能领域的一个重要分支,它涉及到大量的数据处理、算法优化和用户体验设计。在当今的互联网时代,推荐系统已经成为了各种在线平台的核心功能,例如电子商务网站、社交媒体、新闻推送等。随着数据量的增加和用户需求的多样化,推荐系统的复杂性也不断提高,使得研究......
  • C++ Qt开发:使用顺序容器类
    当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念。顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构。它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的平衡。Qt中提供了丰富的容器类,用于方便地管理和操作数据。这些容器......
  • C++ Qt开发:使用关联容器类
    当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念。顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构。它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的平衡。Qt中提供了丰富的容器类,用于方便地管理和操作数据。这些容器......
  • C++ Qt开发:字符串QString容器
    在Qt框架中,QString是一个强大而灵活的字符串容器,专为处理Unicode字符而设计。它提供了许多方便的方法来操作和处理字符串,使得在跨平台开发中能够轻松地进行文本操作。QString是Qt开发中不可或缺的一部分,它的灵活性和强大的功能使其成为处理文本和字符串操作的理想选择。本篇......
  • Go编程基础教程:Go容器化技术
    作者:禅与计算机程序设计艺术1.背景介绍目前互联网服务开发已经从单体应用模式升级到微服务架构模式。在微服务架构模式下,服务之间会相互调用,为了更好地管理和调优这些分布式系统,需要对其进行容器化,使得各个服务可以独立部署、资源分配、隔离等方面更加灵活高效。本文将通过Go语言......