微服务架构开发实战:基于容器的部署与发布微服务,30K有望了

在微服务架构系统中包含了大量的服务 , 并且服务之间存在复杂的依赖关系 , 以拓扑的形式运行并相互协作 , 如果部署的时候采取方式来解决整体的依赖、配置通信的协议和地址等 , 那么重新部署到新环境的成本会非常高 。 而容器技术提供了一种将所有的服务能够迅速快捷地重新部署的方案 , 并且可以根据需求进行横向的扩展 , 且保证高可用性 , 在出现问题的时候可以自动重启或者启动备份服务 。
微服务架构开发实战:基于容器的部署与发布微服务,30K有望了
文章图片
所谓虚拟化技术就是将事物从一种形式转变成另一种形式 , 最常用的虚拟化技术有操作系统中内存的虚拟化 , 实际运行时用户需要的内存空间可能远远大于物理机器的内存大小 , 利用内存的虚拟化技术 , 用户可以将一部分硬盘虚拟化为内存 , 而这对用户是透明的 。 又如 , 可以利用虚拟专用网技术(VPN)在公共网络中虚拟化一条安全、稳定的“隧道” , 用户感觉像是在使用私有网络一样 。
虚拟机技术是虚拟化技术的一种 , 虚拟机技术最早由IBM于20世纪六七十年代提出 , 被定义为硬件设备的软件模拟实现 , 通常的使用模式是分时共享昂贵的大型机 。 Hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层 , 可允许多个操作系统和应用共享硬件 , 也可称为VMM(VirtualMachineMonitor , 虚拟机监视器) 。 VMM是虚拟机技术的核心 , 用来将硬件平台分割成多个虚拟机 。 VMM运行在特权模式 , 主要作用是隔离并且管理上层运行的多个虚拟机 , 仲裁它们对底层硬件的访问 , 并为每个客户操作系统虚拟一套独立于实际硬件的硬件环境(包括处理器、内存、I/O设备) 。 VMM采用某种调度算法在各个虚拟机之间共享CPU , 如采用时间片轮转调度算法 。
虚拟化技术已经改变了现代计算方式 , 它能够提升系统资源的使用效率 , 消除应用程序和底层硬件之间的依赖关系 , 同时加强负载的可移植性和安全性 , 但是Hypervisor和虚拟机只是部署虚拟负载的方式之一 。 作为一种能够替代传统虚拟化技术的解决方案 , 容器虚拟化技术凭借其高效性和可靠性得到了快速发展 , 它能够提供新的特性 , 以帮助数据中心专家解决新的顾虑 。
容器具有轻量级特性 , 所需的内存空间较少 , 提供非常快的启动速度 , 而虚拟机提供了专用操作系统的安全性和更牢固的逻辑边界 。 如果是虚拟机 , 虚拟机管理程序与硬件对话 , 就如同虚拟机的操作系统和应用程序构成了一个单独的物理机 。 虚拟机中的操作系统可以完全不同于主机的操作系统 。
容器提供了更高级的隔离机制 , 许多应用程序在主机操作系统下运行 , 所有应用程序共享某些操作系统库和操作系统的内核 。 已经过证明的屏障可以阻止运行中的容器彼此冲突 , 但是这种隔离存在一些安全方面的问题 , 我们稍后会探讨 。
容器和虚拟机都具有高度可移植性 , 但方式不一样 。 就虚拟机而言 , 可以在运行同一虚拟机管理程序(通常是VMware的ESX、微软的Hyper-V或者开源Zen、KVM)的多个系统之间进行移植 。
而容器不需要虚拟机管理程序 , 因为它与某个版本的操作系统绑定在一起 。 但是容器中的应用程序可以移到任何地方 , 只要那里有一份该操作系统的副本 。
容器的一大好处就是应用程序以标准方式进行了格式化之后才放到容器中 。 开发人员可以使用同样的工具和工作流程 , 不管目标操作系统是什么 。 一旦在容器中 , 每种类型的应用程序都以同样的方式在网络上移动 。 这样一来 , 容器酷似虚拟机 , 它们又是程序包文件 , 可以通过互联网或内部网络来移动 。
我们已经有了Linux容器、Solaris容器和FreeBSD容器 。 微软正与Docker公司合作 , 开发Windows容器 。 Docker容器里面的应用程序无法迁移到另一个操作系统 。 确切地说 , 它能够以标准方式在网络上移动 , 因而更容易在数据中心内部或数据中心之间移动软件 。 单一容器总是与单一版本的操作系统内核关联起来 。
1.成熟度方面的比较
虚拟机是一项高度发展、非常成熟的技术 , 事实证明其可以运行最关键的业务工作负载 。 虚拟化软件厂商已开发出了能处理成千上万个虚拟机的管理系统 , 那些系统旨在适合企业数据中心的现有运营 。
容器代表了未来的新技术 , 而这种大有希望的新兴技术未必能解决每一个困难 。 开发人员正在开发相应的管理系统 , 以便一启动就将属性分配给一组容器 , 或者将要求相似的容器分成一组 , 以便组成网络或加强安全 , 但是这类系统仍在开发之中 。
Docker最初的格式化引擎正成为一种平台 , 并附有许多工具和工作流程 。 而容器获得了一些大牌技术厂商的支持 。 IBM、红帽、微软和Docker都加入了Google的Kubernetes项目 , 这个开源容器管理系统可用于将诸多Linux容器作为单一系统来管理 。
2启动速度的比较
创建容器的速度比虚拟机要快得多 , 那是由于虚拟机必须从存储系统检索10~20GB的空间给操作系统 。 容器中的工作负载使用主机服务器的操作系统内核 , 避免了这一步 。 容器可以实现秒级启动 。
拥有这么快的速度让开发团队可以激活项目代码 , 以不同的方式测试代码 , 或者在其网站上推出额外的电子商务容量 , 这一切都非常快 。
3.安全方面的比较
就目前来说 , 虚拟机比容器有更高的安全性 。 容器技术并不像看上去那么可靠 。 以应用Libcontainers作为技术支持的Docker为例 , 在Linux系统的工作模式下 , Libcontainers可以访问五个命名空间:流程、网络、安装、主机名和共享内存 。 这固然很好、很强大 , 然而仍然有很多重要的Linux核心子系统不能被容器所兼容 , 包括所有的设备、SELinux、Cgroup及lsys下的所有文件系统 。 这意味着 , 如果某位用户或应用程序获取了容器内部的超级用户权限 , 底层操作系统理论上可以被破解 。 这是一件非常糟糕的事情 。
现在出现了很多保护Docker和其他容器技术的措施 。 举例来说 , 我们可以将一个lsys文件系统设置为“只读” , 或者强制某个容器进程对特定的文件系统执行“只写”操作 , 或者设置网络命名空间 , 以使其只能与特定的企业内联网交流信息 。 但是 , 这些办法都不能从根本上解决问题 , 如此维护容器安全需要耗费大量的时间和精力 。
另一项安全问题是 , 很多人都在发布基于容器的应用 , 如果未对网络上的这些应用加以识别 , 很可能会下载到带有木马的应用 , 这样就可能给我们的服务器带来严重的安全隐患 。
4.性能方面的比较
在2014年 , IBM研究部门发表了一篇关于容器和虚拟机环境性能比较的论文:AnUpdatedPerformanceComparisonofVirtualMachinesandLinuxContainersR 。 这篇论文使用了Docker和KVM作为研究对象 , 阐述了Docker使用NAT或AUFS时的开销 , 并且质疑了在虚拟机上运行容器的实践方法 。
论文作者在原生、容器和虚拟化环境中运行了CPU、内存、网络和IO的Benchmark 。 其中 , 分别使用KVM和Docker作为虚拟化和容器技术的代表 。 Benchmark也包含了对不同环境下Redis和MySQL负载的采样 。 通过小数据包和多客户端的对比发现 , Redis侧重于网络栈的性能 , 而MySQL侧重于内存、网络和文件系统的性能 。
结果显示 , 在每一项测试中 , Docker的性能等同于或超出KVM的性能 。 在CPU和内存性能方面 , KVM和Docker都引入了明显的但可粗略不计的开销 。 但是 , 对于IO密集型的应用 , 两者
都需要进行调整 , 以减少开销带来的影响 。
【微服务架构开发实战:基于容器的部署与发布微服务,30K有望了】当使用AUFS存储文件时 , Docker的性能会降低 。 而相比之下 , 使用卷(Volume)能够获得更好的性能 。 卷是一种专门设计的目录 , 存在于一个或多个容器内 。 通过这种目录能够绕过联合文件系统(UnionFileSystem) 。 这样它就没有了存储后端可能带来的开销 。 默认的AUFS后端会引起显著的IO开销 , 特别是当有多层目录深度嵌套的时候 。


    推荐阅读