罗永浩|图文并茂!带你深度解析Kubernetes( 三 )


在IaaS阶段 , 服务厂商只提供虚拟机 , 虚拟机之上的软件栈都由用户管理 , 包括操作系统、持久化层、中间层、用户程序 。 在IaaS层面用户只是减少了关心底层硬件 , 而PaaS层面希望能够进一步解放用户 , 让用户真正只需关注应用本身 。

  • PaaS主要功能
目前一个成熟的PaaS平台应具备的主要功能 , 如下图所示:

早期PaaS平台 , 更多关注运行时环境与依赖服务 , 而目前的PaaS平台新增大量的支持服务 , 包括:认证授权、系统日志、应用监控等 , 以上都是应用开发的常见需求 。 原则上:共用内容就应该抽象出统一通用的组件 , 由框架和平台来实现 。 让用户只关心逻辑或应用本身 , 避免重复造轮子 。
  • PaaS早期代表Cloud Foundry
PaaS在成熟之前也经历了几个阶段 , 而PaaS早期的代表就不得不提Cloud Foundry 。 Cloud Foundry由VMWare开发 , 是第一款开源PaaS平台(2011年) 。 支持多种框架、语言、运行时环境、云平台及应用服务 , 使开发人员能够快速进行应用的部署 , 无需担心任何基础架构的问题 。
它主要功能包括以下:
  • 应用打包、分发部署
  • 以容器的方式运行应用
  • 【罗永浩|图文并茂!带你深度解析Kubernetes】均衡负载
  • 服务监控、异常重启
Cloud Foundry的出现 , 其描绘了PaaS平台的初步形态 , 推动了PaaS的发展 , 具有划时代的意义 。
但其最终并未成为PaaS主流 , 是因为其存在一个核心不足:它只对应用和配置进行了打包 , 而没有打包整体依赖(所谓的整体依赖包括:中间环境、操作系统文件) 。 所以它的包在跨平台运行时 , 会出现运行失败的现象 。 这个问题非常致命 。
而且 , 早期Cloud Foundry主要是针对单一Web应用的管理 , 对分布式应用所需的各项能力均未涉及 , 例如:服务发现、弹性扩缩等 。
(五)DockerDocker公司的前身是dotCloud , 它是2010年成立 , 提供Paas服务的平台 。 但当时Cloud Foundry做的相对完善和开放 , 2012年底dotClound濒临倒闭 , 创始人决定把内部的打包平台开源出去 。 因此 , 2013年3月dotCloud公司在github平台上开源了其内部的容器项目Docker 。 Github开源之后 , 受到了业界的热烈追捧 , 从而Docker大火 。 公司后来也改名为Docker 。
Docker的成功 , 主要是通过镜像完美解决了开发、测试、生产环境不一致的问题 。 它的口号是:Build、Shipand Run any App、Anywhere , 即一处构建 , 到处运行 。
Docker的核心技术有三个:NameSpaces做视图隔离、Cgroups做资源限制 , UnionFS联合文件系统 , 统一mount 。 通俗理解:NameSpaces、Cgroups通给进程设置属性 , 实现进程的隔离与限制 , UnionFS给进程构造文件系统 。 这三项技术均有linux内核提供 , Docker本身并没有创造新的技术 。
但是Docker创造性的通过镜像整体打包了应用的依赖环境 , 包括:操作系统文件、中间依赖层、APP 。
  • 整体打包之后 , 镜像变大 , 又该如何优化?
Docker通过镜像分层复用的方式进行了优化 。 共用只读层 , 节省存储空间 , 提高镜像推送、拉取效率 , 镜像的操作是增量式 。
  • 当分层之后 , 在宿主机上如何合并多个层?
利用UnionFS实现合并 , 多个只读层加一个可写层mount成一个目录 。 并且上面的层会覆盖下面的层 , 当对底层的只读层修改时会采用写时复制策略(copy-on-write) 。 写时复制的含义:当另一个层第一次需要写入该文件时(在构建镜像或运行容器时) , 该文件会被复制到该读写层并被修改 。 该机制大大减少了容器的启动时间(启动时新建的可写层只有很少的文件写入) , 但容器运行后每次第一次修改的文件都需要先将整个文件复制到container layer中 。