容器技术是继大数据和云计算之后很火的一门技术,具有快速弹性伸缩(根据业务处于峰值或低峰状态实现容器数量的扩缩容,高效合理利用资源)、敏捷开发快速上线(平台提供持续集成/持续交付的工具链,使开发者只需专注于业务的开发与测试)、微服务架构应用(支持容器粒度的隔离,保证应用每个微服务的安全和稳定)等优点,在未来很长时间内都将是热门的技术。

由于容器技术属平台级别的技术,覆盖范围很广,包含了计算、网络、存储、日志、监控、安全、高可用等很多方面,因而在了解并学习掌握容器技术之前,对整个容器的生态系统有所个整体的了解是很必要的,这也是的本文的目的所在--带你了解容器的生态系统。容器技术的发展带动了一个生态系统的发展,而容器生态系统的发展又促进了容器技术的迅速发展。下图给出的是容器生态系统的概览图:

容器生态系统_java

 

图:容器生态系统

接下来,对容器的生态系统从容器核心技术、容器平台技术和容器支持技术3个方面进行介绍。

一、容器核心技术

容器的核心技术是指让容器(container)在主机(host)上运行起来的技术,包括容器规范、容器runtime、容器管理工具、容器定义工具、Registry和容器OS

 

1.容器规范

为了使目前存在的多种容器,像OpenVZrktDocker等,能相互兼容,DockerCoreOSGoogle等公司成立了Open Container InitiativeOCI)的组织来制定容器规范,目前已发布了两个规范:runtime specimage format spec

 

2.容器runtime

容器runtime是容器运行的地方,与操作系统的kernel一起为容器提供运行的环境。目前主流有lxcruncrkt3种运行环境。

lxcLinux提供的容器runtimeDocker早期便是以它作为runtime

runcDocker自己开发的容器runtime,目前是docker的默认runtime

rktcoreos开发的容器runtime,符合oci规范,也能够运行Docker容器。

 

3.容器管理工具

容器管理工具用于容器的管理,它们对内与runtime 进行交互,对外为用户提供接口,比如CLIcommand line interface),使用户通过这些接口对容器进行管理。目前主流的管理工具是:lxddocker enginerkt cli

lxdlxc对应的管理工具;

docker enginerunc对应的管理工具,包含后台deamoncli

rkt clirkt对应的管理工具。

 

4.容器定义工具

容器定义工具用来定义容器的内容和属性,这样容器就能被保存、共享和重建。目前主流的容器定义工具有3种:docker imagedockerfileACIApp Container Image)。

docker imagedocker容器的模板,runtime依据它来创建容器;

dockerfile是包含若干命令的文本文件,可以用它创建docker image

ACIApp Container Image)是由coreos开发的rkt 容器的image格式。

容器生态系统_java_02

 

5.Registry

Registry是镜像仓库,是存储image的地方。

Docker RegistryDocker Hubhttps://hub.docker.com)、Quay.iohttps://quay.io/)是主流的RegistryHaborVMware公司开源的DockerRegistry项目(https://github.com/vmware/harbor),其目标是帮助用户迅速搭建一个企业级的DockerRegistry服务,提供图形界面和权限控制。

容器生态系统_java_03

 

6.容器OS

容器runtime使得容器可以在LinuxMAC OSWindows上运行,而容器OS是专门运行容器的操作系统,它与常规的OS相比,体积更小,启动更快,运行容器效率更高。

目前主流的容器OSCoreOSatomic 和 ubuntu core 

CoreOS:以容器为中心的操作系统,在配置管理、自动扩容、安全等方面有一套完整的工具。

Atomic:一个轻量级的操作系统,可以运行dockerkubernetesrpmsystemd

Ubuntu Core:适合运行容器集群的轻量级ubuntu操作系统。

 

容器生态系统_java_04

二、容器平台技术

容器核心技术能使容器在单个主机上运行,而容器平台技术使得容器作为集群在分布式环境中运行。

容器平台技术包括容器编排引擎、容器管理平台和基于容器的PaaS

 

1.容器编排引擎

  容器的应用通常会采用微服务架构,把应用分为不同的组件,组件以服务的形式在容器中运行,对外暴露端口以提供服务。为了保证应用的高可用,每个组件会包含多个相同的容器。实际应用中,容器集群中的容器会根据业务需要进行扩容和缩容,动态的创建、迁移和销毁。   

  容器编排引擎就是对容器集群中的容器进行管理。‘编排’通常包含容器管理、调度、集群定义和服务发现等,通过容器编排引擎,容器有机的组合成微服务应用,满足业务需求。

  当前主流的容器编排引擎是docker swarmkubernetesmesos

  docker swarmDocker开发的容器编排引擎;

  KubernetesGoogle领导开发的开源容器编排引擎,支持DockerCoreOS的容器,是目前Docker容器最常使用的容器编排引擎;

  Mesos是一个通用的集群资源调度平台,与marathon一起提供容器编排引擎功能。

 

2.容器管理平台

  容器管理平台抽象了编排引擎的底层实现细节,架构于容器编排引擎之上,且支持多种容器编排引擎,为用户提供更方便的功能,比如一键部署应用和application catalog等。

  主流的容器管理平台是RancherContainerShip

 

3.基于容器的PaaS

  基于容器的PaaS提供开发、部署和管理应用的平台,使开发者专注于应用的开发,而不必关心底层的基础设施。

  开源容器PaaS的代表有DeisFlynnDokku

 

三、容器支持技术

容器支持技术指的是支持基于容器的基础设施的技术,包括容器网络、服务发现、监控、数据管理、存储、日志管理和安全性。

 

1.容器网络

  容器网络拓扑比较复杂且是动态的,用户需要管理容器与容器,容器与其他实体之间的连通性与隔离性,因而产生了许多的容器网络解决方案。

  Docker networkDocker原生的网络解决方案,我们也可采用第三方开源的网络方案,比如flannelweavecalico(一个纯三层的网络解决方案,使用BGP协议进行路由,可以集成到openstackdocker)等,由于各个网络方案各有优缺点,实际应用中应根据需要进行选型。

 

2.服务发现

  动态变化是微服务应用的一大特点,容器会根据业务需要创建、销毁和迁移。当负载增加时,会创建容器;当负载减少时,会销毁部分容器;容器也会根据主机资源的使用情况在不同的主机间迁移,这些过程中容器的IP和端口也会发生变化。在这样动态变化的环境中,需要让用户知道如何访问容器提供的服务,而这就是服务发现的工作。服务发现会保存容器集群中所有微服务的最新信息,比如IP和端口,并对外提供API,提供服务查询的功能。

  服务发现典型的解决方案有:etcdconsulzookeeper

  etcdCoreOS开源的分布式key-value存储,通过HTTP协议提供服务,因此使用起来简单。但是etcd只是一个key-value存储,默认不支持服务发现,需要第三方工具来集成。Kubernetes默认就使用etcd作为存储。

  consulHashiCorp开源的服务发现和配置管理工具,自带服务发现特性(DNS Server)。它是强一致性的数据存储,使用gossip协议形成动态集群。

  zookeeper:起源于Hadoop社区,优点是成熟、可靠、功能丰富,缺点是使用Java开发,配置麻烦。

容器生态系统_java_05

 

3.监控

  容器的动态特征增加了监控的难度,针对容器环境,已出现了许多监控工具和方案。

1)采集

  docker ps/top/statsDocker原生的命令行监控工具,同时,Docker也提供了stats API使用户能通过HTTP请求获取容器的状态信息。

  sysdigcAdvisor/HeapsterWeave Scope是其他开源的容器监控方案。

  Prometheus是一套开源的监控报警系统,它将所有信息都存储为时间序列数据,实时分析系统运行的状态、执行时间、调用次数等,以找到系统的热点,为性能优化提供依据。

2)存储

  InfluxDB是一个开源的时序数据库,适用于处理和分析资源监控数据这种时序相关数据。

  OpenTSDB是基于Hbase的分布式的、可伸缩的时间序列数据库。主要用于收集大规模集群的监控数据并进行存储,查询。

3)展示

  Grafana是一款可视化工具,大多使用在时序数据的监控方面,它的UI更加灵活,有丰富的插件,功能强大。

 

容器生态系统_java_06

4.数据管理

  由于容器经常会在不同的host间迁移,如何保证持久化数据也能够动态迁移,就是Flocker这类数据管理工具提供的能力。

 

5.存储

  在容器集群中,运行服务需要将数据持久化保存,因而需要提供持久化存储解决方案。

  NFSNetwork File System)是网络文件系统,通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。

  Ceph是一个可靠的、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备存储和文件系统服务。

  GlusterFS是一个开源的分布式文件系统,具有强大的横向扩展能力,它借助TCP/IPInfiniBandRDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。

  TorusCoreOS专门为容器集群量身打造的开源分布式存储系统,可以为通过Kubernetes编排和管理的容器集群提供可靠可扩展的存储。

 

6.日志管理

  日志为问题的查找排查和事件管理提供了重要的依据。

  Docker logsDocker原生的日志工具,而logspout对日志提供了路由功能,能收集不同容器的日志并转发给其他工具进行处理。

  ElasticSearch是一个分布式可扩展的实时搜索和分析引擎,是建立在全文搜索引擎Apache Lucene(TM)基础上的搜索引擎。

  Filebeat是本地文件的日志数据采集器,在服务器上安装客户端后,Filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件,并且转发这些信息到ElasticSearch或者logstash中存储。

  Fluentd是一个开源的数据收集器,有许多的插件,可以连接各种数据源和数据输出组件。Fluentd负责收集容器日志,然后发送给ElasticSearch

  Logstash是一个开源的数据收集引擎,具备实时数据传输的能力,可以统一过滤来自不同源的数据,并按照开发者的制定规范输出到目的地。

  KafkaApache提供的一个快速、可扩展的、高吞吐、可容错的分布式发布订阅消息系统。Kafka具有高吞吐量、内置分区、支持数据副本和容错的特性,适合在大规模消息处理场景中使用。

  Redis是一种支持Key-Value等多种数据结构的存储系统,可用于缓存、事件发布或订阅、高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串、哈希、列表、队列、集合结构直接存取,基于内存,可持久化。

  Kibana是一个开源的分析和可视化平台,可搜索查看,并和存储在ElasticSearch索引中的数据进行交互。它能执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。

 

容器生态系统_java_07

7.安全性

  容器安全性保证容器的安全,不被攻击,OpenSCAP能够对容器镜像进行扫描,发现潜在的漏洞。

容器生态系统_java_08

 

  以上就是容器生态系统所包含的核心技术、平台技术和支持技术,涉及容器运行、编排、管理、运维等相关技术,实在是比较多,所以可能存在疏漏,但能让大家对整个容器生态系统及其常用解决方案有大致了解,便于更深入的研究学习容器云技术。另外,其中涉及的很多技术都是开源的,大家可以很好的加以利用。