当我们谈论不可变基础架构时,我们在谈论什么?你从一千个电话中醒来,困倦而困惑。恍惚间,我终于明白是怎么回事了。一个旧应用程序突然关闭,消息堆积,系统关闭。而你就像一个下水道工人在梳理马桶,轰轰烈烈地创造奇迹,重启机器,恢复服务。看到消息队列中的事件堆积直线下降,警告也消除了。第二天,你不想再重复午夜的铃声,决定对系统进行永久修复:添加一个脚本来定期重启服务。时光荏苒,许多日子过去了,你在不同的角落增添了无数的剧本,你已经很久没有半夜醒来,甚至可以悠闲地享受下午茶了。然而,直到今天。今天,您的部门希望降低成本并提高效率。为了避免被砍成本,你决定主动裁掉线上的机器:合并业务,裁掉机器。尽管您确切地知道机器上部署了哪些应用程序,但您不再记得支撑应用程序运行的脚手架。重建环境非常困难,以至于您再次开始难以入睡。1.不断变化的基础设施复杂、神秘、神奇的网络环境承载了一半的都市传说,甚至一些企业的网络环境是需要口耳相传的古老神话。虽然没见过沙漠暴雨,但见识过一种说不清上面是什么的环境。虽然没见过大海亲吻鲨鱼,但见过再也爬不起来的机器。如果你能说清楚任何一台机器上部署了哪些应用程序,机器上服务之间的依赖关系是什么样子的,你就打败了80%的玩家。造成这种情况的根本原因是基础设施的可变性。添加新服务时:“我找台机器部署”某个服务出现问题时:“我去机器上改”需要更改某个系统配置时:“我“我会做一个脚本并运行它”看似正常的操作维度变化,有记录或无记录,每个环境都是那么独特和独特,再加上人员变动,创造了无数“祖传秘密”。一、什么是不可变基础设施容器在被广泛接受的同时,“不可变”也逐渐被潜移默化地接受。应用容器消亡后,容器内的修改将随容器一起不复存在。不要在容器中进行修改是最简单的不变性概念。在程序启动阶段遇到问题时,很少有人还把容器中的修补当成严肃的解决方案,回到最开始的阶段从容器构建阶段解决问题。接下来就是大家对容器镜像的无限信任,容器突然出问题了?尝试重建。不能用另一台机器运行?肯定是机器的问题。2.集装箱带来了什么?大家普遍认为Docker或者说容器引发了一场革命。但是为什么说容器是一场革命,什么是革命呢?有一种说法是Docker简化了服务的管理,更容易停止和启动服务,但其实systemd或supervisor等老牌的服务管理和运维工具在这方面不一定比docker难用看待。我认为是镜像技术点燃了革命,一种不可临时修改的、固化的、独立的可交付成果,一种真正的一次性构建到处运行,一个可以快速铲除和快速部署的实体,不再是“作品”在我的机器上”,如此令人放心和可靠。正是因为容器的重构速度如此之快,我们才有机会最大限度地“重启再试”。如果出了问题,重建容器看看?你想尝试使用Docker,但是你的业务那么复杂,在机器上重新构建容器和直接在机器上重启服务有什么本质区别。2.PetvsCattle随着Kubernetes的出现,大规模容器管理成为可能,划定大规模容器的管理最佳实践成为热门话题。1.如何喂猫如果你养了一只猫,你会怎么喂它?我记得在我找回一只猫后,花了很长时间和脑细胞才同意一个我和它都会同意的名字。接下来就是带我家小猫去医院,制定疫苗接种计划,保证我家小猫以后的健康。接下来就是日复一日的铲屎,等待主人的宠爱。小王子告诉我:你的猫很重要,因为你花时间陪它。经典的运维方法和养猫一样。我们可以称之为宠物运维。你会为机器和应用制定详细的计划,甚至给这个环境起个名字,比如production。你也会爱护这个环境,定期检查和监控,做升级和维护。你花时间在你的环境上,你的环境是如此重要。很难想象你的猫和你的环境突然离开你的场景。也许你会心碎和破产。2.开始当农民养了一只猫后,你不小心得到了另一个牧场。但是你可能不能像养猫那样养几千头牛,因为名字要有几千个就很难记住了。你可能不会轮流带你的牛去医院打疫苗,为什么不直接批发统一打疫苗呢。如果小牛有严重的缺陷,也许你会在那里照顾它,但更有可能及早将其从流程中移除,从而节省更多的饲料浪费。从此以后,你这辈子再也见不到整头牛了。只要为牛群建立足够的安全设施,某一头牛的状态对整体有什么影响。033.牧场运维当你建成了一套完整的数千头牛养殖设施后,你会惊奇地发现,即使再增加100头牛,成本也不会增加太多。和养猫不同,养两只猫的时候,最好有3个猫砂盆,不然就有机会体验鸡跳狗跳了。你立志要做牛郎运维,不想再给生产环境的高手们铲屎了。拥抱Kubernetes并像管理牛群一样管理您的应用程序。1.牧养一组Pod你把生产环境的masters放到容器里,通过容器镜像来规范部署方式。没有人愿意做不规范的操作,然后用Pod来部署应用,也不再关心容器中的应用。在哪个Node上启动,这一切都由它自己的牧场(Kubernetes)来处理。pod异常?没关系,删掉看看,下次就是全新的应用了。完全不会影响牧场的正常运作。一切如丝般顺滑,岁月静好。半夜,电话响了,有急事。你从一千个电话中醒来,困倦而困惑。恍惚间,我终于理清了事情的经过。原来,流量不知从何而来,节点雪崩。而你就像下水道工人一样梳理马桶,轰轰烈烈地创造奇迹,扩建机器,恢复服务。pendingPod消失,警告消失。第二天,你不再想重现午夜的钟声,而是陷入了沉思。作为一名牧场主,你逐渐意识到了一个灯下黑暗的问题。您可以轻松地将每头奶牛均质化,但无法将整个牧场均质化。2、Shepherd真正的基础设施梳理了好几遍,你已经找到了问题的症结所在:pod虽然可以用羊群的方式管理,但是机器的运维还是宠物式的。你还是会好好爱护每一台机器:提前计划,取个名字,单独控制规格,选择操作系统,甚至还有几台你喜欢的,关心的,日以继夜的关心,有个人的内部昵称。作为行业领先的牧场主,决心改造您的牧场,像管理Pod一样管理节点不是一个好主意吗?如果Node异常,直接删除Node,等着弹出新的?你还没想完,背有点凉,你还没有像信任容器一样信任虚拟机,虽然你知道重启可以解决90%的故障,重装系统可以解决99%的故障失败。想了想,还是想尝试一下。稍加思索,锁定痛点有两个:可以按需快速收回机器,同质化管理OS镜像:快速、安全、不可变3.驯服虚拟机经过研究,你发现东西不是和当初想象的一样深不可测。主流云厂商早就提供了百搭工具,你只要稍微驯服一下,就可以为自己的牧场服务了。云厂商很早就推出了弹性伸缩组,可以根据负载和预期维持虚拟机的数量。阿里云也有自己的实现(ESS),可以根据规则对ECS进行扩容,无需人工干预。你看到了希望,这不就是Node的Deployment吗?但是仅仅扩展虚拟机对你来说价值不大。你知道你需要牛圈,而不是木头,你需要驯服它们。这时候你转头看到了你的Kubernetes集群,灵机一动,为什么要直接面对虚拟机,只要能把新扩容的机器管理到集群里,基本问题就解决了。就这么干吧,通过AutoScaling定义启动命令,进行标准化安装,开机后执行kubejoin动作。机器上电后不久,就可以出现在Kubernetes集群中。你觉得离目标又近了一步。4.很快就驯服了操作系统,你发现了一个新问题。传统的OS启动跟容器真的没法比。显然所有依赖项都在容器内部,并且所有应用程序都已经在容器中运行,但您仍然不必为操作系统内置的未使用服务付费,这些服务会减慢启动速度并引入安全漏洞。而且,总有人没有意识到同质化管理的好处。时不时会有人去机器上做一些不为人知的修改,以至于每次要发布虚拟机都需要在群里喊,以免遇到什么神奇的bug。.自找麻烦,你苦笑。你打算驯服OS,裁剪传统的OS,清理所有依赖容器的东西,可能会大大加快机器的启动速度。还有,最好在某处加个告示,告诫大家不要在机器上写字,以免机器出炉时丢失文件。有一天,你发现了阿里云的ContainerOS,这是一款为容器量身定制和优化的操作系统。不需要自己剪裁,甚至不需要加通知,因为RootFS是只读的,连SSH都不行。默认开启,从根本上杜绝了非规范操作。您尝试一下,容器优化的操作系统启动得非常快。点击后弹出,一分钟即可安排您的业务。将Node作为Pod进行管理,您就会看到希望。4.管理放牧但是很快,你又遇到了新的问题。造机器一时爽,老板跟你说,你手上的一批机器存在严重的CVE安全漏洞,需要抓紧时间修复。你开始头大了,因为你知道除了现有的节点之外,只要创建新的机器,就会有安全漏洞。你有一种模糊的感觉,你正在前往深水区。摸索了一番,听说有人提出像自动驾驶一样托管集群,也看到了阿里云ACK的托管节点池。节点扩缩容、节点故障自愈、安全加固、OS托管,触动你。你意识到你需要从根本上解决问题:放弃自建Kubernetes,全面拥抱托管。拥抱托管后,你突然发现,原来事情本该如此简单。多年的摸索就像一粒种子,看到托管节点池后瞬间发芽。自此,新的三斧传统再次在世间流传:坐等自愈?poddelete看看?节点删掉看看?朴实而有效。
