kubernetes入门到进阶(2)

2023-12-19

被隔离的进程:一起来看看容器的本质

大家好,我们继续来一起学习k8s~

在上一个章节里,我们初步了解了容器技术,在Linux虚拟机里安装了当前最流行的容器docker,还是用了docker ps、docker run 等命令简单操作了容器

广义上来说,容器技术是动态的容器,静态的镜像和远端的仓库这三者的结合,不过,容器这个术语作为容器技术里的核心概念,不仅是大多数初次接触到这个领域的人,即使是一些已经有使用经验的人,想要准确的把握他们的内涵,本质都是比较困难的

那么今天,我们就一起来看看究竟什么是容器(即狭义的,动态的容器)

容器到底是什么

从字面上来看,容器就是container,一般把他比喻成显示世界里的集装箱,它也正好和docker的显示含义相对应,因为码头工人(那只可爱的小鲸鱼)就是不听的在搬运集装箱

集装箱的作用是标准化封装各种货物,一旦打包完成之后,就可以从一个地方迁移到任意的其他地方,想必散装形式而言,集装箱隔离了箱内箱外两个世界,保持了货物的原始形态,避免了内外部相互干扰,极大地简化了商品的存储,运输,管理等工作

再回到我们的计算机世界,容器也发挥着同样的作用,不过它封装的货物是云相中的应用程序,也就是进程,同样也回把进程与外界隔离开,让进程与外部系统互补影响

接下来我们来世界操作一下,来看看在容器里运行的进程是个什么样子

首先,我们使用 docker pull 命令,拉取一个新的镜像---操作系统alpine

[root@mysql-master ~]# docker pull alpine

然后我们使用 docker run 命令运行他的shell程序

[root@mysql-master ~]# docker run -it alpine sh

注意这里我么多加了个-it参数,这样我们就会暂时离开当前的centos操作系统,进入容器内部

现在,让我们执行 cat /etc/os-release ,还有ps这两个命令,最后再使用exit退出,看看容器里与容器外有什么不同

就像这张截图里所显示的,在容器里查看系统信息,会发现已经不再是外面的centos系统了,而是变成了Alpine Linux3.19,再去执行ps命令

可以发现这里是一个 完全干净的运行环境,除了shell,没有其他进程的存在

也就是说,在容器内部是一个全新的Alpine操作系统,在这里运行的应用程序完全看不到外面的centos系统,两个系统被互相隔离了

我们还可以拉取一个ubuntu等任意操作系统的镜像,用同样的方式进入容器内部,然后执行系统的update、install 等命令来看看

这里我就不操作截图了,具体的结果留给大家去操作体会,可以看到容器内是一个完整的操作系统,我们可以在容器内做任何事情,安装应用等等等,无论我们在容器内做什么,都不会影响到我们外部的centos系统(当然不是绝对的)

到这里,我们就可以得到一个初步的结论, 容器,就是一个特殊的隔离环境,它能够让进程只看到这个环境里的有限信息,不能够对外界环境施加影响

那么,很自然的,我们会产生另外一个问题,为什么需要创建样的一个隔离环境,直接让进程在系统里运行不好吗?

为什么要隔离

相信前两年的“口罩”,你对这个隔离这个词不会感到太陌生,为了防止蔓延,我们需要建立方舱、定点医院,把患病的人群控制在特定的区域内,更进一步还会实施封闭小区,关停商场等活动,虽然这些措施带来了一些不便,但是都是为了整个社会更大范围的正常运转

同样的,在计算机世界里的隔离也是出于同样的考虑,也就是 系统安全

对于Linux操作系统来说,一个不受任何限制的应用程序是十分危险的,这个进程能够看到系统里所有的文件,所有的进程,所有的网络流量,访问内存里的任何数据,那么恶意程序就会把系统搞瘫痪,正常程序也可能会因为无意的bug导致信息泄露或者其他安全事故,虽然Linux提供了用户权限控制,能够限制进程只访问某些资源,但这个机制还是比较薄弱的,和真正的隔离需求相差的很远

而现在,使用容器技术,我们就可以让应用程序运行在一个有严密防护的沙盒(sandbox)环境之内,就好像是把进程请进了隔离酒店,他可以在这个环境自由活动,但觉不允许越界,从而保证了容器外系统的安全

另外,在计算机里有各种各样的资源,cpu,内存,硬盘,网卡,虽然目前的高性能服务器都是几十核cpu,上百GB的内存,数TB的硬盘,万兆网卡,但这些资源终究是有限的,而且考虑到成本,也不允许某个应用程序无限制的占用

容易技术的另一个本领就是为应用程序加上资源隔离,在系统里切出一部分资源,让他只能使用指定的配额 ,比如只能使用一个CPU,只能使用1GB内存等等,就好像在隔离酒店里保证一日三餐,但想要吃山珍海味那是不行的,这样就可以避免容器内进程的过度消耗,充分利用计算机硬件,让有限的资源能够提供稳定可靠的服务

所以,虽然进程被关在了容器里,损失了一些自由,但却保证了整个系统的安全,而且只要进程遵守隔离规定,不作出什么出格的事情,也完全是可以正常运行的

与虚拟机的区别是什么

你也许会说,这么看来,容器技术就是常见的沙盒技术中的一种,和虚拟机差不了多少,那么他与虚拟机的区别在哪里呢,又有什么样的优势

在我看来,其实容器和虚拟机面对的都是相同的问题,使用的也都是虚拟化技术,只是所在的层次不通,我们可以参看docker官网上的两张图,把这两者对比起来会更利于学习理解

docker官网的图示其实并不太准确,容器并不直接运行在docker上,docker只是辅助简历隔离环境,让容器基于Linux操作系统运行

首先,容器和虚拟机的目的都是隔离资源,保证系统安全,然后是尽量提高资源的利用率,之前在使用VirtualBox/VMware创建虚拟机的时候,你也应该看到了,他们能够再宿主机系统里完整虚拟化出一套计算机硬件,在里面还能够安装任意的操作系统,这内外两个系统也同样是完全隔离,互不干扰

而在数据中心的服务器上,虚拟机软件(即图中的Hypervisor)同样可以把一台物理服务器虚拟成多台逻辑服务器,这些逻辑服务器彼此独立,可以按需分隔物理服务器的资源,为不同的用户所使用

从实现的角度来看, 虚拟机虚拟化出来的是硬件,需要在上面再安装一个操作系统后才能够运行应用程序,而硬件虚拟化和操作系统都比较重,会消耗大量的CPU,内存,硬盘等系统资源 ,但这些消耗其实并没有带来什么价值,属于重复劳动和无用功,不过好处就是隔离程度非常高,每个虚拟机之间可以做到完全无干扰

我们再来看容器(即图中的docker),他直接 利用了下层的计算机硬件和操作系统,因为虚拟机少了一层,所以自然就会节约CPU和内存,显得非常轻量级,能够更高效的利用硬件资源 ,不过,因为多个容器并用操作系统内核,应用程序的隔离程度就没有虚拟机那么高了

运行效率 ,可以说是容器相比于虚拟机最大的优势,在这个对比图中可以看到,同样的系统资源,虚拟机可以跑三个应用,其他的资源都用来支持虚拟机运行了,而容器则能够把这部分资源释放出来,同时运行6个应用

当然,这个对比图只是一个形象的展示,不是严谨的数值比较,不过我们还可以用手里现有的VirtualBox/VMware虚拟机与docker容器做个简单对比

一个普通的centos虚拟机安装完成之后,体积都是GB级别的,在安装一些应用跟容易就会上到10GB,启动时间通常需要几分钟,我们的电脑上同事运行十来个虚拟机可能就是极限了,而一个centos镜像大小则只有几十MB,启动起来更是非常快,基本上不超过一秒钟,同时跑上百个容器也毫无问题

不过,虚拟机和容器这两种技术也不是互相排斥的,他们完全可以结合起来使用,就想我们的课程里一样,用虚拟机与宿主机的强隔离,然后在虚拟机里使用docker容器来快速运行应用程序

隔离是怎么实现的

我们知道虚拟机使用的是Hyperviser(KVM,Xen等),那么,容器是怎么实现和下层计算机硬件和操作系统交互的呢,为什么他会具有高效清表的隔离特性呢?

其实奥秘就在于Linux操作系统内核之中,为资源隔离提供了三种技术:namespace、cgroup、chroot,虽然这三种技术的初衷并不是为了实现容器,但他们三个结合在一起就会发生奇妙的化学反应

namespace 是2002年从Linux2.4.19开始出现的,和变成语言里的namespace有点类似,他可以创建出独立的文件系统,主机名,进程号,网络等资源空间,相当于给进程改了意见小板房,这样就实现了系统全局资源和进程局部资源的隔离

cgroup 是2008年从Linux2.6.24开始出现的,他的全称是Linux Control Group,用来实现对进程的CPU,内存等资源的优先级和配额限制,相当于给禁成一个小板房加了一个天花板

chroot 的历史则要比前面的两者古老的多,早在1979年的UNIX V7就已经出现了,他可以更改进程的根目录,也就是限制访问文件系统,相当于给进程的小板房铺上了地砖

你看,综合运行这三种技术,一个四四方方,具有完善的隔离特性的容器就此出现了,进程就可以搬进这个小房间,过她的快乐生活了,我觉得用鲁迅先生的一句话来描述这个情景最为恰当:躲进小楼成一统,管他冬夏与春秋

小结:

好了,今天我们学习了容器技术中最关键的概念: 动态的容器 ,再简单小结一下课程的要点:

1-容器就是操作系统里的一个特殊的沙盒环境,里面运行的进程只能看到受限的信息,与外部系统实现了隔离

2-容器隔离的目的是为了系统安全,限制了进程能够访问的各种资源

3-相比虚拟机技术,容器更加轻巧,更加高效,消耗的系统资源非常少,在云计算时代极具优势

4-容器的基本实现技术是Linux系统里的namespace、cgroup、chroot

今天就先写到这里,快下班了,处理下手头的工作, 我下面提问几个问题 ,如果能直接对答出来的话证明学进去了,说不出来的话就还需要再去了解噢,包括上个章节的问题,我一起写在本章节!!!

本章节:

1-你能够对比现实中的集装箱,说出容器技术更多的有点吗?

2-有一种说法:容器就是轻量级的虚拟机,你认为这种说法正确吗?

上一个章节:

1-你对容器技术和docker有什么样的认识和感受?

2-docker engine为什么要设计成客户端/服务器(C/S)架构?他有什么样的好处?

欢迎在留言区留言参与讨论!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kubernetes入门到进阶(2) 的相关文章

随机推荐

  • fedora 38 39 内核编译与安装

    sudo yum install kernel devel ncurses devel openssl 缺包裹自己按上就可以 首先编译内核 make menuconfig 配置界面 在 config 里找到 CONFIG DEBUG INF
  • fedora 通过sysctl.conf配置内核

    linux 一切皆文件 所以配置内核的地方也是文件 需要配置的目录 proc sys 修改文件的地方在 etc sysctl conf 例如 我们配置网络 让icmp包裹停止接收 net ipv4 icmp echo ignore all
  • 充电器如何测试?有哪些测试参数?用电源模块自动化测试系统测试需要哪些步骤?

    充电器测试参数 1 输入 输出电压测试 通过万用表或者其它精密测试设备测量充电器的输入 输出电压测试 检测输入 输出电压是否在规定范围内 以免造成设备损坏 2 输入 输出电流测试 测试充电器的输入 输出电流 确保其符合设计要求 提供稳定的输
  • AMBA协议王者归来:揭秘AHB&APB设计奥秘

    AMBA协议已经成为业界的事实标准 因此在市场上有大量可重用的AMBA兼容IP核 IC工程师掌握这些总线 可以更容易地集成来自不同供应商的IP核 降低开发成本 缩短产品上市时间 AMBA 高级微处理器总线架构 定义了高性能嵌入式微控制器的通
  • Todesk突然高速通道使用已结束

    今天使用Todesk直接报出如下错误 好像对于海外用户需要付费购买海外会员 大家有没有什么可以替换的远程控制软件的吗 能分享一下吗
  • 怎么检测DC-DC电源模块稳定性?电源测试系统测试有什么优势?

    DC DC电源模块稳定性测试 稳定性是衡量DC电源模块的重要指标 电源模块的稳定性直接影响着电源产品和设备的工作稳定性 DC DC电源模块的稳定性 可以通过检测输出电压 输出电流 负载 波形 效率等参数来评估 1 静态测试方法 静态测试是通
  • 搭建电子商务网站建设步骤

    随着目前电子商务网站开发技术的迭代 电商网站的交互设计得到了很大程度的提升 可以认为现在的新型的商城平台都呈现出交互效果 那么电子商务网站建设步骤包括什么呢 电子商务网站建设第一步 网站的规划与设计 电子商务网站算是一个比较复杂的系统 电商
  • 如何在Linux系统中删除文件或目录?

    Linux作为流行的操作系统之一 许多公司和组织都在使用Linux来运行其关键业务和服务 例如谷歌 亚马逊和Facebook等 在Linux中 删除文件和目录是基本操作 那么该如何实现这一功能呢 以下是详细的内容 一 使用命令行删除文件 如
  • 渗透测试报告怎么写?

    1 准备好渗透测试记录 测试记录是执行过程的日志 在每日测试工作结束后 应将当日的成果做成记录 虽然内容不必太过细致 但测试的重点必须记录在案 拟检测的项目 使用的工具或方法 检测过程描述 检测结果说明 过程的重点截图 有结果的画面 2 撰
  • 什么是深度学习的无监督学习与有监督学习

    无监督学习 深度学习中的无监督学习方法是一种训练算法 它在没有标注输出的情况下从输入数据中学习模式和特征 这种方法的核心是探索和理解数据的内在结构和分布 而不是通过已知的输出来指导学习过程 无监督学习在深度学习领域有许多不同的形式和应用 以
  • binlog日志,二进制日志的简介

    binlog的bin就暴露了他是二进制的文件 你用vi或者vim是没办法读的 得用专门的方式 比如mysqlbinlog工具 那么binlog其实只要了解几点应该就足够了 Q 首先 binlog记录的是啥呢 A 记录的是数据库的修改过程 注
  • 2023_Spark_实验二十八:Flume部署及配置

    实验目的 熟悉掌握Flume部署及配置 实验方法 通过在集群中部署Flume 掌握Flume配置 实验步骤 一 Flume简介 Flume是一种分布式的 可靠的和可用的服务 用于有效地收集 聚合和移动大量日志数据 它有一个简单灵活的基于流数
  • 2023_Spark_实验二十九:Flume配置KafkaSink

    实验目的 掌握Flume采集数据发送到Kafka的方法 实验方法 通过配置Flume的KafkaSink采集数据到Kafka中 实验步骤 一 明确日志采集方式 一般Flume采集日志source有两种方式 1 Exec类型的Source 可
  • 线性连续控制系统

    线性连续控制系统 可以用线性微分方程表示 形式为 上式中 是被控制量 是系统的输入量 线性定常连续系统 当系数 和 常数时 称为定常系统 线性时变连续系统 当 和 随时间变化时 称为时变系统 线性定常连续系统按照输入量 的变化规律不同 又分
  • PyCharm中缓存有何作用?如何清理?

    在使用pycharm开发软件的过程中 我们经常会遇到卡顿 运行慢等问题 这时第一应对措施就是清理缓存 从而提高效率 那么pycharm如何清理缓存 以下是常用方法介绍 PyCharm缓存的作用 在使用PyCharm进行开发时 PyCharm
  • 推动行业未来的八个数字化转型趋势

    根据 Gartner 最新估计 在2023 年 已有40 的组织把虚拟体验与物理体验结合起来 以提高员工生产力和客户覆盖范围 而到 2024 年 工业企业将通过将自我管理技术与重新设计的运营流程相结合 将运营成本降低 30 到 2025 年
  • 低代码助力全栈开发

    目录 低代码功能展示 1 拖拽式 UI 组件 2 更快的开发速度 3 敏捷原型设计 4 与数据库集成 低代码开发工具正变得日益强大 它正不断弥合着前后端开发之间的差距 对于后端来说 基于低代码平台开发应用时 完全不用担心 前端的打包 部署
  • JavaOOP篇----第三篇

    系列文章目录 文章目录 系列文章目录 前言 一 标识符的命名规则 二 instanceof关键字的作用 三 什么是隐式转换 什么是显式转换 前言 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网
  • Linux中动态路由协议有哪些?

    Linux动态路由是一种在Linux操作系统中实现动态路由的机制 动态路由是指路由器能够根据网络的变化自动更新路由表 以实现更高效的数据传输 在Linux中 动态路由可以通过配置路由规则来实现 那么Linux中动态路由协议有哪些 以下是具体
  • kubernetes入门到进阶(2)

    被隔离的进程 一起来看看容器的本质 大家好 我们继续来一起学习k8s 在上一个章节里 我们初步了解了容器技术 在Linux虚拟机里安装了当前最流行的容器docker 还是用了docker ps docker run 等命令简单操作了容器 广