容器技术是操作系统层面的一种虚拟化技术。在Linux系统下,容器能够利用Namespaces、AppArmor、SELinux配置、Chroot以及CGroups等内核功能,交付一套类似于虚拟机的隔离性环境。经过不断的发展,容器技术所带来的轻量级、隔离性、标准化以及可大规模部署的特性促生了微服务和云原生应用的普及和发展。
Docker容器
毫无疑问,Docker是目前最具人气且应用最为广泛的容器技术。为什么呢?作者总结了以下主要的两个原因。
1、和早期容器技术不同,Docker不只是针对了应用对主机资源的共享和隔离,它更加关注应用的微服务化,大规模部署和管理自动化。微服务和云原生应用的发展极大的提高了Docker技术的大众接受程度。
- Docker所采用的分层镜像模型让Docker对应用环境的封装更加轻量级和标准化,让镜像更加容易的共享和分发,极大的简化了大规模部署和运维的难度。
- Docker镜像模型的Copyon Write机制和Volume机制合理的满足和促进了应用的无状态化和微服务化。
- Docker提倡一个应用(进程)一个容器,符合微服务的理念。
2、Docker不只是一个工具包,围绕它的是一整套生态系统。包括镜像库、容器管理调度、网络、存储、安全。这一整套生态系统让应用采用容器技术进行大规模的封装,部署,运维,管理成为可能。
容器的特性如何在生产环境中发挥所长,还需要其生态圈中一系列的工具、产品和方案作以支撑。以下我们会对Docker以及它代表的容器技术生态系统做进一步的介绍。
容器生态圈
下图中的内容就是容器生态圈中的各个组件,我们将会从下至上逐一分层解析。
1、容器OS
容器OS并不是运行容器的必要条件,容器也可以运行在通用Linux中。大部分的容器OS即为Linux OS的精简版。相比大而全的Linux OS,容器OS如RancherOS、CoreOS、Redhat Atomic、Ubuntu Core、VMware Photon具有更加轻量,占有资源更少的特征,适合于更加标准化的数据中心和IOT的一些领域。同时,Microsoft也于2015年推出Windows Nano Server,并将其作为Windows2016的安装选项,其大小相比完整的Windows2016部署缩小了90%以上。
2、容器引擎
容器引擎负责容器应用的隔离和资源共享。它驱动和管理主机上所有的容器,并且包括了容器卷管理、容器网络管理、容器配置、镜像管理以及容器日志。容器生态圈中容器引擎主要有两个标准OCI和AppC,两个引擎Docker和RKT。 以下是一张对比表:
3、容器存储
容器中一般运行是无状态应用。对于有状态应用,应用的数据持久化就需要容器存储的支持。Docker为了支持第三方存储方案,在1.8版本引入Volume Plugin机制。Flocker作为Volume Plugin,需要和第三方外部存储结合使用为容器提供持久化存储,同时也屏蔽掉第三方存储系统的差异,类似Cinder在OpenStack中的位置。而Torus (项目已于2017年2月停止开发,“Developmenton Torus at CoreOS stopped as of Feb 2017”引用自Github Torus项目说明)和Comet(有容云)作为独立的分布式存储系统,可直接为容器提供完整的数据存储服务。
Comet存储系统作为国内少有的自主研发分布式系统,除了针对容器特性进行性能优化外,也提供了多级数据保护,应用感知等企业级存储特性。
4、容器网络
容器网络解决容器在大规模部署后的互联互通的问题。主要有Docker原生的CNM容器网络模型和CoreOS支持的CNI容器网络模型。除了Docker原生的Libnetwork网络方案,在容器网络生态圈中,有以下几种商业容器网络方案。
- Flannel是CoreOS为Kubernetes设计的基于CNI模型的网络方案。它让各个容器采用UDP Overlay或者Vxlan的方式互联,并且让集群中的不同节点主机创建的容器都具有全集群唯一的虚拟IP地址。
- Weaver和Flannel在很多方面比较类似。但是Weaver采用Name Service的方式来进行IP分配管理,不需要一个全局的Kv Store。
- Calico是一个纯三层网络,采用BGP的技术来进行路由交换。由于不像其他几个网络模型一样需要封包,它的性能相对最优。
5、镜像仓库
镜像仓库提供了镜像的存储、及pull/push的服务。仓库分为公有仓库(如Docker Hub、Quay)和私有仓库(如AppHouse、Harbor)两种形式。最大的公有仓库是Docker Hub,即Docker官方的镜像仓库。由于网络访问限制的原因,或企业用户对数据安全性考虑的原因,也可以在企业私有数据中心建立私有镜像仓库,可通过部署AppHouse(有容云)或者Harbor来实现。
部署镜像仓库需要考虑的是镜像存储的安全性和系统的容错性。可分别通过搭建企业级存储系统或分布式存储系统来保障镜像数据的完整性,并选择具有高可用特性的镜像仓库进行实施和部署。
6、容器安全
容器缺少一个像虚拟机所拥有的安全边界。容器的快速迁移,升级和部署的特性也带来了新的安全隐患。容器安全可分为镜像安全和容器运行时安全。
- 镜像安全:使用互联网来历不明的镜像、或是从互联网下载不明镜像作为基础镜像、或是制作镜像时对端口和服务开启没有严格的限制和把控、DockerFile中恶意程序等,都将会导致生成高危漏洞的镜像。对于镜像的安全建议在两阶段进行控制,一是镜像提交到镜像仓库时;一是进行周期的镜像扫描;同时,对于已发布或发现的漏洞风险,进行及时更新。
- 容器运行时风险:容器运行时风险来自于多方面,对外提供服务的容器会收到DDOS攻击,从而导致主机上的所有容器出现资源不足;容器使用不当会导致主机Root权限泄漏;使用者权限过高会通过容器对主机文件修改导致系统崩溃;数据卷共享导致主机上容器对数据篡改等。目前已有用户开始关注容器安全的问题,同时也有不少厂商也推出了针对容器运行时安全的商业化方案。
Clair是CoreOS开源的容器镜像安全分析器,具有镜像安全扫描和提供修复建议的功能,目前也已有多个厂家将其集成在自身的容器平台中。
TwistLock在镜像扫描和容器运行时都有防护方案。Aqua的CSP在2017年2月也发布了2.0版本,官方表示将和Kubernetes会有更好的结合。
AppSafe是国内容器厂家有容云推出的容器安全产品,针对容器进行智能安全策略配置,并可根据配置策略进行实时防护。
7、容器编排
容器平台是容器应用大规模部署,升级和运维的管理平台。容器的编排和资源调度是容器平台的核心功能。容器平台也提供服务发现、运行监控、扩容缩容、负载均衡、灰度升级、故障冗余等功能。
- Swarm是Docker的原生集群工具,Swarm使用标准的Docker API来管理容器集群。
- Kubernetes 是一个以Google Borg 为原型的开源项目。可实现大规模、分布式、高可用的容器集群。目前国内大部分容器厂家产品都是基于Kubernetes进行二次开发和方案封装,这里暂不赘述。
- Mesos是Apache下的开源分布式资源管理框架。基于Mesos之上可以运行不同的分布式计算平台,如Spark、Storm、Hadoop、Marathon。Mesos+Marathon可以用来管理大规模的容器集群。
8、运维
容器平台运行和管理着成千上万的容器及应用。如何能从资源(主机、容器)纬度和应用的纬度来及时监控和日志收集,也成为容器进入生产环境绕不开的话题。目前容器的监控和日志方案分为开源方案和SaaS服务两种:
- CAdvisor 是针对单主机的免费且开源的容器监控工具,可用于监控容器当前的资源使用率及性能情况。CAdvisor简单易用,但容器平台中需要和其他开源工具或产品结合使用,且自身无报警功能。CAdvisor已集成在Kubernetes中。
- Data Dog提供基于容器监控的SaaS服务,在被监控主机上运行Agent即可接受Data Dog的监控,视图简单、使用方便,其Monitors提供可自定义阈值的告警服务,但成本较高。
- Prometheus是一款开源的监控工具,也是在容器平台中使用较多的一种监控方案,相对于Heapster,Prometheus提供的查询API功能更加强大,可以基于Label来实现复杂查询,适合有一定技术能力的团队使用。
- Zabbix是一个较成熟的开源分布式监控系统。在非容器场景中已被大量使用,Zabbix由服务器端的Server和被监控端的Agent组成,通过丰富的模板可自定义需要收集的数据和展示形式。基于容器的Zabbix监控方案需要考虑到Agent的部署方式及容器的视图展示方式。
- Heapster是一个开源的容器集群监控和性能分析工具,原生支持Kubernetes和CoreOS。一般通过Heapster+InfluxDB+Grafana来实现基于Kubernetes的监控方案,来完成数据收集、存储及展示的功能。
- ELK日志分析系统由三个开源工具Elasticsearch+Logstash+Kibana组成,分别对应搜索、数据采集和展示的功能,是一套较成熟的日志方案,有公司基于此方案提供日志SaaS服务。基于容器的日志监控通常为EFK(Elasticsearch+Fluentd+Kibana),通过占用内存较少的Fluentd替代Logstash,来满足容器平台更大规模更密集的日志收集需求。
在以后的文章里我们会对容器调度和编排做重点的介绍,容器生态还有哪些组件和专注于某一领域的厂家、技术或产品,欢迎小伙伴们回复和讨论。
附: 容器历史发展:http://www.youruncloud.com/blog/114.html
线上微信群分享
本次分享主要是介绍我公司如何使用jenkins pipeline, container 和 kubernetes deployment的能力, 通过增加使用文本模版引擎, 扩展kubernetes config能力, 完成公司产品开发ci工作流的建立。
线上微信群分享参与方式:
扫描下方二维码,发送名片
城市+姓名+公司
联系群助手加群
评论前必须登录!
注册