没有使用IaC的DevOps系统都是耍流氓 |IDCF

作者:徐磊

文章首发地址:https://smartide.cn/zh/blog/2022-1010-iac/

作为现代软件工程的基础实践,基础设施即代码(Infrastructure as Code, IaC)是云原生、容器、微服务以及DevOps背后的底层逻辑。应该说,以上所有这些技术或者实践都是以基础设施即代码为基本模式的一种或者多种方法的集合。基础设施即代码并不是一种特定的技术,而是一种解决问题的思路。本文将从基础设施即代码的含义,原则和落地方法三个层面来帮助你理解为什么没有使用IaC的DevOps系统都是耍流氓。

什么是IaC

基础设施即代码的目标是解决一个古老的问题如何能够安全、稳定、快捷、高效得完成软件交付过程。注意这里的交付并不仅仅指将可部署的软件部署到最终的运行环境,而是更宽泛的概念上的交付,也就是将软件从一个看不见摸不到的想法或者创意,转变成用户可以操作并使用的一个系统。这个过程涉及软件创意的捕捉、设计、计划、开发、测试、部署和发布的全过程,也包括软件发布之后收集用户反馈重复启动以上过程的迭代。这个迭代在软件的整个生命周期里面会一直重复下去,直到这个软件不再有人使用,寿终正寝。

 

图片

 

软件生命周期中的这个持续的迭代过程构成DevOps反馈环路的概念,在这个反馈环路的左右两端分别是Dev和Ops,而代码和基础设施正是Dev和Ops最重要的工件(Artifact),Dev维护代码,Ops维护基础设施。传统意义上,代码和基础设施是有明确的界限的,一般来说:代码特指应用代码,而基础设施则是除了应用以外(或者以下)的所有“基础”组件。

图片

在云计算技术出现以前,硬件被普遍认为是一旦创建就无法改变的,就好像你购买一台电脑,如果希望更换其中的CPU,内部,磁盘以及网卡,那么都必须重新购买相应的组件并重新组装。云计算将计算资源(电脑)解偶成了可以随意组合的计算、存储和网络三种资源类型,允许用户根据需要自助的进行组合。其底层实现机制是将硬件软件化,比如:对象存储技术和软件定义网络(SDN)就是云计算的基础技术。硬件被软件化之后的结果就是我们可以通过配置来变更硬件的能力。这其实就是基础设施即代码的最基础的含义。

但是对于用户而言,其实并不关心所使用的软件到底运行在什么硬件,什么云上面。比如:对于用户的社交需求来说,微信就是社交需求的基础设施;对于需要编写文档的用户来说,WORD就是他的基础设施。相对于硬件,这其实是基础设施的另外一个极端含义,也就是:任何支撑用户完成某种操作的支撑能力,都可以成为用户这一类别操作的基础设施。

从这个极端含义的角度来说,以上环境堆栈中的任何一层都可能成为上层的基础设施。为了能够为上层提供类似云计算的自助化能力,都需要提供可配置性。为了满足这种可配置性的需要,IT行业里面就出现了容器化技术、Kubernetes、Terraform、Azure Resource Manager等等基础设施即代码的实现方式。其实这些技术解决的都是一个问题,也就是系统的可配置性问题。

IaC的实现原则

实现可配置性能力的方法很多,传统运维的做法其实很简单,就是通过脚本来自动化这个配置过程,让原本繁琐的配置过程自动化起来。

 

图片

 

自动化脚本的方式虽然能够在一定程度上解决可配置问题,但是当系统变更频繁程度到达一定量级的时候,维护自动化脚本的工作量将会抵消自动化脚本所带来的效率提升,这个时候运维团队会发现采用人工处理的方式甚至比编写和维护自动化脚本更加高效。因此,在当今软件迭代速度越来越快的背景下,自动化脚本逐渐无法满足团队应对快速变化的市场的需要。我们需要一种能够能够允许团队轻松适应快速变化的环境维护方式,基础设施即代码(Infrastructure as Code, IaC)就是在这样的背景下诞生的。实际上,说诞生并不准确,IaC其实是工程师们在遇到问题之后持续改进的结果。

当维护自动化脚本的方式无法适应快速变化的市场需要的时候,如何让开发和运维团队解偶就变成了解决这个问题的核心。在上图左侧的工作模式中,问题的核心是开发和运维团队之间基于“请求-响应”的工作模式,这种工作模式让开发和运维团队相互依赖,无法独立的按照自己的节奏工作。为了解决这个问题,IaC借用了大规模软件架构设计中的分层原则,让那些需要被共享的能力变成通用组件,并在开发和运维之间共享这些组件,从而让本来互相依赖的两个团队变成依赖另外一个第三方组件。如下图:

图片

 

为了能够通过第三方组件协同工作,IaC方式需要遵循几项关键原则

  • 声明式(Declarative):为能够让所有编排能力独立于开发和运维团队,任何一个团队都不应该将能力的具体操作保留在自己的团队中,采用声明式配置可以确保这一点,因为配置中只有声明没有具体逻辑,就意味着原来的依赖双方都必须将公用能力贡献出去,否则上图中的C就无法生效。

  • 幂等性(Idempotence):进一步来说,声明式配置必须能够在任何时候确保环境编排的结果,也意味着通用组件C中对于环境的操作必须能够在任何状态下执行并且获得一致的最终结果。换句话说,无论目标环境处于初始状态,中间状态,最终状态还是错误的状态,当加载声明式配置以后,都会变成我们需要的理想状态(Desired State)。

    IaC的落地方法

    从本质上来说,IaC是一种做事情的方法,实现IaC的方法和工具只要遵循以上原则,都可以帮助团队落地这种方法。在实际工作过程中,我们需要一些基本条件才能够实现IaC:

    文化支撑

    落地IaC将改变团队(特别是开发和运维团队)的工作模式和协作方式,双方的工作边界和职责都会发生变化。传统模式下,开发和运维团队通过流程进行协作,双方在需要对方配合的时候发起一个流程(发出请求),等待对方按照要求完成操作(给出响应)之后继续这个流程直到目标达成。而IaC则要求双方通过共享能力进行协作,双方需要持续发现协作中阻碍对方独立工作的问题点,一起将解决这些问题的能力贡献给另外一个双方共享的组件(一般是一个工具),在日常工作中不再依赖流程驱动对方,而是使用这个共享的组件(工具)完成工作。IaC的工作模式要求两个团队都接受不确定性思维方式,出现问题的时候要共同解决问题而不是界定和追究责任。如果团队中的文化不允许这种不确定思维方式的存在,IaC将无法落地。

    共享工具

    具备以上文化支撑的团队,需要共同构建一个双方都认可的工具,将双方都需要的环境编排能力全部封装到这个工具中。这个工具的核心目标有两个:

    解偶:让双方在日常工作中不再依赖对方,可以按照自己的节奏和工作模式自由的使用,同时确保双方关注的标准,规则和策略都可以被正常落实并可以被监督。

    可定制可演进:这个工具存在的目的就是为了能够适应不停变化市场需要,一个静态的工具是无法做到这一点的,只有那些具备了高度可定制性和扩展性的工具才有可能具备这样的能力。因此在设计和实现这个工具过程中做到功能粒度的控制就变得至关重要,如果所有的功能都按照日常业务流程设计,不考虑通用性,最终的结果就是任何的工作流程变更都会造成工具的变更,这样的工具也就失去了通用组件的存在价值。

    IaC无处不在

    实际上,云原生,微服务,容器化和DevOps都是在从各个不同的层面践行IaC。云原生强调利用云的基本特性赋能团队,其实就是利用上述云计算的底层技术为团队提供实现IaC的基础条件。微服务则是通过组件化的思维让多个团队可以独立自主的工作,不再受到其他团队的影响从而最大化团队工作效率。容器是在云计算技术的基础上,为操作系统以及其上层的环境堆栈提供IaC能力,包括Docker和Kubernetes为代表的主要容器工具都是基于声明式配置和幂等性原则设计的。

    DevOps在这里又是什么呢?DevOps是以上所有这些概念,方法和实践的综合,实际上DevOps的范畴比这个还要宽泛。开头的那张图上你应该可以看到,从广度上来说,围绕Dev和Ops构成的这个无限环其实涵盖了软件交付过程的所有环节,从深度上来说,DevOps又可以涵盖文化理念、管理方法、商业创新、敏捷和精益、项目管理、团队管理、技术管理和工具实现的全部层次。以至于越来越多的人将越来越多的内容放在DevOps这顶帽子下面,出现了诸如:AIOps, GitOps, TestOps, DevSecOps, BizDevOps等很多扩展概念。

    其实,我们不必纠结这个概念本身,因为来自于社区自发总结的DevOps本来就没有一个集中的知识产权所有者,也就没有人能够给予它一个明确的释义。这本身其实也是一件好事,因为就如同以上对IaC的分析解释一样,DevOps的存在也是在帮助我们持续改进的,如果它本身变成一个静态的方法集或者工具包,又如何能够适应当前不断多变的商业环境和市场需要呢?从这个角度来说,所有那些希望将DevOps进行标准化的所谓认证,体系和方案其实都是一种带有误导性的行为。

    很多的企业在引入容器技术,微服务,云原生以及DevOps的过程中仍然在延续原有部门结构和工作流程,并且试图将这些新技术新方法融入到现有的流程中,而不是探索新技术新方法带来的全新可能性。我在过去十多年帮助企业实施落地DevOps的过程中遇到了太多类似的组织,其中最明显的表征就是你会发现那些推动DevOps实施落地的部门不停的界定责任,造锅甩锅,那么他们一定是在用DevOps耍流氓。以上我所描述的IaC的工作思路对这些人来说从来都不重要,他们不在乎问题出现以后的根源分析和改进措施,相反如果根源分析的结果让锅到了自己头上,那么宁可不分析;如果改进措施的结果是需要自己将一部分职能贡献出去,那更加不能做。最后的结果就是那个“共享工具” 里面埋藏了各种补丁,硬编码流程以及技术债务,可想而知这样的工具又如何能够承载不确定性,如何能够帮助其他部门提高效率,更不要提为组织提升总体效能了。对了,这个埋藏了大量定时炸弹的工具就是你们热衷的那个“一体化研发平台/DevOps平台”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/15371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

layui框架学习(34:数据表格_基本用法)

Layui中的数据表格模块table支持动态显示并操作表格数据,之前学习的页面元素中的表格主要是通过使用样式及属性对表格样式进行设置,而table模块支持动态显示、分页显示、排序显示、搜索等形式各样的动态操作,参考文献3中也给出了数据表格的各…

Git初始化

查看git版本 git --version 设置Git的配置变量 方法: 修改全局文件(用户主目录下.gitconfig)修改系统文件(如/etc/gitconfig) 用户姓名和邮件地址 修改用户名和邮件地址 git config --global user.name "用…

LLM系列 | 18 : 如何用LangChain进行网页问答

简介 一夕轻雷落万丝,霁光浮瓦碧参差。 紧接之前LangChain专题文章: 15:如何用LangChain做长文档问答?16:如何基于LangChain打造联网版ChatGPT?17:ChatGPT应用框架LangChain速成大法 今天这篇小作文是LangChain实践专题的第4…

Qt: 查看qmake相关参数设置

Qt开发中,经常会遇到qmake相关问题,比如同时安装了多个Qt版本的情况。比如我的情况是系统自带了Qt 5.12.8, 但是开发中遇到一些兼容性问题,于是又手动安装了5.9.8。 查看qmake版本,qmake -v, 虽然项目中已经指定了5.9.8, 但是系统…

爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB

目录 一、网站分析二、定位监听三、熟悉AES-ECB四、调试分析五、node运行js六、Python执行js 一、网站分析 三年前的案例,我的原始文章网站 ,如图我们直接点击标题进入到详情页,链接会发生跳转,且与我们在详情看到的链接&#xf…

iOS开发-格式化时间显示刚刚几分钟前几小时前等

iOS开发-格式化时间显示刚刚几分钟前几小时前等 在开发中经常遇到从服务端获取的时间戳,需要转换显示刚刚、几分钟前、几小时前、几天前、年月日等格式。 主要用到了NSCalendar、NSDateComponents这两个类 NSString *result nil;NSCalendarUnit components (NSC…

【后端面经】微服务构架 (1-6) | 隔离:如何确保心悦会员体验无忧?唱响隔离的鸣奏曲!

文章目录 一、前置知识1、什么是隔离?2、为什么要隔离?3、怎么进行隔离?A) 机房隔离B) 实例隔离C) 分组隔离D) 连接池隔离 与 线程池隔离E) 信号量隔离F) 第三方依赖隔离二、面试环节1、面试准备2、基本思路3、亮点方案A) 慢任务隔离B) 制作库与线上库分离三、章节总结 …

以智慧监测模式守护燃气安全 ,汉威科技“传感芯”凸显智慧力

城市燃气工程作为城市基建的重要组成部分,与城市居民生活、工业生产紧密相关。提升城市燃气服务质量和安全水平,也一直是政府和民众关注的大事。然而,近年来居民住宅、餐饮等工商业场所燃气事故频发,时刻敲响的警钟也折射出我国在…

MySQL高级篇第4章(逻辑架构)

文章目录 1、逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors1.3 第一层:连接层1.4 第二层:服务层1.5 第三层:引擎层1.6 存储层1.7 小结 2、SQL执行流程2.1 MySQL 中的 SQL执行流程2.2 MySQL8中SQL执行原理2.3 MySQL5.7中SQL执行原理2.4…

9条建议告诉你如何正确处理PCB设计布线

一、关于PCB布线线宽 1、布线首先应满足工厂加工能力,首先向客户确认生产厂家,确认其生产能力,如图1所示。如客户无要求,线宽参考阻抗设计模板。 图1 PCB板厂线宽要求 2、阻抗模板,根据客户提供的板厚及层数要求&…

LeetCode208.Implement-Trie-Prefix-Tree<实现 Trie (前缀树)>

题目: 思路: tire树,学过,模板题。一种数据结构与算法的结合吧。 代码是: //codeclass Trie { private:bool isEnd;Trie* next[26]; public:Trie() {isEnd false;memset(next, 0, sizeof(next));}void insert(strin…

【环境配置】使用Docker搭建LAMP环境

这篇文章不是介绍DOCKER是什么,也不是阐述DOCKER的核心:镜像/容器和仓库之间的关系,它只是一篇让刚刚接触DOCKER的初学者,在没有完全了解DOCKER是什么之前,也能尽快的在Linux系统下面通过DOCKER来搭建一个LAMP环境,这是其一&#…

工作中遇到的关于配置问题

工作中遇到的问题 想记录一下 一个程序员小白每天遇到的问题 1.创建了一个Maven的web工程,但是启动一直是404,原服务器未能找到目标资源 解决办法: 选择deployment,点击加号选择war格式就OK啦 目录里面无法创建类&#xff0…

深蓝学院C++基础与深度解析笔记 第13章 模板

1. 函数模板 ● 使用 template 关键字引入模板&#xff1a; template<typename T> //声明&#xff1a;T模板形参void fun(T); // T 函数形参template<typename T> //定义void fun(T) {...}– 函数模板不是函数 –…

【C/C++】类之间的纵向关系——继承的概念

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

分享一篇详尽的关于如何在 JavaScript 中实现刷新令牌的指南

介绍 刷新令牌允许用户无需重新进行身份验证即可获取新的访问令牌&#xff0c;从而确保更加无缝的身份验证体验。这是通过使用长期刷新令牌来获取新的访问令牌来完成的&#xff0c;即使原始访问令牌已过期也是如此。 通常&#xff0c;当用户登录时&#xff0c;服务器会生成一对…

CentOS 8 上安装 Nginx

Nginx是一款高性能的开源Web服务器和反向代理服务器&#xff0c;以其轻量级和高效能而广受欢迎。在本教程中&#xff0c;我们将学习在 CentOS 8 操作系统上安装和配置 Nginx。 步骤 1&#xff1a;更新系统 在安装任何软件之前&#xff0c;让我们先更新系统的软件包列表和已安…

关于提示词 Prompt

Prompt原则 原则1 提供清晰明确的指示 注意在提示词中添加正确的分割符号 prompt """ 请给出下面文本的摘要&#xff1a; <你的文本> """可以指定输出格式&#xff0c;如&#xff1a;Json、HTML提示词中可以提供少量实例&#xff0c;…

nosql之redis集群

文章目录 一.redis集群1.单节点redis服务器带来的问题2.集群redis3.集群的优势4.redis集群的实现方法5.redis群集的三种模式5.1 主从复制5.2 哨兵5.3 集群 二.Redis 主从复制1.主从复制概念2.主从复制的作用3.主从复制流程4.搭建Redis 主从复制4.1 安装 Redis4.2 修改 Redis 配…

【iToday】涵盖100+技术网站的一站式资讯平台 | 文末送书

里面包含了上百个IT网站&#xff0c;欢迎大家访问&#xff1a;http://itoday.top/#/ iToday&#xff0c;打开信息的新时代。作为一家创新的IT数字媒体平台&#xff0c;iToday致力于为用户提供最新、最全面的IT资讯和内容。里面包含了技术资讯、IT社区、面试求职、前沿科技等诸多…