当我们谈论不可变基础设施时,我们在谈论什么

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
注册配置 MSE Nacos/ZooKeeper,182元/月
云原生网关 MSE Higress,422元/月
简介: 拥抱托管后,你豁然开朗,原来事情本应如此简单,多年的摸索仿佛一颗种子,在看到托管节点池后瞬间发芽成果。从此,世界上又开始流传了新三板斧传统:等等自愈看看?Pod 删下看看?Node 删下看看?朴实无华且有效。

作者:陈海波(漂石)


1.png


午夜时分,电话响起,线上告急。你从千呼万钉中醒来,睡眼朦胧,手忙脚乱。


恍惚之间,终于梳理清楚发生了什么,一个陈年老应用突然停机,消息堆积,系统停摆。而你就像一个下水道小工疏通马桶一般,大力出奇迹,重启机器,恢复服务。只见消息队列中的堆积事件一泻千里,警告消除。


次日,你再也不想重现午夜凶铃,决定对系统进行永久性修复:加一个定时重启服务的脚本。


斗转星移,许多时日过去了,你也在不同的角落加了无数的脚本,也好久没有半夜惊醒,甚至还能悠闲享受下午茶。但是,直到今天。


今天,你们部门要降本增效,为了避免自己成为被砍掉的成本,你决定主动对线上的机器开刀:合并服务,裁撤机器。虽然你对机器上都部署了什么应用了然于胸,但是你已经不记得都有哪些脚手架支撑着应用的运转。


重建环境难如登天,你又开始难眠了。


变化的基础设施


复杂、神秘而神奇的线上环境承载了半部都市传说,甚至有些公司的线上环境本身就是一本需要口耳相传的上古神话。


我虽然没有看过沙漠下暴雨,但是看过没人说的清楚上面有什么的环境。我虽然没有看过大海亲吻鲨鱼,但是我看过重启再也起不来的机器。


如果你能说清楚任何一台机器上都部署了什么应用,以及机器上服务之间的依赖关系是什么样子的,你已经击败了八成的玩家。而造成这种局面的根本原因就是基础设施的易变。


  • 新增一个服务时:“我找台机器部署一下”
  • 某一个服务出问题时:“我上机器改一下”
  • 需要对某个系统配置变更时:“我搞个脚本跑一跑”


看似常规运维变更,有文档记录或者没有文档记录,每一个环境都是如此的别致和独一无二,再加上人员变动,造就了无数的“祖传秘技”。


什么是不可变的基础设施

容器在被广泛接受的同时,「不可变」也逐渐被潜移默化的接受。

应用容器消亡之后,容器内的修改会随着容器一起不复存在,不要在容器内做修改就是最朴素的不可变理念。在程序启动阶段遇到问题,很少人还会把在容器内修修补补作为正经方案,而会回到最一开始的阶段,从容器构建阶段解决问题。
随之带来的就是大家对容器镜像无尽的信任感,容器突然出现问题?重建试试。换个机器跑不起来?肯定是机器的问题。


容器带来了什么


大家普遍认同 Docker 或者说容器引发了一场革命。但是为何说容器是一场革命,到底革了什么的命?


有一种说法是 Docker 简化了服务的管理,停启服务更加简单,但是事实上 systemd 或者 supervisor 等老牌服务管理、运维工具在这一点上不见得比 docker 难用多少。


我认为是镜像技术引爆了革命,一个不可临时修改的、固化的、自包含的交付物,真正的一次构建到处运行,一个可以快速铲掉和快速部署的实体,再也没有 「Works on my machine」,是如此的安心和可依赖。


也正是因为容器的重建是如此的快捷,使得我们有机会对「重启试试」发挥到极致,出问题了,重建容器看看?


你想尝试使用 Docker,但是你的业务如此复杂,上机器重建容器和直接上机器重启服务又有什么本质差别呢。


Pet vs Cattle


随之 Kubernetes 的到来,大规模的容器管理成为可能,而划定大规模容器的管理最佳实践也成为了热门议题。


2.png


如何饲养一只猫

如果你得到了一只猫,你会如何饲养它?我记得我在领回一只猫之后,花了很长的时间和脑细胞用来商定一个我和它都能接受的名字。


紧接着就是带着我的小猫去医院,制定疫苗计划,来保证我的小猫未来的健康。后面便是日复一日的铲屎和等着主子的眷顾。


小王子告诉我:正因为你为你的猫花费了时间,这才使你的猫如此重要。


经典的运维方式和猫的饲养是一样的,我们可以称之为宠物式运维。你会对机器和应用做详尽的规划,甚至为这个环境起一个名字,比如叫生产好了。


你也会对这个环境悉心照料,定期看看监控、做下升级保养。你为你的环境花费了时间,你的环境如此重要。


很难设想你的猫和你的环境突然间离你而去的场景,也许你会伤心的撕心裂肺和破产的撕心裂肺。


农场主入门

在获得了一只猫之后,你一不留神又获得了一家牧场。但你可能无法像养一只猫一样养几千头牛,因为几千个名字应该是很难记住的。


你可能也不会依次带着你的牛去医院打疫苗,何不直接批发疫苗统一接种呢。如果有小牛犊存在严重的缺陷,也许你会陪在它身边悉心照料,但更可能的是把它尽早的从流程中剔除,省的浪费更多的饲料。


从此你的生活便目无全牛,只要为牛群建立足够多的保障设施,某一头牛的状态对整体又有什么影响呢。


放牧式运维


当你已经为上千头牛建设了完善的饲养设施,你会惊奇的发现,即使再加 100 头牛,并不会增加太多的成本。而不像饲养猫,当你有两只猫的时候,最好能有 3 个猫砂盆,否则你将有机会体验到鸡飞狗跳。


你决心当一个牧牛人运维,再也不想给生产环境的主子们铲屎了。拥抱 Kubernetes,像放牧一样管理你的应用。


3.png


牧养一群 Pod


你把生产环境的主子们装进集装箱,通过容器镜像对部署方式进行标准化,谁也甭想做非标的操作,再使用 Pod 对应用进行部署,再也不去关心应用在哪个 Node 上启动,这一切自有牧场(Kubernetes)自行处理。


一个 Pod 异常了?没关系,删掉看看,下次起来又是一个全新的应用。丝毫不会影响到牧场的正常运转。


一切丝般顺滑,岁月静好。


午夜时分,电话响起,线上告急。你从千呼万钉中醒来,睡眼朦胧,手忙脚乱。


恍惚之间,终于梳理清楚发生了什么,原来是不知何处流量涌现,节点雪崩。而你就像一个下水道小工疏通马桶一般,大力出奇迹,扩容机器,恢复服务。pending Pod 消失不见,警告消除。


次日,你再也不想重现午夜凶铃,但陷入深思,身为牧场主的你,逐渐意识到一个灯下黑的问题。


你可以轻松的同质化对待每一头牛,但你无法同质化整个牧场。


牧养真正的基础设施


几番梳理,你找到了问题的关键:尽管可以放牧式管理 Pod,但是机器的运维却还是宠物式的。


你依然会悉心照料每个机器:提前规划、取一个名字、单独控制规格、挑选操作系统,甚至还有几台深得你爱,嘘寒问暖,日夜牵挂,拥有单独的内部昵称代号。


作为业界领先的牧场主,你决心改造自己的牧场,如果能像管理 Pod 一样管理 Node 是不是一个好主意?


如果 Node 异常直接删除 Node,等着弹出新的?还没想完,你后背有些发凉,你还没有像信任容器一样信任虚机,虽然你深知重启可解决 90% 的故障,而重装系统可以解决 99% 的故障。


思来想去,你依然想做些尝试,稍加思考,锁定痛点有二:


  1. 机器按需快速弹缩,同质管理
  2. OS 镜像化:快速、安全、不可变


驯服虚机


经过调研,你发现事情并不像原来设想的那样深不可测,主流云厂商早就提供了野生工具,你只需要稍加驯服,便可以为自己的牧场服务。


云厂商们很早便推出了弹性伸缩组,可以按照负载和期望维护虚拟机的数目。而阿里云也有自己的实现(ESS),可以无需人工干预的根据规则对 ECS 进行扩缩容。


你看到了希望,这不就是 Node 的 Deployment 吗?但是只是扩容虚拟机对你来说并没有什么价值,你深知需要的是牛圈,而不是木材,你需要对他们进行驯服。


这时,你转头看到了你的 Kubernetes 集群,灵感蹦出,为何要直面虚拟机呢,只要新扩容出的机器能被纳管到集群中不就解决了基本问题。


说干就干,通过 AutoScaling 定义了启动命令,开机后进行标准化安装和执行 kube join 动作。当机器开机不久,就可以出现在 Kubernetes 集群中。你感觉距离目标进了一步。


驯服 OS

很快,你又发现了一个新的问题,传统的 OS 启动和容器实在无法比拟,明明所有的依赖都在容器内部,而且所有的应用都已经在容器内运行,但你还是不得不为 OS 内置的、没人使用的服务买单,这些服务拖慢了启动速度,还引入了安全漏洞。


而且,总是有人意识不到同质化管理的好处,时不时有人上机器做一些不可知的修改,导致你每次想释放虚机时需要去群里喊一喊,避免碰到什么神奇的 Bug。自寻烦恼,你苦笑道。


你打算驯服 OS,对传统的 OS 进行剪裁,除了容器依赖的东西全部清理掉,说不好能大大加快机器的启动速度。还有,最好能在啥地方加个告示,敬告大家不要在机器上做写操作,避免释放机器时文件的丢失。


有天,你发现了阿里云的 ContainerOS,一个针对容器剪裁和优化的操作系统,你不需要亲自动手剪裁了,甚至都不再需要加一个告示,因为 RootFS 都是只读的,连 SSH 都不会默认打开,从根本上杜绝了非标操作。


4.png


你尝试了一下,针对容器优化的 OS 启动贼快,点完弹出,一分钟后你就可以把业务调度上去了。把 Node 当做 Pod 管理,你看到了希望。


托管式放牧


但不久,你遇到了一个新的问题,创建机器一时爽,你的老板告诉你,你手里有一批机器存在一个要紧的 CVE 安全漏洞,需要抓紧时间搞一搞,你开始头大了,因为你知道,除了存量的节点,现在只要创建新的机器就有安全漏洞。


你有了一种若隐若现的感觉:你在走向深水区。image.gif


5.png


一番探寻后,你听说有人提出应该像自动驾驶一样去托管一个集群,也看到了阿里云 ACK 的托管节点池。节点的扩缩容、节点故障的自恢复、安全加固、OS 的托管,无不触动着你。你意识到应该从根本上解决问题:放手自建的 Kubernetes,全面拥抱托管。

6.png


拥抱托管后,你豁然开朗,原来事情本应如此简单,多年的摸索仿佛一颗种子,在看到托管节点池后瞬间发芽成果。


从此,世界上又开始流传了新三板斧传统:等等自愈看看?Pod 删下看看?Node 删下看看?朴实无华且有效。


点击此处,查看更多托管节点池功能细节~

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
存储 NoSQL Java
从扣减库存场景来讲讲redis分布式锁中的那些“坑”
本文从一个简单的库存扣减场景出发,深入分析了高并发下的超卖问题,并逐步优化解决方案。首先通过本地锁解决单机并发问题,但集群环境下失效;接着引入Redis分布式锁,利用SETNX命令实现加锁,但仍存在死锁、锁过期等隐患。文章详细探讨了通过设置唯一标识、续命机制等方法完善锁的可靠性,并最终引出Redisson工具,其内置的锁续命和原子性操作极大简化了分布式锁的实现。最后,作者剖析了Redisson源码,揭示其实现原理,并预告后续关于主从架构下分布式锁的应用与性能优化内容。
238 0
|
存储 Kubernetes Cloud Native
一文搞懂云原生架构
目前,每个 IT 资源或产品都作为服务提供。而且伴随云计算的滚滚浪潮,云原生(CloudNative)的概念应运而生,云原生很火,火得一塌糊涂,都0202年了,如果还不懂云原生,那真的out了。因此,云原生软件开发成为每个企业的关键要求,无论其规模和性质如何。在加入云计算潮流之前,了解什么是云原生架构以及如何为云原生应用程序需求设计正确的架构非常重要。
一文搞懂云原生架构
|
JavaScript API
浅尝Vue最新状态管理工具Pinia(实战使用Pinia管理登录状态)
pinia是vue新的状态管理工具,也称作vuex5,本文讲解Pinia的使用方法
1184 0
浅尝Vue最新状态管理工具Pinia(实战使用Pinia管理登录状态)
|
10月前
|
Java 编译器 Maven
Java“class file contains wrong class”解决
当Java程序运行时出现“class file contains wrong class”错误,通常是因为类文件与预期的类名不匹配。解决方法包括:1. 确保类名和文件名一致;2. 清理并重新编译项目;3. 检查包声明是否正确。
298 3
|
弹性计算 小程序 关系型数据库
阿里云虚拟主机配置版本选择,共享独享、基础、标准、高级和豪华选择攻略
阿里云虚拟主机提供共享与独享版本,后者包括基础、标准、高级和豪华四种配置。选择依据为网站访问量及图片数量。独享型主机具备独立CPU、内存和带宽,利于SEO。基础版适合个人展示,标准版适用于企业官网,高级版适合博客论坛,豪华版则针对多媒体展示网站。然而,考虑到性价比,云服务器可能是更优选择,其不仅限于网站搭建,还支持多种应用场景,如小程序、App和游戏服务器等。
|
存储 运维 自然语言处理
研发视角:一个需求应该怎么拆解与实现?
研发过程中,开发同学在接到一个需求后,必须要回答两个问题:做什么(WHAT)、怎么做(HOW)。本文就开发与测试在拆解需求时面临的共性问题,结合自己过往的经验,总结的一个实用的方法。本文不讨论技术选型,仅从思考逻辑上总结应该如何拆解与实现一个给定的需求。欢迎讨论。理解需求拆解的关注点以带UI的需求为示例,来看拆解需求过程中的关注点。看下图,停留20秒,思考两个问题:(1)从无到有实现以下需求对应的
75671 10
研发视角:一个需求应该怎么拆解与实现?
|
存储 监控 负载均衡
深入理解微服务架构中的服务发现机制
【6月更文挑战第25天】在微服务架构中,服务发现是确保各独立服务组件能够高效、可靠通信的关键环节。本文将探讨服务发现的基本原理、核心组件以及在现代云原生应用中的最佳实践,旨在为读者提供一套系统化理解和实现服务发现机制的指导思路。
|
设计模式 缓存 Devops
微服务架构最强讲解,那叫一个通俗易懂!
微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的
29665 2
微服务架构最强讲解,那叫一个通俗易懂!
|
机器学习/深度学习 算法 搜索推荐
Elasticsearch:崭新的打分机制 - Learning To Rank (LTR)
【6月更文挑战第8天】Elasticsearch 的 Learning To Rank (LTR) 打分机制通过机器学习改进搜索结果排序,以适应复杂需求和用户行为。传统打分基于词频等,而 LTR 利用训练数据学习更合理的排序,考虑文本、用户行为等特征。示例代码展示了如何在 Elasticsearch 中运用 LTR。尽管实施 LTR 需要高质量训练数据和专业选择算法,但它能处理模糊搜索、多因素排序,提升搜索体验,增强应用价值和竞争力。随着技术发展,LTR 将在 Elasticsearch 中发挥更大作用。
334 6

热门文章

最新文章