同一个容器实例可以同时运行在多个宿主机_从零开始学K8s: 3.什么是容器

6655bdfc4688903155ae2f29e0bbef4f.png

Kubernetes使用Linux容器技术来实现应用的隔离。因此在深入学习k8s之前,我们需要先学习容器的基础知识以便更好地去理解k8s的原理机制。

揭开容器的神秘面纱

当一个应用只由较少数量的大组件构成时,完全可以给每个组件分配一个专用的虚拟机,以及通过给每个组件分配它自己的操作系统实例来隔离它们的环境。

但是当这些组件变得越来越小且数量变得越来越多时,就不能给每个组件分配专用的VM,除非你不想节约硬件资源、降低硬件成本。但是硬件资源只是一方面,每个VM通常还需要独立配置和管理,想象一下有大量的虚拟机等着你去配置和管理时你会是什么心情。这不仅是力资源的浪费,还会让系统管理员的工作变得更加高负荷。

利用Linux容器技术隔离应用组件

越来越多的开发人员开始转向Linux容器技术,而不是使用虚拟机来隔离每个微服务环境(或者通常说的进程)。容器技术使我们能够在同一台宿主机上运行多个服务,不仅为每个服务提供不同的环境,还将它们彼此隔离,就像虚拟机一样,但是需要的开销更小。

容器中运行的进程实际上还是在宿主机的操作系统上,跟其他进程没啥区别,不像虚拟机,进程是运行在不同的操作系统上的。但是需要注意的是,容器中的进程仍然是与其他进程隔离的。对于进程本身而言,看起来就像是机器和操作系统上运行的唯一进程。

虚拟机 VS 容器

与虚拟机相比,容器更加轻量级。同样的硬件情况下,基于容器,我们可以运行更多的应用组件。这主要是因为虚拟机还需要运行它自己的一组系统进程,这些进程需要额外的计算资源,而且应用本身所在的进程也需要消耗资源。而对于容器来说,其本身实际上就是一个运行在宿主机上被隔离的进程,只消耗应用本身需要消耗的资源,再无任何其他进程的开销。

比较尴尬的情况是,由于虚拟机比较耗资源,导致没有足够的资源为每个应用程序分配一个专用的虚拟机,我们最终可能会将多个应用分组部署到每个虚拟机内。当使用容器时,我们可以而且应该为每个应用分配一个容器。因此,在同一台裸机上可以运行更多的应用程序。

bf6f5245c1b4791396d3be2ef4127dba.png

当在一台主机上运行三个虚拟机的时候,你就拥有了三个完全隔离的操作系统,它们运行并共享一台裸机。宿主机操作系统和一个虚拟层(Hypervisor)位于这些虚拟机下面,这个虚拟层会将物理硬件资源分成一些更小块的虚拟资源,从而被每个虚拟机内的操作系统使用。应用程序在虚拟机中运行,会调用虚拟机操作系统内核程序,然后内核程序会通过Hypervisor在宿主机的物理CPU上执行x86指令。而多个容器则会对运行在宿主机操作系统上的同一个内核执行调用,该内核是唯一一个在宿主机CPU上执行x86指令的内核。通过使用容器技术,CPU不需要做任何虚拟化,而虚拟机是需要对CPU做虚拟化的。可以通过下图了解应用程序在虚拟机或容器中使用CPU方式的差异:

239ae732f4eb67a519bddf736d26d8c9.png
69b1ce699d8a222af83c3a3bd309247c.png

虚拟机的主要优点是提供了一个完全隔离的环境,因为每个虚拟机都运行在自己的Linux内核之上,而容器都是调用同一个内核,这显然是有安全隐患的。硬件资源有限的情况下,如果需要隔离的进程不多,使用虚拟机可能是一个选择。然而如果要在同一台机器上运行更多相互隔离的进程的话,容器技术才是更好的选择,因为它开销更少。需要注意的是,每个虚拟机都会运行它自己的一组系统服务(也即进程)而所有的容器是不会的,因为它们都运行在同一个OS之上。这就意味着运行一个容器是不需要像虚拟机那样还要先开机。容器上的进程是可以很快就可以被启动起来的。

容器隔离机制

可能你会好奇,容器是怎么对运行在同一个操作系统上的进程进行隔离的呢。这里就不得不提到两个机制。第一个就是Linux的命名空间(Namespace)

它可以确保每个只能看到它自己的系统视图(文件、进程、网络接口、主机名等等)。第二个是Linux控制组(cgroups),它限制了进程可以使用的资源量,包括CPU、内存、网络带宽等等。

命名空间

5c86e3c620e84fdf0fc17cb824553594.png

默认情况下,每个Linux系统初始化的时候只有一个命名空间。所有的系统资源,比如文件系统、进程ID、用户ID、网络接口以及其他资源都是属于这个命名空间。但是我们也可以创建额外的命名空间以及在它们之间分配资源。对于一个进程,我们可以选择让其在某一个命名空间下运行,该进程就只能看到这个命名空间下的资源视图。不过,命名空间是有多种类型的,一个进程并不是属于某一个命名空间,而是属于每种类型的一个命名空间,因此一个进程可能属于多个命名空间,只是这些命名空间是不同类型的。

命名空间的种类有如下几种:

  • MNT: 管理系统文件挂载点 (MNT: Mount)
  • PID: 进程隔离 (PID: Process ID)
  • NET: 管理网络接口 (NET: Networking)
  • IPC: 管理对IPC资源的访问 (IPC: Inter-Process Communication)
  • UTS: 隔离内核和版本标识符 (UTS: Unix Timesharing System)
  • User ID (user)

每一种命名空间被用来隔离一组特定的资源。例如,UTS命名空间就决定了运行在该命名空间下的进程所能看到的主机名和域名。通过给两个进程指定两个不同的UTS命名空间,能够使它们看到不同的本地主机名。换句话说,对于这两个进程来说,就好像运行在两个不同的机器上(至少就主机名来说是这样)。

同样的,一个进程属于什么网络命名空间决定了运行在进程中的应用程序所能看到的网络接口。每个网络接口属于一个命名空间,但是可以从一个命名空间转移到另一个命名空间。每个容器使用它自己的网络命名空间,因此每个容器看到的都是属于它自己的一套网络接口。现在我们应该明白命名空间是如何被用来隔离运行在容器中的应用。

cgroup

还可以通过cgroups来限制容器能够消耗的资源来实现进程的隔离。cgroups是Linux的一个内核功能,它可以限制一个进程或者一组进程的资源使用。一个进程的资源(CPU、内存、网络带宽等等)使用量不能超过分配给它的量。通过这样方式,进程就不能过度地使用为其他进程保留的资源,这就和每个进程运行在单独的机上上类似。

如果想了解关于cgoups的知识,可以参考:

https://tech.meituan.com/2015/03/31/cgroups.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

__str__是什么函数_PHP str_shuffle()函数与示例

__str__是什么函数PHP str_shuffle()函数 (PHP str_shuffle() Function) str_shuffle() function is a string function and it is used to shuffle all characters randomly in the string. str_shuffle()函数是一个字符串函数,用于随机地随机排列字符串中的所有字…

SpringBoot集成RabbitMq消息队列【附源码】

1. 项目背景 要啥项目背景,就是干!!! SpringBoot版本:2.7.12 2. Rabbit MQ安装 这里讲解使用docker安装RabbitMQ,如果在windows下面安装RabbitMQ,参考下文 【笑小枫的按步照搬系列】Window…

【云栖直播】精彩推荐第3期:个性化推荐系统搭建实践

热门推荐 (1)即将直播持续集成与交付:分层自动化之UI自动化体系建设直播简介:本系列直播由阿里旗下一站式研发提效平台云效策划推出,主要为大家详细介绍阿里巴巴在持续集成和持续交付的最佳实践。 直播讲师&#xff1a…

全国计算机等级考试和cct区别,全国计算机等级考试(NCRE)和CCT的区别你了解多少?...

在大学,很多学生都在纠结,到底学什么技能在以后的就业中能够提升自己的核心竞争力。在众多等级考试中,全国计算机等级考试可以说是相对热门的考试。关于计算机等级考试,一共有两种,一类是全国高等学校计算机水平考试(C…

ensp路由器无法启动_品胜云路由器Breed刷入详细教程,技巧和注意事项,功能大增...

前面发文,介绍过品胜净音云路由器WFR101N功能,硬件配置参数,高清拆解图。主要硬件参数:闪存型号是W25Q128FVSG,容量大小是16M;内存是华邦的W9751G6KB-25,DDR2 SDRAM内存,大小64M&…

第二个冲刺期的第六天

昨天写好了购物车的功能; 今天决定开始写下订单的功能; 明天的话继续写下订单的功能; 遇到的问题:由于购物车是用session实现的,所以生成订单的话会遇到一些问题,比如说订单条目往数据库的写入。 &#xff…

chunk_split_PHP chunk_split()函数与示例

chunk_splitPHP chunk_split()函数 (PHP chunk_split() function) chunk_split() function is used to split the given string into chunks of small parts, it accepts the string returns the parts of the strings specified by the other parameters. chunk_split()函数用…

对计算机视觉研究的认识,计算机视觉(作业)

视觉是各个应用领域,如制造业、检验、文档分析、医疗诊断,和军事等领域中各种智能/自主系统中不可分割的一部分。由于它的重要性,一些先进国家,例如美国把对计算机视觉的研究列为对经济和科学有广泛影响的科学和工程中…

map函数python求数的每位的值_map函数_实现批量计算

作者Toby,持牌照消费金融模型经理,发明国家算法专利,国内最大医药数据中心数据挖掘部门负责人!和重庆儿科医院,中科院教授,赛柏蓝保持慢病数据挖掘项目合作!清华大学,百度,腾讯&…

Flask 视图

写个验证用户登录的装饰器:在调用函数前,先检查session里有没有用户 from functools import wraps from flask import session, abortdef login_required(func):wraps(func)def decorated_function(*args, **kwargs):if not user in session:abort(401)r…

wps计算机打印双面输出,在wps中双面打印的方法步骤详解

我们在打印word文档的时候往往都会使用到双面打印,那么今天小编教你怎么在wps中双面打印。希望对你有帮助!WPS双面打印的步骤首先点击wps上的文字选项。找到打印按钮。点击打开之后,会跳出这样一个页面。PS双面打印的步骤图1页面内&#xff0…

PHP array_merge()函数与示例

PHP array_merge()函数 (PHP array_merge() function) array_merge() function is used to merge two or more arrays, it returns a new array with merged elements. array_merge()函数用于合并两个或多个数组,它返回一个具有合并元素的新数组。 Syntax: 句法&am…

linux pwm 调屏_Linux驱动学习之:PWM驱动

PWM(Pulse Width Modulation)——脉宽调制,它是利用微控制器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量、通信、功率控制与变换等许多领域。s3c2440芯片中一共有5个16位的定时器,其中有4个定时器(定时器0~定时器3)具…

2019聊大考研计算机调剂,2019年聊城大学硕士研究生预调剂工作说明

教育部2019年分数线与招生计划尚未确定,根据往年分数线与报考情况,现将我校2019年硕士研究生预调剂工作说明如下:一、调剂要求:(一)只接受学历为本科的考生调剂,应届本科生优先;(二)初试成绩达到报考专业与拟调剂专业教育部A区分数…

SylixOS磁盘高速传输

SylixOS管线模型分析前文主要介绍了SylixOS中的块设备CACHE管理,本章主要介绍磁盘高速传输。在CAHCE回写中SyilxOS采取了两种方式,即直接回写和多管线并发回写。并发写管线通过多线程并发处理CACHE提交的写请求,实现磁盘高速传输。SylixOS中通…

kotlin int最大值_Kotlin程序查找三个数字中的最大值

kotlin int最大值Input 3 integer numbers, we have to find the largest of these input numbers. 输入3个整数,我们必须找到这些输入数字中最大的一个。 Example: 例: Input:First number: 10Second number: 20Third number: 30Output:Largest numbe…

计算机社团活动展望未来,社团展望未来寄语简短,如何写社团未来计划

呵呵,你不会是社团的会长吧,不会写这个的话说不过去了,而且没有你想象的那么复杂,有条理,分类的写下去就可以了,但这里不要太多的口水话!再者你可以去问一下其他社团的负责人的!&…

判断五个分数等级划分_压力表精度等级怎么算?压力表精度等级划分及检验项目...

压力表是一种典型的轴向精密压力表,是用来测量介质压力的仪表,在工业生产也是常用的仪表,对生产起到了非常重要的作用,压力表的所显示压力的精度,就成了我们非常重要的一个参数。今天小编就来为大家说说压力表精度等级…

stl make_heap_通过使用make_heap()创建堆| C ++ STL

stl make_heapWhat is Heap Data structure? 什么是堆数据结构? Heap is a tree-based which is used for fast retrieval of largest (max heap) or smallest (min heap) element. This DS is used in the priority queue, prims algo, heap sort and many more.…

cad安装日志文件发生错误_苹果电脑Mac os系统重装时出现“准备安装时发生错误”解决方案...

题外话:自己是个电脑小白,因为自己的MacBook Air 不那么流畅了,就按照其他知乎大佬们说的步骤进行重装电脑。(2017款 MacBook Air 以下就用Air代替) 自己先把电脑重新启动,按照步骤按住commandR&#xff0c…