docker in docker

https://github.com/jpetazzo/dind



https://cloud.tencent.com/developer/article/1199395



https://blog.csdn.net/weixin_40475396/article/details/80423980



资源主要包含以下几个方面:
1.CPU。阿里云有故障迁移技术,所以至少要保证对一个VM实例有两台实体机互相有副本,才能做到故障瞬间迁移。所以成本就不低的,阿里云去VM的CPU有严格限制,经过我自己测试,长时间占用CPU满100%会被禁用一段时间,所以这方面可能存在有合理的超售
2.内存。目测内存没有超售,我自己将内存挂载了一大块做为热数据缓冲区,没有写入失败的情况。
3.网络。阿里的BGP(http://bgp.he.net/AS37963 与电信联通直接广播)成本肯定不低的,而且阿里云网络稳定性是大家有目共睹的

https://www.infoq.cn/article/536L*XPRudOwCkiTDgM4



https://zhuanlan.zhihu.com/p/24435587



1 什么是虚拟化?



云计算的核心技术之一就是虚拟化技术。所谓虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。



虚拟化的核心软件VMM,是一种运行在物理服务器和操作系统之间的中间层软件。VMM是一种在虚拟环境中的“元”操作系统。他们可以访问服务器上包括CPU、内存、磁盘、网卡在内的所有物理设备。VMM不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。当服务器启动并执行VMM时,它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存,CPU,网络和磁盘。



2 虚拟化方式



虚拟化技术有很多实现方式,比如根据虚拟化的程度和级别,有软件虚拟化和硬件虚拟化,全虚拟化和半虚拟化。



2.1软件虚拟化



软件虚拟化,顾名思义,就是采用纯软件的方法在在现有的物理平台上实现物理平台访问的截获和模拟,该物理平台往往不支持硬件虚拟化。



常见的软件虚拟化技术QEMU,是通过纯软件来仿真X86平台处理器的指令,然后解码和执行,该过程并不在物理平台上直接执行,而是通过软件模拟实现,因此往往性能比较差,但是可以在同一平台上模拟出不同架构平台的虚拟机。



VMware则采用了动态二进制翻译技术。VMM在可控的范围内,允许客户机的指令在可控的范围内直接运行。客户机指令在运行前会被VMM扫描,其中突破VMM限制的指令被动态替换为可以在物理平台上直接运行的安全指令,或者替换为对VMM的软件调用。因此其性能上比QEMU有大幅提升,但是其失去了跨平台虚拟化的能力。



2.2硬件虚拟化



硬件虚拟化,简单来说,就是物理平台本身提供了对特殊指令的截获和重定向的硬件支持,新的硬件会提供额外的资源来帮助软件实现对关键硬件资源的虚拟化,从而提升性能。



比如X86平台,CPU带有特别优化过的指令集来控制虚拟过程,通过这些指令集,VMM会将客户机置于一种受限模式下运行,一旦客户机试图访问硬件资源,硬件会暂停客户机的运行,将控制权交回给VMM处理。同时,VMM还可以利用硬件的虚拟化增强技术,将客户机对硬件资源的访问,完全由硬件重定向到VMM指定的虚拟资源。



由于硬件虚拟化可提供全新的架构,支持操作系统直接在上面运行,无需进行二进制翻译转换,减少的性能开销,极大地简化了VMM的设计,从而使VMM可以按标准编写,通用性更好,性能更强。



需要说明的是,硬件虚拟化技术是一套解决方案,完整的情况需要CPU、主板芯片组、BIOS和软件的支持。Intel在其处理器产品线中实现了Intel VT虚拟化技术(包括Intel VT-x/d/c)。AMD也同样实现了其芯片级的虚拟化技术AMD-V。



2.3全虚拟化



完全虚拟化技术又叫硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(Full Virtualization)技术,它在虚拟机(VM)和硬件之间加了一个软件层Hypervisor,或者叫做虚拟机管理程序或虚拟机监视器(VMM)。



完全虚拟化技术几乎能让任何一款操作系统不用改动就能安装到虚拟服务器上,而它们不知道自己运行在虚拟化环境下。主要缺点是,性能方面不如裸机,因为VMM需要占用一些资源,给处理器带来开销。



2.4半虚拟化



半虚拟化技术是后来才出现的技术,也叫做准虚拟化技术,现在比较热门,它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要VMM耗费一定的资源进行翻译操作。因此VMM的工作负担变得非常的小,因此整体的性能也有很大的提高。不过缺点就是,要修改包含该API的操作系统,但是对于某些不含该API的操作系统(主要是Windows)来说,就不行能用这种方法。



半虚拟化技术的优点是性能高。经过半虚拟化处理的服务器可与VMM协同工作,其响应能力几乎不亚于未经过虚拟化处理的服务器。它的客户操作系统(Guest OS)集成了虚拟化方面的代码。该方法无需重新编译或引起陷阱,因为操作系统自身能够与虚拟进程进行很好的协作。



3 虚拟化实现



虚拟化技术指的是软件层面的实现虚拟化的技术,整体上分为开源虚拟化和商业虚拟化两大阵营。典型的代表有:Xen,KVM,WMware,Hyper-V、Docker容器等。



这里介绍一下开源的KVM和Xen以及微软的Hyper-V技术。



3.1 KVM



KVM(Kernel-based Virtual Machine)是基于内核的虚拟机,KVM是集成到Linux内核的VMM,是X86架构且硬件支持虚拟化技术(Intel VT或AMD-V)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。



KVM本身不执行任何模拟,需要用户控件程序通过/dev/kvm接口设置一个客户机的虚拟虚拟地址空间,向它提供模拟的I/O,并将其视频显示映射回宿主机的显示屏。



KVM继承了Linux系统管理内存的诸多特性,比如,分配给虚拟使用的内存可以被交换至交换空间、能够使用大内存页以实现更好的性能,以及对NUMA的支持能够让虚拟机高效访问更大的内存空间等。



KVM基于Intel的EPT(ExtendedPage Table)或AMD的RVI(Rapid Virtualization Indexing)技术可以支持更新的内存虚拟功能,这可以降低CPU的占用率,并提供较好的吞吐量。此外,KVM还借助于KSM(Kernel Same-pageMerging)这个内核特性实现了内存页面共享。KSM通过扫描每个虚拟机的内存查找各虚拟机间相同的内存页,并将这些内存页合并为一个被各相关虚拟机共享的单独页面。在某虚拟机试图修改此页面中的数据时,KSM会重新为其提供一个新的页面副本。实践中,运行于同一台物理主机上的具有相同GuestOS的虚拟机之间出现相同内存页面的概率是很的,比如共享库、内核或其它内存对象等都有可能表现为相同的内存页,因此,KSM技术可以降低内存占用进而提高整体性能。



3.2 Xen



Xen是一个基于X86架构、发展最快、性能最稳定、占用资源最少的开源虚拟化技术。在Xen使用的方法中,没有指令翻译。这是通过两种方法之一实现的。第一,使用一个能理解和翻译虚拟操作系统发出的未修改指令的CPU(此方法称作完全虚拟化)。另一种,修改操作系统,从而使它发出的指令最优化,便于在虚拟化环境中执行(此方法称作准虚拟化)。



在Xen环境中,主要有两个组成部分。一个是虚拟机监控器(VMM)。VMM层在硬件与虚拟机之间,是必须最先载入到硬件的第一层。Hypervisor载入后,就可以部署虚拟机了。在Xen中,虚拟机叫做“domain”。在这些虚拟机中,其中一个扮演着很重要的角色,就是domain0,具有很高的特权。通常,在任何虚拟机之前安装的操作系统才有这种特权。



Domain0要负责一些专门的工作。由于hypervisor中不包含任何与硬件对话的驱动,也没有与管理员对话的接口,这些驱动就由domain0来提供了。通过domain0,管理员可以利用一些Xen工具来创建其它虚拟机(Xen术语叫domainU)。这些domainU也叫无特权domain。这是因为在基于i386的CPU架构中,它们绝不会享有最高优先级,只有domain0才可以。



3.3 Hyper-V



Hyper-V采用微内核的架构,兼顾了安全性和性能的要求。Hyper-V底层的VMM运行在最高的特权级别下,微软将其称为ring -1(而Intel则将其称为root mode),而虚拟机的OS内核和驱动运行在ring 0,应用程序运行在ring 3下,这种架构就不需要采用复杂的BT(二进制特权指令翻译)技术,可以进一步提高安全性。



由于Hyper-V底层的VMM代码量很小,不包含任何第三方的驱动,非常精简,所以安全性更高。Hyper-V采用基于VMbus的高速内存总线架构,来自虚机的硬件请求(显卡、鼠标、磁盘、网络),可以直接经过VSC,通过VMbus总线发送到根分区的VSP,VSP调用对应的设备驱动,直接访问硬件,中间不需要Hypervisor的帮助。



这种架构效率很高,不再像以前的Virtual Server,每个硬件请求,都需要经过用户模式、内核模式的多次切换转移。更何况Hyper-V现在可以支持Virtual SMP,Windows Server 2008虚机最多可以支持4个虚拟CPU;而Windows Server 2003最多可以支持2个虚拟CPU。每个虚机最多可以使用64GB内存,而且还可以支持X64操作系统。



https://www.jianshu.com/p/312056e70387



https://www.w3cschool.cn/ikjzm/ikjzm-bjsm24xf.html



Category golang