引言
随着云计算技术的快速发展,基于容器的云服务器逐渐成为主流部署模式。容器提供了一种轻量级、可移植的虚拟化方式,可以将应用程序及其依赖项打包到一个独立的单元中。这使得应用程序的发布和管理更加简单、高效。
容器的优势
容器技术相较于传统虚拟机具有以下优势:轻量级: 容器仅包含应用程序运行所需的部分,因此占用空间小,启动速度快。可移植性: 容器可以在不同的操作系统和云平台上运行,提高了应用程序的可移植性。隔离性: 容器之间相互隔离,可以防止应用程序出现故障后影响其他应用程序。可扩展性: 可以轻松地创建和销毁容器,实现应用程序的弹性扩展。
云服务有哪十种 基于互联网的十大云服务产品盘点
云服务是一种通过互联网按需获取的计算资源,能够灵活扩展,适用于各种IT和软件需求。
Maigoo网编辑整理了十大云服务产品,让我们一起来了解这些基于互联网的创新服务。
云服务器是云计算技术的核心,它为用户提供虚拟的计算资源,具备高度灵活性和可扩展性。
用户可以根据实际需求快速调整配置和规模,从而实现IT基础设施的无缝升级和迁移,大大降低了成本和维护的复杂性。
同时,云服务器还具备高可用性和可靠性,能够提供稳定可靠的服务。
这对于企业来说,可以显著提高业务效率和灵活性,促进企业的发展。
云存储技术将网络中的大量存储设备集合起来协同工作,提供数据存储和业务访问功能。
云存储的优势在于节约成本、安全以及更方便的访问,非常适合互联网行业、金融行业、游戏行业和企业办公等。
这种新兴的网络存储技术已经成为云计算的重要组成部分,也是云计算的重要应用之一。
云游戏将游戏的所有计算密集型任务放在远程服务器上完成,玩家只需通过互联网连接到这些服务器,就能够享受到高质量的游戏体验。
云游戏的优势在于无需担心本地设备的性能不足或兼容性问题,用户可以在不同的设备和平台上玩到各种各样的游戏,包括那些通常需要高级硬件配置的大型游戏。
此外,云游戏的服务商可以根据市场需求租赁不同游戏的内容,确保玩家有丰富的游戏选择。
云课堂是基于云计算技术的一种远程教学课堂形式,实现了教育和培训活动的远程进行。
在这种模式下,学生和教师都可以在任何时间、任何地点通过互联网进行学习和教学活动。
云课堂的特点包括资源的数字化、开放性和即时性,使得学习者和教育者能够进行实时的在线交流互动和教学。
云手机是一种利用云计算技术的设备,其核心组件包括操作系统和存储都存在于云端服务器中。
用户通过互联网访问这些资源,使得云手机可以在任何有网络的设备上运行应用程序。
云手机的优点包括不受物理位置和设备的限制,能够提供更大的存储空间和更强的计算能力,同时还可能包含一些独特的特性,如即时下载和应用更新。
云电脑是一种基于云计算的服务,它允许用户通过互联网访问并使用远程的数据中心里的计算资源。
这些资源包括桌面、应用程序和数据,用户需要的是一个小巧的云终端设备,如显示器、鼠标和键盘,以实现类似于传统PC的使用体验。
云电脑的特点是将硬件如CPU、内存和硬盘等集中存放在云端,这样用户可以在任何有网络连接的地方使用云电脑,无需担心本地设备的配置或维护问题。
云渲染是一种基于云计算技术的高效快速渲染方式,通过将渲染任务分配到云端服务器上,实现了数字娱乐、建筑设计、工业制造等领域的高效、可靠解决方案。
云渲染平台使得即使是复杂的大型渲染项目,也能在云服务器的支持下高效完成,无需用户拥有高配置的个人计算机。
云通信利用云计算技术和互联网协议来实现通信的过程,通过将通信功能部署在云上,实现了异地、多端点、多通道、多媒体等复杂通信任务。
云通信包括语音、短信、即时消息等多种服务形态,除了提供基本的通信连接功能外,还支持多种增值服务,如语音转文字、人工智能语音识别、情感分析等。
云呼叫中心是一种集成了多种通讯方式的信息化服务平台,结合了计算机电话集成技术和云计算技术。
这种平台能够提供包括电话、移动电话、在线客服、电子邮件、短信等多种通讯手段的一站式服务,实现了对企业信息的统一管理和交互。
云呼叫中心的目的是为了提高客户满意度和运营效率,同时降低企业的运营成本。
云呼叫中心通常作为一种外包服务,允许企业在无需自行投资大量硬件和软件的情况下,通过互联网访问和使用相关服务。
云防火墙是一种云安全产品,主要用于保护云服务器、容器等云资源的网络安全,防止网络攻击、恶意流量等威胁。
它根据配置的安全策略对流量进行检测和过滤,从而提高云资源的安全性能。
云防火墙的主要功能包括流量过滤和检测、DDoS防护、网络访问控制、VPN接入控制、安全审计和日志管理,适用于各种需要保护网络安全的业务和场景。
微服务架构之「 容器技术 」
现在一聊到容器技术,大家就默认是指 Docker 了。
但事实上,在 Docker 出现之前,PaaS社区早就有容器技术了,以 Cloud Foundry、OpenShift 为代表的就是当时的主流。
那为啥最终还是 Docker 火起来了呢? 因为传统的PaaS技术虽然也可以一键将本地应用部署到云上,并且也是采用隔离环境(容器)的形式去部署,但是其兼容性非常的不好。
因为其主要原理就是将本地应用程序和启停脚本一同打包,然后上传到云服务器上,然后再在云服务器里通过脚本启动这个应用程序。
这样的做法,看起来很理想。
但是在实际情况下,由于本地与云端的环境差异,导致上传到云端的应用经常各种报错、运行不起来,需要各种修改配置和参数来做兼容。
甚至在项目迭代过程中不同的版本代码都需要重新去做适配,非常耗费精力。
然而 Docker 却通过一个小创新完美的解决了这个问题。
在 Docker 的方案中,它不仅打包了本地应用程序,而且还将本地环境(操作系统的一部分)也打包了,组成一个叫做「 Docker镜像 」的文件包。
所以这个「 Docker镜像 」就包含了应用运行所需的全部依赖,我们可以直接基于这个「 Docker镜像 」在本地进行开发与测试,完成之后,再直接将这个「 Docker镜像 」一键上传到云端运行即可。
Docker 实现了本地与云端的环境完全一致,做到了真正的一次开发随处运行。
一、容器到底是什么? 容器到底是什么呢?也许对于容器不太了解,但我们对虚拟机熟悉啊,那么我们就先来看一下容器与虚拟机的对比区别:上图的左侧是虚拟机的原理,右侧是Docker容器的原理。
虚拟机是在宿主机上基于 Hypervisor 软件虚拟出一套操作系统所需的硬件设备,再在这些虚拟硬件上安装操作系统 Guest OS,然后不同的应用程序就可以运行在不同的 Guest OS 上,应用之间也就相互独立、资源隔离了,但是由于需要 Hypervisor 来创建虚拟机,且每个虚拟机里需要完整的运行一套操作系统 Guest OS,因此这个方式会带来很多额外资源的开销。
而 Docker容器 中却没有 Hypervisor 这一层,虽然它需要在宿主机中运行 Docker Engine,但它的原理却完全不同于 Hypervisor,它并没有虚拟出硬件设备,更没有独立部署全套的操作系统 Guest OS。
Docker容器没有那么复杂的实现原理,它其实就是一个普通进程而已,只不过它是一种经过特殊处理过的普通进程。
我们启动容器的时候(docker run …),Docker Engine 只不过是启动了一个进程,这个进程就运行着我们容器里的应用。
但 Docker Engine 对这个进程做了一些特殊处理,通过这些特殊处理之后,这个进程所看到的外部环境就不再是宿主机的那个环境了(它看不到宿主机中的其它进程了,以为自己是当前操作系统唯一一个进程),并且 Docker Engine 还对这个进程所使用得资源进行了限制,防止它对宿主机资源的无限使用。
那 Docker Engine 具体是做了哪些特殊处理才有这么神奇的效果呢? 二、容器是如何做到资源隔离和限制的? Docker容器对这个进程的隔离主要采用2个技术点: 弄清楚了这两个技术点对理解容器的原理非常重要,它们是容器技术的核心。
下面来详细解释一下: 三、容器的镜像是什么? 一个基础的容器镜像其实就是一个 rootfs,它包含操作系统的文件系统(文件和目录),但并不包含操作系统的内核。
rootfs 是在容器里根目录上挂载的一个全新的文件系统,此文件系统与宿主机的文件系统无关,是一个完全独立的,用于给容器进行提供环境的文件系统。
对于一个Docker容器而言,需要基于 pivot_root 指令,将容器内的系统根目录切换到rootfs上,这样,有了这个 rootfs,容器就能够为进程构建出一个完整的文件系统,且实现了与宿主机的环境隔离,也正是有了rootfs,才能实现基于容器的本地应用与云端应用运行环境的一致。
另外,为了方便镜像的复用,Docker 在镜像中引入了层(Layer)的概念,可以将不同的镜像一层一层的迭在一起。
这样,如果我们要做一个新的镜像,就可以基于之前已经做好的某个镜像的基础上继续做。
如上图,这个例子中最底层是操作系统引导,往上一层就是基础镜像层(Linux的文件系统),再往上就是我们需要的各种应用镜像,Docker 会把这些镜像联合挂载在一个挂载点上,这些镜像层都是只读的。
只有最上面的容器层是可读可写的。
这种分层的方案其实是基于 联合文件系统UnionFS(Union File System)的技术实现的。
它可以将不同的目录全部挂载在同一个目录下。
举个例子,假如有文件夹 test1 和 test2 ,这两个文件夹里面的文件 有相同的,也有不同的。
然后我们可以采用联合挂载的方式,将这两个文件夹挂载到 test3 上,那么 test3 目录里就有了 test1 和 test2 的所有文件(相同的文件有去重,不同的文件都保留)。
这个原理应用在Docker镜像中,比如有2个同学,同学A已经做好了一个基于Linux的Java环境的镜像,同学S想搭建一个Java Web环境,那么他就不必再去做Java环境的镜像了,可以直接基于同学A的镜像在上面增加Tomcat后生成新镜像即可。
以上,就是对微服务架构之「 容器技术 」的一些思考。
码字不易啊,喜欢的话不妨转发朋友,或点击文章右下角的“在看”吧。
基于容器的部署
首先我们的问题是:产品包含了大量的服务,并且服务之间存在复杂的依赖关系,以拓扑的形式运行并相互协作,部署的时候需要手动解决整体的依赖,配制通信的协议和地址,重新部署新环境复杂度非常高。
因此,我们希望有一种容器技术可以让我们构建产品所需要的所有的服务能够迅速快捷的重新部署,并且可以根据需求横向的扩展,且保证高可用性,在出现问题的时候可以自动重启或者启动备份服务。
目前有多种解决方案,考虑我们有私有云,亚马逊云以及物理机的几种部署方式,所以Docker作为解决方案的基础,在其之上选择合适的容器拓扑管理工具就成了主要任务,常见的解决方案有: 多种解决方案中我们优先选择官方提供的工具,一般来说官方提供的工具跟自己的原生服务结合的更好,也具有更长远的规划,在官方工具确实不足的情况下辅助以第三方的工具,因此初步我们决定采用Docker原生的工具Machine+Swarm+Compose辅助以Mesos来实现整个工程的部署,其中Swarm负责某一功能模块小规模的容器分配调度,Mesos负责整个集群最外层大规模容器资源调度,可以说以Mesos为主,Swarm为辅助,因为Mesos是比较成熟的资源管理框架,也有非常适合的调度引擎,Swarm还相对初步随着时间演进,也许会接管更多的调度。
简单介绍下Docker官方原生的工具: 关于Docker网络解决方案的争论比较多了,CoreOS和Kubernetes都有自己的解决方案,前两者都是比较通用的PAAS工具,作为通用性的服务编排工具容器的具体实现可以是多种,Docker只是其中之一,而Docker libnetwork的解决方案过于底层,不适合作为通用的插件集成到Kubernetes或者CoreOS中,因此这两家都有自己CNI类型的解决方案,对于使用者来说我们不那么关心到底这个工具支持多少种容器,只需要知道Docker这种容器能够满足当前产品部署的需求就好,因此我们仍然以Docker的工具为主,尽管不那么通用,但是能够解决我们目前服务编排的问题。
官方的工具看起来很美好,解决方案也足够优雅和简洁,问题就是成熟程度,compose和swarm的结合仍然是在试验阶段,对于处于不同host的container,进行link仍然需要手动对整个Swarm集群设置网络,对于大规模或者复杂拓扑的部署工作量不小,因此我们借助于Mesos来做第一级的资源或者容器管理,其中第二级或者说小规模容器部署是可以在swarm中实现。
Mesos作为资深的资源管理平台,在Docker出现之前就已经被广泛利用了,基本上所有的主从类型的分布式计算框架都支持使用Mesos来做基本的资源分配调度,比如hadoop, storm,spark等等,同时Mesos的设计也可允许长时间运行的application, 不管是batch job, stream job还是普通的应用服务都可以接入Mesos来申请资源启动自身的容器。
早期Mesos只支持LXC形式的资源限制,在Docker崛起之后Mesos也开始支持直接使用Docker容器来运行具体的计算框架,可以说二者既有竞争又相辅相成。
说竞争是因为目前Docker自己的工具已经慢慢的可以替代一部分Mesos的应用场景了,只要机器上安装了Docker engine就可以无差别的管理所有主机,比如Swarm就可以组建简单的服务集群,管理容器在集群中的运行,同时也能够利用Machine来进行远程管理,说相辅是因为Swarm的设计是可以替换具体的调度后端的,默认情况使用自己的调度器在服务发现的基础上选择一个host来启动容器,通过配置可以选择Mesos作为其调度后端,将Swarm 作为跟Spark同等的Compute Framework来运行,这样Swarm就能够使用Mesos更加成熟和灵活的调度机制来管理容器,在此之上Compose就可以把编排好的服务运行在Mesos集群,可见Mesos和Docker结合的生态系统在当前阶段是比较和谐的。
这样,最终我们的解决方案就基本确定了,Mesos作为最基础的集群资源管理或者调度工具运行在所有的服务器上,Spark等计算框架不再独立部署,而是使用Mesos最初的LXC容器来运行,Swarm使用Docker容器通过Mesos来调度,Compose文件用来启动结合比较紧密服务堆栈,比如Tachyon集群,我们自己所开发的应用服务以及ACO集群也作为一个Docker服务堆栈在Swarm上运行。
所以我们的Mesos集群上目前运行两种计算框架,Spark和Swarm,负责我们的应用和分布式计算的部署,具体的应用和服务编排都是在Compose中完成,个别复杂的应用需要手动去处理关联关系,依然是以Docker的形式运行在Mesos中。
Mesos可以把我们的机器聚合在一起作为一个机器来使用,不管是我们的应用还是分布式计算的任务,都直接提交给Mesos来进行调度,减少了对服务器的垂直划分,不存在Spark的集群, Hadoop的集群等概念,Spark或者Hadoop的job直接在Mesos的slave中分配资源并运行各自job相关的Executor, 运行结束后释放资源,就像Spark没有存在过一样, 因此从更高的角度看Mesos的Framework其实就是一个调度器加一个运行时的处理流程,不用再需要Spark或者Storm等框架的Standalone 模式自己来处理调度,只需要使用Mesos的API,实现自己的scheduler和具体启动停止运行过程的Executor就好, 而对于我们自己的应用如果要作为Framework存在也需要实现对应的Scheduler和Executor, 不过可以利用现成的比较好的调度器比如Marathon来托管我们的应用,减少开发Framework的工作量。
使用Mesos这样的好处是资源的利用率更高, 因此我们在也不需要除了Mesos之外的long running 集群, 即使有Long running的服务,也是在Mesos分配好的容器内运行。
Framework = Scheduler + Executor Mesos的安装过程稍微有点服务,虽然Docker镜像可以减少Mesos的部署复杂度,但是这样就存在了两层容器, Mesos在Docker 容器中运行,而Mesos里边的任务也是在自己的Docker容器里运行,如果有些长时间运行的任务需要暴露出端口跟外界交互,就需要先Expose port到Mesos slave级别的容器, 然后再Expose到最外层的物理机,复杂度增加且对性能有损耗,因此我们最终还是倾向于在物理机上部署Mesos, 只保留一层Docker容器不推荐嵌套,而且有了Mesosphere的DCOS系统,在AWS上部署Mesos就比较简单了。
Mesos看起来很完美,那我们为什么还需要Docker容器呢, 直接使用LXC标准Linux kernel支持的容器不就可以了,在这个解决方案中我们期望所有运行的应用或者分布式计算框架的任务的Executor都是在Docker容器中运行,也是因为Docker杀手级的功能,一个Docker容器就像一个集装箱,里边包含了需要运行一个服务或者任务的所有的依赖条件或者配置,都可以根据需求自身灵活的修改,并且一次装箱随处运行,不用关心外在环境,举个例子假如直接使用LXC来运行Spark的某个任务的Executor,需要提供Spark jar包的地址,相关的配置集成到ExecutorInfo中才能运行,而如果使用Docker container就简单很多,Spark executor运行需要的信息都在某个Docker image中,Mesos slave只要调用Docker client启动某个镜像就足以运行一个Framework的某个任务,任务的执行在Docker 容器中。
对于我们自己开发的各种服务同理也是组织成镜像最终在Docker容器中运行, Scheduler依赖Marathon就可以。