老板建了机房,让你做机房管理员,机房已经建好了网络,还有几百台机器还有磁阵存储啥的,老板给你的工作任务,就是配合开发部和测试部的工作。然后你上班第一天,开发小哥过来找你,让你给安排个服务器,他们要在上面测试程序,然后你从服务器挑了一台还算空闲,在上面建一个虚拟机给他,又分配了一些硬盘到这个虚拟机上给他。一会测试小哥又过过来,说他的服务器硬盘不够,你又从存储中找了点空闲的硬盘挂到他服务器上。
你公司发展的越来越快,开发和测试越来越多,一会这个开发让给整个新服务器,一会这个测试让释放这个服务器,然后机房上面的资源也越来越乱,你越来搞不清楚究竟那个服务器上有多少虚拟机,每天一堆人的服务器(虚拟机)申请和更改,这个要扩硬盘,那个要加网络IP,那个新建一个CENTOS的系统服务器,各种要求让你头大,开发测试天天到老板哪里投诉你。
你已经感觉快混不下去,你心想如果有一套软件,能够让你在界面上直接管理机房的所有的服务器,可以随意在机房任一服务器新建更改虚拟机并配置存储网络等资源就太棒了,你打开google大法,就找到了openstack, 所谓openstack就是一个管理软件,把老板给你的机房的资源统一起来管理,不用再去手工去服务器上建虚拟机挂硬盘分配网络,它提供一个统一的界面,就像你在阿里云或者腾讯云上买虚拟机一样便捷,这就是IAAS,所谓的资源即服务(Infrastructure as a service),资源即服务的意思就是说,开发和测试那帮大爷不用再天天找你了,他们自己”服务“自己,就能搞定自己建服务器装系统的需求。OpenStack就是这样一个帮你管理机房的软件,核心模块Nova和Swift,Glance,Nova的功能你可以理解为帮你自动新建删除修改虚拟机,从此你不用再手工登录各服务器上手工敲命令,那帮开发要建新虚拟机,自己在Open Stack点创建,然后Nova会自动去相应服务器上新建虚拟机,Swift则对象存储模块,因为那帮开发测试天天找你扩硬盘,以后让他们直接把文件放象存储模块,你可以理解为机房里专门建了一个大云盘,每个人都可以直接访问,从此再也别烦我。Glance则镜像管理,各种虚拟机各种版本操作系统总要保存成镜像把,以前是我天天加班手工给开发测试大爷保存镜像,不要删除了,还要随时被在钉钉上各种大爷问候,现在好了,统一在OpenStack界面自己管理,各位大爷自己给自己虚拟机保存镜像,不要再烦我哦。
你又换个工作当测试,老板让你测试一个web程序,项目催的特别急,你赶紧在Openstatck申请了一台虚拟机开始测试,找了开发同事说要测试这套web程序,开发骄傲的和你说,他这套程序是用django+memcached+redis+rabbitmq开发而成,你兴冲冲的开始在你的虚拟机上部先是各种开源库的版本你安装的和开发就不是一个版本,然后各种环境变量和和文件夹名字,在你的虚拟机和开发虚拟机的上都不一样,你逐一修改,改了2天,连WEB页面都没打开。天天996,好不容易把这个应用测试完,交给运维同事发布到生产环境,运维同事一看应用配置文件,也崩溃了,生产环境的环境变量和文件夹都不一样,又要手工一一改,万一那个地方不一样改错了,程序又起来,烦躁!!
你实在受不了,你就想怎么样才能让开发,测试,运维针对同一套应用,用同样的各种库版本,用同样的环境变量,用同样的文件夹路径,这样配置文件就能保持一致,这样直接从开发环境拷贝到测试环境就能用,测试环境拷贝到运维环境就能启动。。。你首先想到的是,要么开发每次开发应用的时候,都在一个全新的vmware虚拟机上开发,开发完,直接把虚拟机保存成镜像给你,你直接拿着开发的镜像在你的服务器上新建一个虚拟机,这样你和开发的环境完全一样,再也不用自己去部署django/redis/mq/memcached,你再也不用自己去改配置文件,你直接动手就可以测试,测试完,运维同事也可以直接用这个虚拟机镜像在生产环境启动服务,一切都是完美,但是机房管理员和你们说,公司几百名开发,大大小小上千个应用,你们都是虚拟机镜像拷贝来拷贝去,一个linux物理服务器上,你们在上面跑了上百个linux虚拟机,相当于这个服务器上同时跑了上百linux, 物理CPU和内存都被这上百Linux操作系统占领了,直接把机器卡死了。
这时候,你就想,有没有“轻量”的虚拟机,能在物理服务器的操作系统上,不是像vmware那样直接安装全新的操作系统来虚拟一陶系统,这个虚拟机,能不能不需要有自己的操作系统,只需要有自己环境变量,有自己的文件路径,相当于”沙盒“,这时候你搜索到了docker, 它就是这样的技术,它不需要从头虚拟一整套系统,不需要安装全新的操作系统,它可以建一个”沙盒“,在这个沙盒里有自己的环境变量和文件路径,在它沙盒里的文件夹里可以放自己应用的二机制文件和库。这样开发可以在自己的开发服务器上,把应用都放在一个个docker"沙盒”里,然后要测试的时候,把这些“沙盒”保存成镜像给你,你测试的时候,直接沙盒就可以了,测试完了,运维同事也直接拿着镜像就可以启动,你们都省事了,而且docker不是通过新装一个操作系统来给应用程序一个独立的环境变量和文件路径,所以docker不需要额外运行新操作系统的外销,不会再被机房管理员喷我们浪费机房资源了。
下面就是普通虚拟机和docker的区别,少了“Guest OS"(虚拟机的操作系统), 没有了资源浪费,再也不怕机房管理员喷你们浪费资源了。。
你用docker的方法,让开发测试运维都省事了,测试再也不用因为安装的库版本和开发用的库版本不一致而心烦,再也不用因为路径和环境变量不一致,一行行去比对配置文件,开发开发完了,测试很快就能测试,测试测试完了,docker镜像直接给运维就能上生产,大家越来越喜欢用这个方法,越来越多的应用和web服务,被包装成docker,运行在你们生产环境上,但是docker越多,几千个docker服务运行在生产环境,运维的同事就忙的很了,要每天监控几千docker的情况,这个docker突然挂了,要赶紧起一个docker来接替,突然业务爆发了,来了一堆新请求,业务都卡在某个应用上了,这个应用需要再赶紧多一些docker服务,来应对爆发的业务请求。运维同事忙的手忙脚乱的,每次发布新docker更是头疼,如果有一个对这么多docker集群进行监控编排管理的软件就好了,这就是k8s的作用,它提供了健康检查和自修复,自动扩容缩容,服务发现和负载均衡等等一系列的能力,运维同事再也不用因为某个docker挂了,或者要扩容再半夜爬起来了。。
作者:蟒系现代魔法师