容器技术浅析及应用
部分内容来自 Hitachi Vantara 孙权
一、 什么是容器?
今天我们要说的容器技术是怎么一个概念呢?其实,IT里的容器技术是英文单词Linux Container的直译。container这个单词有集装箱、容器的含义(主要偏集装箱意思)。不过,在中文环境下,咱们要交流要传授,如果翻译成“集装箱技术” 就有点拗口,所以结合中国人的吐字习惯和文化背景,更喜欢用容器这个词。不过,如果要形象的理解Linux Container技术的话,还是得念成集装箱会比较好。我们知道,海边码头里的集装箱是运载货物用的,它是一种按规格标准化的钢制箱子。集装箱的特色,在于其格式划一,并可以层层重叠,所以可以大量放置在特别设计的远洋轮船中(早期航运是没有集装箱概念的,那时候货物杂乱无章的放,很影响出货和运输效率)。有了集装箱,那么这就更加快捷方便的为生产商提供廉价的运输服务。
因此,IT世界里借鉴了这一理念。早期,大家都认为硬件抽象层基于hypervisor的虚拟化方式可以最大程度上提供虚拟化管理的灵活性。各种不同操作系统的虚拟机都能通过hypervisor(KVM、XEN等)来衍生、运行、销毁。然而,随着时间推移,用户发现hypervisor这种方式麻烦越来越多。为什么?因为对于hypervisor环境来说,每个虚拟机都需要运行一个完整的操作系统以及其中安装好的大量应用程序。但实际生产开发环境里,我们更关注的是自己部署的应用程序,如果每次部署发布我都得搞一个完整操作系统和附带的依赖环境,那么这让任务和性能变得很重和很低下。
基于上述情况,人们就在想,有没有其他什么方式能让人更加的关注应用程序本身,底层多余的操作系统和环境我可以共享和复用?换句话来说,那就是我部署一个服务运行好后,我再想移植到另外一个地方,我可以不用再安装一套操作系统和依赖环境。这就像集装箱运载一样,我把货物一辆兰博基尼跑车(好比开发好的应用APP),打包放到一容器集装箱里,它通过货轮可以轻而易举的从上海码头(CentOS7.2环境)运送到纽约码头(Ubuntu14.04环境)。而且运输期间,我的兰博基尼(APP)没有受到任何的损坏(文件没有丢失),在另外一个码头卸货后,依然可以完美风骚的赛跑(启动正常)。
Linux Container容器技术的诞生(2008年)就解决了IT世界里“集装箱运输”的问题。Linux Container(简称LXC)它是一种内核轻量级的操作系统层虚拟化技术。Linux Container主要由Namespace和Cgroup两大机制来保证实现。那么Namespace和Cgroup是什么呢?刚才我们上面提到了集装箱,集装箱的作用当然是可以对货物进行打包隔离了,不让A公司的货跟B公司的货混在一起,不然卸货就分不清楚了。那么Namespace也是一样的作用,做隔离。光有隔离还没用,我们还需要对货物进行资源的管理。同样的,航运码头也有这样的管理机制:货物用什么样规格大小的集装箱,货物用多少个集装箱,货物哪些优先运走,遇到极端天气怎么暂停运输服务怎么改航道等等... 通用的,与此对应的Cgroup就负责资源管理控制作用,比如进程组使用CPU/MEM的限制,进程组的优先级控制,进程组的挂起和恢复等等。
二、容器技术的特点
容器的特点其实我们拿跟它跟硬件抽象层虚拟化hypervisor技术对比就清楚了,我们之前也提到过,传统的虚拟化(虚拟机)技术,创建环境和部署应用都很麻烦,而且应用的移植性也很繁琐,比如你要把vmware里的虚拟机迁移到KVM里就很繁琐(需要做镜像格式的转换)。那么有了容器技术就简单了,总结下容器技术主要有三个特点:
1. 极其轻量:只打包了必要的Bin/Lib;
2. 秒级部署:根据镜像的不同,容器的部署大概在毫秒与秒之间(比虚拟机强很多);
3. 易于移植:一次构建,随处部署;
4. 弹性伸缩:Kubernetes、Swam、Mesos这类开源、方便、好使的容器管理平台有着非常强大的弹性管理能力。
三、容器的标准化
当前,docker几乎是容器的代名词,很多人以为docker就是容器。其实,这是错误的认识,除了docker 还有coreos。所以,容器世界里并不是只有docker一家。既然不是一家就很容易出现分歧。任何技术出现都需要一个标准来规范它,不然各搞各的很容易导致技术实现的碎片化,出现大量的冲突和冗余。因此,在2015年,由Google,Docker、CoreOS、IBM、微软、红帽等厂商联合发起的OCI(Open Container Initiative)组织成立了,并于2016年4月推出了第一个开放容器标准。标准主要包括runtime运行时标准和image镜像标准。标准的推出,有助于替成长中市场带来稳定性,让企业能放心采用容器技术,用户在打包、部署应用程序后,可以自由选择不同的容器Runtime;同时,镜像打包、建立、认证、部署、命名也都能按照统一的规范来做。
四、容器的企业应用
容器技术凭借独特的优势,在大幅提升资源使用效率的同时又很好地实现了应用交付的标准化,充分满足了企业对于敏捷、弹性和成本的需求,这使其得到迅速发展并被广泛应用。从目前企业使用情况来看,容器技术的应用大致分为三个阶段:
第一阶段,正在学习和了解并计划使用容器技术,但是没有用于生产环境;
第二阶段,已经开始使用容器技术,并在生产环境中应用,计划未来扩大应用范围;
第三阶段,已经作为核心生产环境使用。
从这几个阶段我们可以看到,容器技术在企业发展的不同阶段都有应用场景。
当企业的管理者已经意识到容器技术的重要性,那么就需要思考如何开始的问题了。大多数企业对容器技术的应用是从开发和测试开始的。容器技术的一个主要应用场景就是CI/CD。我们通过容器技术可以快速构建企业的开发测试环境,新环境可以和企业现有的开发测试环境并存,并逐步实现替换。
举个例子,我们之前的源代码可能是存在于CVS或者SVN上的,那么迁移到Git只是个简单的事情。我们可以从一个新的版本开始在Git上构建,然而这并不影响老的代码存储和管理。新发布的版本,我们以image的形式存储在Harbor之类的镜像仓库里,并且可以很好地实现版本管理。
同时,我们可以构建新的测试流程,使用诸如Jenkins等工具来提升我们的构建和测试效率。有了自动化的构建和测试,以及标准化的image,那么自动化部署就更容易了。现在很多工具都支持自动化部署,可以无缝的和Kubernetes整合,这就极大地提升了从开发到运维的工作效率,彻底解决了以前系统出现故障的时候,开发和运维互相甩锅的问题,因此更容易被企业员工所接受。
有了群众基础就减少了新技术在公司推广的阻力,所以CI/CD是一个很好的入门选择。目前主流公有云提供商都有各自的CI/CD服务提供,RedHat的OpenShift中本身就包含了CI/CD的工具,可以很方便的部署和使用,还有很多开源的工具也可以供企业下载和使用。
当我们有了自己的CI/CD环境,构建了基于容器的应用系统,那么企业也就开始进入第二阶段了。第二阶段需要面对的主要问题就是逐步将原有的业务系统进行容器化改造,并迁移到容器环境中来。
容器化改造可以分为以下几种情况:
1. 单体应用容器
最初我们不妨从最简单的办法开始,将已有的应用直接打包做成镜像,并以容器的形式进行发布。这样我们就完成了容器化的第一步。
这样做的好处是,我们可以快速地将已有的老旧应用以最低的成本进行快速的容器化改造。同时,我们可以方便地将现有的基础架构向容器化架构转换,而不必等到应用开发部门完成容器化改造的全过程。
2. 应用的微服务化
当我们逐步完成了单体应用的容器化之后,就有了足够的时间去逐一完成真正的容器化改造。首先,我们要对应用进行拆分,完成有状态和无状态的模块化改造,将无状态的模块以镜像的方式存在我们的镜像仓库中,并根据需要进行部署和扩展。
同时,我们需要给有状态的模块一个合理的持久化存储解决方案。目前Kubernetes有很多云原生的存储插件,可以很好的兼容现有的公有云存储。但是如果我们是在私有云,如何利用现有的存储资源就成为了一个值得深入探讨的问题。是将数据保存在容器中,还是保存在服务器本地硬盘上,还是保存在外部存储上?这是我们要根据业务需求去仔细考虑的问题。
比如说,我们将数据存储在服务器本地硬盘上,这对于开发来说是最简单直接的方式,并且可以获得最高效的数据存储和访问,但是随之而来的问题是数据库的可用性无法得到很高程度的保障。在传统架IT架构中通常的做法是使用集中存储来解决这样的问题。
那么,容器集群能否直接利用企业现有的集中存储来获得企业级的数据保障呢?能否利用企业的数据保护方案实现应用数据保护呢?答案是肯定的。
可以基于集中存储(eg,HDS)的存储插件实现通过CSI跟Kubernetes完美的结合,使用Kubernetes进行存储编排;又能很好的支持存储的统一管理,在此插件的帮助下,企业可以将企业级的数据安全和可靠性无缝结合到容器平台中,解除容器化的后顾之忧。同时基于统一的数据保护方案(eg.Commvault)实现容器应用数据(Dockerfiles、images、Persistent Volumes)保护;
3. Cloud Native生态的结合
Cloud Native也就是我们常说的云原生,如今已成为企业数字化转型的关键策略。应用快速开发和交付的需求,促使企业采用云原生方法来开发应用,以提高效率并增加灵活性。应用微服务的改造并不等同于对应用代码的重构或者重写,敏捷和高效才是Cloud Native的核心思想。
我们不单单是以容器的方式重新构建我们的应用,同时我们也应该以开阔的视野和开放的心态去拥抱整个生态,把生态系统中那些优秀的开源框架和优秀的系统更好地融入到我们自己的业务系统中去,把全世界程序员的智慧为我所用,发挥更大的价值。
比如说,当企业容器和微服务不断增多,日志的收集、分析、监控等等是企业需要认真考虑的问题。自己开发一套日志收集与监控的系统,往往需要投入很多研发资源,经过少则数十天,多则数个月才能完成一套可用的系统,而且从可用到好用还有很长的路要走。
幸运的是,目前很多日志和监控的开源产品和解决方案都已经被各大公司广泛采用和验证。我们甚至只需要花数天时间就可以将其部署和使用起来,再投入一定的研发就可以很好地和我们现有的应用相结合。这样做既减少了投入,也提高了效率,可谓一举两得。
当我们已经完成了容器化改造,在生产环境中应用容器技术,并计划扩大应用规模。这时企业就必须在技术和人员上做好准备——运维人员是否有足够的能力以应对大规模应用带来的挑战,研发人员是否有足够的准备能随时解决大规模应用带来的问题,产品的架构设计是否可以满足未来的企业需求,同时组织架构和文化是否已经适应企业新的战略发展,等等。
随着企业对技术的不断探索,业务系统的逐步演进,应用规模的日渐增大,企业也逐渐向应用容器技术的第三阶段迈进。
当企业到达了第三阶段,相信此时企业已经成为了某个技术方向的领导者。在这一阶段我们需要更多地关注来自于社区的力量,并且将我们的技术回馈给社区,一方面可以更好地与开源生态系统相结合,另外一方面可以扩大企业的影响力,引领技术的方向,同时也为企业储备人才与技术提供更广阔的天地。
国内目前有很多处于行业领导地位的公司都处于这个阶段,比如我们耳熟能详的京东、阿里这样的互联网公司,以及像中国联通这样的运营商。他们都拥有着非常庞大的容器集群,并且在行业中引领着技术的发展方向,吸引着众多的追随者。同时,他们也是整个Kubernetes生态的代码贡献者,并且他们也在加速着整个互联网行业的发展。
当我们有了更多的技术积累和开源生态的影响力,我们就可以向市场转化我们的技术成果,做技术输出和服务输出,让企业对技术的投入产出更大的经济效益,可谓是一举多得的好事。
基于以上的企业应用情况,分析公司Gartner预测,到2023年,70%的组织将在生产中运行三个或更多容器化应用程序。容器、Kubernetes和微服务应用模式是企业IT创新和数字化转型的三大驱动力。很多公司已经采用这些技术,发挥其在应用程序开发和部署方面的优势。