容器技术基础(一)|学习笔记

开发者学堂课程【现代应用容器技术快速入门:容器技术基础(一)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/830

容器技术基础(一)

------马永亮


目录:

一、课程简介

二、容器技术基础

三、容器技术


一、课程简介

由阿里云、Linux开源软件学园和那个教育联合推出

★“CNCF×Alibaba云原生技术公开课”的前置课程

★CKAD/CKA/CKS认证配套课程

内容涵盖

★手把手实践Kibernetes云原生操控系统

★阿里云Kibernetes托管服务ACK

二、容器技术基础

 容器技术基础(一)|学习笔记

目前来说应用程序的部署环境大体上分为三种:主机、虚拟器、容器化的作用,无论是哪一种,主机上通常都是运营的某一系统,现在的计算机系统多数情况下都是为了运行多人物,甚至是支持多用户的,那么底层用户资源向多个进程进行有效分配,需要一个计算机系统来负责完成。

所以现代的计算机系统都有两个不同的的、分离的区域,成为用户空间和内核空间;

内核充当用户空间和硬件的中间层,负责进程调度、内存管理、中断处理等,对系统资源具有完全的控制权;

用户空间通过“系统调用”与内核通信,系统调用通过API向应用程序提供系统级服务。容器技术基础(一)|学习笔记

事实上,也可以通过专用的软件模拟或者虚拟技术,将这一个独立的主机硬件给他虚拟化。

 

虚拟化技术

通过专用软件模拟或/和虚拟技术,将多个主机硬件虚拟为独立、完整且隔离的不同单元,每个单元可以作为一个主机被使用,这个用于帮忙把底层的硬件所提供的各种资源计算资源给虚拟,或者模拟出多组互相隔离的这种软件,就称之为虚拟机监视程序或称之为虚拟化软件

这个专用软件称为VMM,即虚拟机监视程序;

根据VMM运行的位置不同,可以将虚拟化技术划分为两种类型:

 ◆直接运行于硬件之上:类型1虚拟化技术

 ◆运行于操作系统之上:类型2虚拟化技术

不管是哪一种虚拟化技术他们最终都将能够提供一个接口,这个接口允许用户去管理VM的生命周期。

每个虚拟机直接暴露硬件接口虚拟化技术

◆有独立的内核空间和用户空间

◆跨虚拟机的进程之间完全隔离

◆资源开销较大,半虚拟化技术有助于降低开销

由于两个虚拟机之间互相隔着内核儿,而每一个虚拟机都有自己独立的内核儿,所以彼此之间并不会产生任何一人的干扰,如果我们不考虑较为底层的这个Hypervisor级别的资源分配的话,最终应用程序的一每一个虚拟机之上的应用程序的运行最终还是要靠底层的硬件设备来支持,所以他们的请求无论如何,无论是被其所在虚拟机的内核儿如何处理的,最终还是要交由哈Hypervisor,甚至还要交由底层的host OS就是宿主机的操作系统。


容器技术基础(一)|学习笔记

什么虚拟化技术呢,可以理解为就是资源开销有点大,所以后来就出现了各式各样的准虚拟化,或者称为叫半虚拟化技术及para virtual的机制来实现,来减少这种性能开销来,增强系统的资源利用利用率,但是比较主流的虚拟化技术像vmware workstation、vmwserver 、vmware、vsphere等等解决方案也包括开源的主流产品中的KVM内核虚拟化还有ten等一系列的虚拟化技术,他们分别支持各种各样的不同特性,由于诞生的时期不同,对于底层硬件的要求也各有不同,事实上在十年前开始流行起来了,Issa云的虚拟化技术(云计算技术)当中,基本上对应的都是以KVM或者ten或者是其他的虚拟化技术作为底层运行虚拟机的核心,而后额外额外提供了一套集群级别的操作系统来实现在集群及统一管理容器统一管理虚拟机的生命周期来实现的,因而迄今为止,这仍然是一种主流的虚拟化技术,但是考虑到这种主流化的虚拟化技术过于消耗资源,后来人们就开始探索一种轻量的虚拟化技术,到今天为止,落地的结果就是容器技术。

三、容器技术

1、概念:他是类似于虚拟化技术,只不过他的软件的主要目的不是将宿主机的硬件进行虚拟化,或者说不是相对应的应用程序提供硬件级的虚拟化接口,而是将宿主机的操作系统所提供的用户空间隔离为多个用户空间,使得每一个用户空间就好像自己是唯一运行在该内核之上的用户空间一样,进而完成了类似于前面我们所提到的这种虚拟化机制,只不过每一个独立而隔离的空间,它由于被底层的container runtime,或者被容器引擎所输出的不是主机级的接口,而仅仅是内核机接口,所以这里虚拟出来的这个级别是操作系统的虚拟接口,由此以来就减少了传统的主机级虚拟化两级内核,至少是类型2内核,但是最终还是由Hypervisor来进行调度完成的。

借助于称之为“容器运行时”的软件技术,在同一个内核之上生成多个彼此隔离的用户空间

 ◆个和用户空间可独立管理运应其内部进程

 ◆每个用户空间“自以为”独占该内核及硬件资源

需要将内核级的共享资源进行隔离

 ◆依赖于内核中称为“名称空间”的技术进行

  ★名称空间是Linux内核特性,用于隔离部分系统资源,从而使得进程仅可访问同一名称空间中的相应资源

资源限制则依赖于由Google贡献的“CGroups”。

事实上名称空间仅仅能够创建和支持隔离的多个名称,多个用户空间就类似于模拟出来的多个用户空间,但是每一个用户空间中的进程则很有可能请求和消耗掉其内核管理之下的所有硬件资源,因此为了避免某一用户空间或者某一个usb中的所有进程耗尽大部分硬件资源,可以借助于CGroups将硬件资源或计算能力存储能力io能力等等,按特定的比例,或特定的量来向不同的用户空间进行分配。

所以说现代的这个Linux的容器技术,就是要强依赖一个Linux内核的名称,空间和CGroup来实现的,事实上容器技术其实也就是Linux内核天然就已经支持和具备的技术。

2、Linux内核支持的名称空间

容器技术基础(一)|学习笔记

其实这的内核,支持大约八种名称,名称空间早期的版本或者是我们现在在很多系统上看到的,很多材料上看到的都是支持六个名称空间,但事实上较新版本的内核又增添了两种用户空间的支持也就是名称空间的支持。

第一个叫Mount,他用来隔离挂载点和文件系统,事实上,这也是最早支持的叫做名称空间技术,以至于他自己就直接称呼自己就是名称空间,叫ns space的简写,很有可能这个时候的Linux内核的维护和开发者并没有意识到,后来很多其他资源资源也需要在名称、空间、级别实现隔离。

后来到Linux内核发展到2.6.19以后,正式引入了另外两个名称空间,分别叫UPS和IPC,其中,UPS是用来提供独立的主机名和NS域名儿的。这就是有了这样一个UPS的支持以后,如果创建名称空间时,或者创建用户空间时调用了这个标志,用UPS和用IPC的话,这就意味着每一个用户空间可以看到不同的主机名。而且还和可以看到一个彼此之间在同一个用户空间的进程之间,可以通过思维的SysV IPC的metals互相通信,但跨每一种空间是被隔离的。

接着内核发展到2.6.24的时候,PID也被引入了名也的名称空间也被引入内核,从而每一个用户空间

在2.6.29以后,网络名称空间引入内核,而这个时候,每一个用户空间可以自己直接使用一个独占的网络名称空间,进而能够使用看上去独占的网络设备、协议栈和端口分配等。

3.8引入了User ID和Group ID名称空间(user名称空间),从而能够实现User ID和Group ID的隔离。这就使得某一个容器当中看上去有一个Root用户,它能够在该名称空间当中具有所有的管理权限,但它输入机级别并没有,所以我们可以理解为你模拟出来用户空间的根用户就是Group和其他普通用户的这么一个名称,空间技术。

Linux内核发展到了4.6版本以后,引入了Cgroup名称空间,它的主要作用在于为Cgroups实现资源分配的或者资源指派的一个技术。Cgroups也是采用了类似于文件系统一样的层级结构的Cgroup名称空间,就是为Cgroups的跟用户提供根目录的或者对相关层级结构的管理的。

接着Time这一名称空间是内核5.6版本才新进引入的,他能够实现为Boot time和Monotonic time提供隔离的空间。其monotonic  time是一个单调递增,其实它就是为操作系统计时的,我们可以理解为该用户空间创建以后,将一直持续的单调递增的方式进行计时,但是系统一旦进入休眠状态的话,这个时候他的相关技术是不计入的,可以理解为它专用于记录该系统正常运行,或者该用户空间正常运行了多长时间,Boot time类似于Monotonic time,但不同之处在于会计入系统休眠时间,也就意味着在休眠那一刻开始到休眠结束所中间经历的这些时间,它也会通过计算并加到这个对应的累加器,然后Linux内核所制的名称贡献,随着名称空间技术的越来越丰富,Linux本身对于容器技术的支持越来越完善。

3、名称空间和Chroot

1979年,Chroot系统调用被添加到Unix系统中,用于为开发人员提供一个独立于根文件系统的测试平台;

 ◆借助于Chroot,开发人员可以更改进程及其子进程的根目录;

 ◆如下图,文件系统被分为两个部分,他们相互之间并不影响

容器技术基础(一)|学习笔记

Linux引入了新的子系统和系统调用来改进进程隔离机制

 ◆名称空间的概念最早出现在2002年的Kernel 2.4.19中,当时唯一支持的名称空间是Mount,该名称空间的Flag甚至就名为CLONE_NEWNS。

4、隔离进程及标识的PID名称空间

PID名称空间能够支持多个完全独立的进程树;

 ●Linux系统在用户空间启动的PID号为1的进程,作为进程树的“根”;

 ●PID名称空间允许用户创建具有1号PID的单独分支

  ◆新树中的进程永远不会同父进程交互,也不会看到他

  ◆父进程可以访问所有的子进程树

带走CLONE_NEWPID标志的clone系统调用可用于创建新的命名空间PID。


上一篇:Qt学习笔记常用容器


下一篇:在webBrowser1.Navigate(url)中设置Cookie的注意点