理解DevOps
2021-09-03 13:21:17 3 举报
AI智能生成
这个思维导图是帮助大家更深理解DevOps的,大部分人对DevOps的了解可能是片面的,希望对大家有所帮助
作者其他创作
大纲/内容
主题引导
引导听众思考,他们了解的DevOps究竟是什么
引导听众思考,为什么业界这么推崇DevOps,它给我们带来了哪些好处
借用State of DevOps Report 2017 中的数据,展示DevOps为行业带来的巨大改变
DevOps业务价值,下面的指标远远超过低绩效同行
吞吐量
变更部署次数(频繁30倍)
变更前置时间(快200倍)
可靠性指标
生产环境部署成功率(快200倍)
平均服务恢复时间(快168倍)
组织性能指标
市值增长(3年内高出50%)
高绩效者的交付周期是以分钟或者小时来计算的,低绩效者的交付则以周,或者月甚至是季度来计量的。
暗示听众继续思考,他们是否为行业DevOps的实践效果而震惊:为什么DevOps能为行业带来这么大改变
传统软件开发和交付方式及其弊端
状况
混乱之墙
开发,运维,质量(QA)部门独立,各自为政,更重要的是:他们的工作往往是对立的,公司对不同部门的考核和激励不同,阻碍了公司全局目标的实现
开发部门通常负责对市场变化作出响应,以最快的速度将新功能完成并且上线,
IT运维部门要保证客户环境的稳定,尽量避免引入可能导致危害环境的变更,最终运维
我司不允许引入新中间件
高德拉特称这种部门之间冲突为“根本的长期的冲突”,
公司高层制定了他们认为最为合适最为科学的制度,然而正是这种制度,阻碍了公司全局目标的实现。
开发周期长,反馈慢
开发者在进行大量开发工作后,才进行集成,测试,部署,运维
集成失败,例如无法编译
测试工作庞大,测出来问题后,开发者往往需要在很短时间内修复完成
开发环境与部署环境没有经常同步,部署失败
开发者开发时没有考虑运维,导致运维困难
性能
app
错误的中间件使用方式
kafka,autoindex
数据库使用方式
监控指标
配置变更与管理
上面两个因素导致技术债务(ward cunningham)堆积的主要原因
什么是技术债务
指的是我们当前作出的决定会导致一些问题,而这些问题会随着时间的推移越来越难解决。
例子
Google
Netflix
Etsy
例子中提到的三家公司/产品都曾经因为遵循老旧的模式开发而遭遇危机
DevOps的诞生
https://www.jianshu.com/p/f40209023006
精益制造
精益制造运动中最有影响力的图书:《目标》,《凤凰项目》借鉴了《目标》的表现手法,同时借鉴了工业生产的想法。
价值流映射,看板,全面生产维护这些实践起源于丰田生产系统。
两个主要原则
坚信前置时间(Lead Time,也就是总的制造时间,包括加工时间和停滞时间)是提升质量,客户满意度和员工幸福感的最佳度量指标之一。
处理时间是任务实际被处理的时间,不包含在队列中等待的时间,以及因为故障停止处理的时间。
小批量任务交付是缩短前置时间的一个关键因素。
它聚焦于如何通过系统性思考来创造价值。
系统性思考的范围涉及
建立持久的目标
拥抱科学的思维
创造流和拉动(而非推送)的协作模式
提倡从源头保障质量(工厂第一个工作站如果一直接收任务,后续的工作站就会忙的不可开交,甚至出问题)
尊重流程中的所有个体
敏捷宣言
频繁的交付和工作的软件,交付周期可以是数月,数星期,推荐更短的周期
强调小批量的任务进行增量发布,而不是大规模的作业和瀑布流程的发布。
强调建立自组织的小团队,让成员在高度信任的环境中愉悦的工作。
每日十次部署:Dev和Ops在Flickr的协作
Patrick Debois 发起第一次DevOpsDays活动,DevOps 术语诞生
DevOps 理论
基于精益理论,约束理论,丰田生产系统,柔性工程,学习型组织,安全文化,人员优化因素等知识体系
参考了高信任管理文化,服务型领导,组织变动管理等方法论。
它贯彻于整个技术价值流中,涉及产品管理,开发,QA,IT运维和信息安全专员等不同角色
在更低的成本和努力下,保障产品的高质量,可靠性,稳定性和安全性。
DevOps被成为是精益原则,约束理论和丰田套路运动的衍生物,也被视为敏捷运动的延续。
DevOps与传统方式(瀑布模式)的不同
https://devopstech.com/learn/blogs/traditional-it-vs-devops/
代码部署是日常的工作,不是选在周五的午夜开始,鏖战一个周末才能完成,它是在每个人都在办公室的工作日执行,而且通常不会引起客户的注意。
在流程中的每个步骤创建快速反馈,只要代码提交到版本控制系统,就会在测试环境中运行快速的自动化测试,这持续地保证了代码和环境都符合设计预期,并且总是处于安全的可部署状态。
自动化测试可以帮助开发人员快速的发现错误,实现更快速的修复,如果错误是在6个月后的集成测试中发现的,那相关记忆早都消退了,修复时就要提取记忆,这往往需要更长的时间,而且更加容易因为遗漏而犯错。自动化测试使技术债务不再积累。
这种方式,使即使很复杂的发布工作变得稀松平常了。
新功能发布更加顺利,压力更小,而且可逆。
修复已知问题成本也更低,更加可控。
DevOps打破根本的,长期的冲突。
瀑布模式无法完工时会添加人手,预算不足的时候又想尽一切办法缩减开销。
增加开发人员的数量时,由于沟通,集成以及测试开销,单个开发人员的生产力通常会显著下降。《人月神话》。当项目延迟时,增加更多的开发人力,不仅降低了单个开发人员的生产力,而且也降低了整体的生产力。
如何实践DevOps - 三步工作法
第一步-构建从左到右的工作流
技术价值流
DevOps中将技术价值流定义为把业务构想转化为向客户交付价值的,由技术驱动的服务所需要的流程。
流程始于研发部门接受任务,加入待完成列表,然后用敏捷的开发流程把想法转换为用户故事或功能说明,然后用程序代码实现。代码在生产环境中正常的运行并为客户提供服务,所有的工作才产生价值。
指标
部署的前置时间和处理时间
部署的前置时间和处理时间
前置时间是客户能够体验到服务的时间
处理时间与前置时间的比值是十分重要的效率指标,为了实现快速的流动,必须缩短前置时间,即缩短工作在队列中的等待时间。
与制造业不同的是:设计和开发阶段拥有高度的变化和不确定性,导致无法确定总体处理时间;
所以只能在测试(包括客户阶段性测试)和运维阶段努力将可变性降到最低,比如短的(自动化)和可预测的前置时间,接近零缺陷。它力求可预测性,将可变性降到最低。
不提倡在设计开发中串行地完成大批量工作后,再转入测试,运维阶段,相反,我们的目标是采用测试和运维与设计和开发同步的模式,从而产生更快的价值流和更高的质量。
只有工作任务是小批量的,并且将质量内建到价值流的每一个部分时,这种同步的模式才能实现。
常见的场景:为期数月的部署前置时间
等待数月才部署,项目结束后,所有变更合并到一起后,才发现整个系统不能工作,甚至无法编译。
每个问题可能几天甚至几周的时间来定位和恢复
我们的目标:分钟级别的部署前置时间
向版本库中持续的交付代码
交付的代码持续地进行自动化测试和其他的进一步的测试
开发者持续的提前得到反馈,并快速进行修复。
返工指标
完成时间和精确的总花费时间的百分比,反映了价值流中每个步骤的输出质量
想获得返工指标,就问一问下游客户他们有百分之多少的时间收到了“真正有用的东西”
目的
缩短代码变更到上线的时间, 实现从开发到运维再到客户的工作快速地从左向右移动,目的是快速并且持续的发现问题,(接收反馈),解决问题。
相关的实践包括:持续集成,持续测试,持续部署,按需进行环境搭建
具体方法/实践
为了保证工作能够快速的从开发流向运维,各类环境必须能够自动化创建,不依赖运维团队的手动操作
确保一致性,减少了繁琐容易出错的手动操作
所有配置,所有变更都纳入版本控制系统
避免ssh到远程服务器手动修改,所有人都通过版本控制系统中脚本进行变更
实现快速可靠的自动化测试
没有自动化测试,代码越多,测试花费的代价就越多,渐渐的就忽略了测试
没有自动化测试,持续集成可能产生不能正常使用的垃圾
小批量低风险发布:对代码,环境做持续的构建,测试和集成
不是在开发流程结束时才进行产品安全性检查/测试,而是要把其融入日常过哦你工作的一部分。
部署和发布分离
部署是指在特定的环境中安装制定版本的软件,具体的说,部署可能与特性发布相关,也可能无关。
发布是把特定提供给所有客户,或者部分客户。特性发布不需要变更代码。
注意事项
使工作可视化
相对于制造业的生产过程而言,技术行业的价值流中很难发现工作的阻塞点,例如那个环境产生了积压。
技术工作流的流转过于简单,鼠标操作太过容易,轻易的就可以将工单转到其他团队,工作容易被踢来踢去,直到无法按时向客户交付产品,或者程序在生产环境中出现问题。
为了识别工作在哪里流动,排队或者停滞,需要尽可能的将工作可视化。
可视化方式
看板,从一个工作中心,拉取到下一个工作中心,最终达到最后一个中心(完成,已上线)
就绪-审查-开发中-开发完成-集成-集成完成-部署-部署完成-已经上线/交付
限制在制品(WIP)数量
生产中断在制造业里面很显眼,代价特别高,正在进行的工作戛然而止,所有的半成品可能报废,然后再启动新一批作业。这种高昂的代价让人们不希望中断的发生。
技术工作很容易被打断,工单系统,报警,邮件,电话,即时通信工具等。
使用看板工作时,可以限制多任务的出现。
控制队列长度是一个非常强大的管理工具,因为这是影响前置时间的重要因素之一,对于大多数工作任务而言,在他们完成之前,并没有办法预测到底需要多长时间。
减少批量大小
大批量/大规模生产的一个缺点是导致在制品数量增多,最后导致前置时间长,产品质量差的后果----如果发现一个车身板有问题,整个批次都要报废。
精益理论,为了缩短前置时间和提高交付物质量,应该持续不断的追求小批量模式。#936
相较于大批量生产,用户能提前很长时间看到阶段性产品,进而提供更加及时的反馈。(前置时间更短,错误检测更快,返工量更少)
大批量的副作用,将一整年的成果一次性发布,这种大批量的发布会造成大量的突发的在制品,导致所有下游工作站大规模混乱,质量下降。因为生产环境变更越大,问题的定位就月困难,开发者debug和回忆的时间也更长,进而修复时间也越长。
减少交接次数
代码在价值流流转过程中,经过的部门/节点越多,在队列中等待的几率就越多,前置时间就会越长(请求,委派,通知,会议,协调,优先级,调度,测试验证等),进而导致延期。
持续识别和改善约束点
为了缩短前置条件,需要不断识别并改善约束点
高德拉特:任何价值流中,总有一个流动方向,一个约束点,任何不针对约束点而做的优化都是假象。如果我们在约束点之前进行优化,那么工作必将在这个约束点上更快的积压起来。反之,如果在约束点之后优化,被约束的节点可能处于饥饿状态,因为一直在等待约束点工作的结束。
消除价值流中的困境和浪费
制造业
浪费
精益中对浪费的定义:使用了超出客户需求和他们愿意支付范围对任何材料和资源的行为。
精益中七种浪费的类型:库存,过量生产,过度加工,运输,等待,移动,缺陷。
现代精益的理念:消除一切浪费
逆境
技术业的浪费和困境
半成品
没有彻底完成的工作
需求文档
尚未审核的变更单
队列中的工作
部分完成的工作会逐渐地过期,随着时间的推移最终失去价值
额外工序
交付过程中的额外工作
下游工作中心从没使用过的文档
不必要的评审,审批
额外功能
客户完全不需要的镀金功能
增加开发时间
增加测试和管理的复杂度
任务切换
等待被处理
移动
不在一起办公,人员的移动,额外的沟通产生的时间浪费
缺陷
需要额外的工作量确认,解决,在客户环境上修正
非标准或者手动操作
不能自动化反复重建的服务器,测试环境和配置
理想情况下,任何需要依赖运维团队手动完成的操作都必须自动化
填坑侠
某些人不停的救火,影响他正常的工作
第二步-从右到左的持续反馈
目的
现代系统往往非常复杂,通常只有在发生重大故障的时候,才能发现问题所在,例如遇到大规模用户服务中端,或者安全漏洞导致客户数据泄漏。建立快速,频繁的反馈,就可以在规模较小,修复成本较低的情况下发现并修复问题。我们应该在灾难发生之前消除问题。
复杂系统的本质
各个组建紧紧的耦合在一起
相同的事情做两次,结果未必相同
没有办法设计出绝对安全可靠的系统,但可以采取下面的措施让复杂系统更安全的工作
管理复杂的工作,从中识别出设计和操作的问题
群策群力解决问题,从而快速构建新知识
在整个组织中,将区域性的新知识应用到全局范围
领导者要持续培养有以上才能的人
整个价值流里存在着快速频繁和高质量的信息流,每个工序的操作都被度量和监控,任何缺陷或者严重偏差都能被快速的发现和处理。这些是保障质量,安全和持续学习与改进的基础。
技术流中,包括产品管理,开发,QA,信息安全,运维,缺少快速的反馈,及时的反馈
实践
遥测系统
建立大规模的监测系统
业务层,应用程序,环境层收集数据
可视化,趋势,告警,异常检测
日志分析
认证,授权的结果
系统数据的访问
系统和程序的变更
数据的变更
无效输入(恶意输入等)
启动/关闭
故障和错误
延迟
备份成功/失败
使用遥测系统指导解决问题
将建立遥测系统融入日常工作
建立服务指标,为了服务指标对系统进行持续性提升
发现和填补遥测的盲区
业务级别
应用程序级别
基础架构
数据库,操作系统,网络,存储
通过遥测数据进行必要的检测和报警
注意事项
及时发现并控制这些问题,直到拥有对策,这是所有现代流程优化方法的一个核心原则,能够创造出学习型组织和改进型组织。
时刻为下游工作优化,精益原则认为我们最重要的客户是我们的下游
技术价值流中,我们通过运维而设计来为下游工作中心做耦合,包括运维的非功能性需求(架构,性能,稳定性,可测试性,可配置性,安全性),与用户功能同样重要。
第三步,创造持续学习和实验的实践
目的
持续的缩短和放大反馈环,创造更安全的系统,也能承担更多的风险,并进行试验,帮助自己比竞争对手改进的更快,进而在市场竞争中战胜他们。
持续的经验积累,组织内部可以相互借鉴彼此的经验和智慧。
实践
故障注入的方式增加环境的可靠性
Netflix捣蛋猴
预留时间开展组织的改进和学习活动
犯错不指责,鼓励分享,
将局部知识分享给所有人
尽可能广泛公开错误和事后分析结果
github的聊天机器人
运维和聊天室集成,有助于记录和分享我们观察和解决问题的过程
检查健康状况
维护模式屏蔽告警
部署失败时调出冒烟测试的日志
接收消息
源代码库接收到代码
环境部署流水线中的变动
等等等等
加强了透明协作的文化
注意事项
不点名,不责备,不羞辱
精确的预测出复杂系统中的问题是不现实的,意外总会发生
这样的事故处理会阻碍安全调查,让工作者感到恐惧,整个组织更加官僚,信息闭塞,责任逃避,滋生自我保护意识。
把日常工作的改进制度化
如果团队没有能力或者意愿去改进现有流程,那么就会持续饱受眼前问题的困扰和折磨,而且痛苦指数还会与日俱增。
比日常工作更重要的,是对日常工作的持续改进
预留时间改善日常工作,所有人都可以在可控的时间内发现问题和解决问题。
偿还技术债
修复缺陷
重构代码
优化性能能
持续改进模式替代应急救火模式
如何推进DevOps
合适的价值流作为切入点
它决定了转型的难度
也决定了转型时参与者
绿地和棕地项目
记录型系统和交互型系统
扩大范围
找到创新者和早期采用者
赢得沉默的大多数
识别钉子户
提高工作的可视化
强化共同目标
将测试,运维和信息安全融入日常工作
测试运维加入每日站会和回顾会议
结语 - 错觉:不要把DevOps过程当作目标
过程
各个部门精诚合作,共同解决问题。
缩短代码上线时间。
构建持续交付和持续集成系统。
构建监控系统,监测生产环境,处理报警报警。
很多资料(尤其是国内资料)上都错误的认为企业中有上面的设施和要求就做到了DevOps了,实际上我们的目标(重点)应该是在建立了基础设施后:
基本目标
持续发现问题,解决问题:确保信息是流动的
持续开发,持续集成,持续测试,持续部署,持续反馈
开发,测试,质量/安全保障并行
持续优化信息流:确保信息流动越来越快
主动发现并解决流程中的瓶颈,加速工作流,逐步缩短周期
终极目标
主动发现并解决问题
逐步提高业务指标
如主动优化SLA
主动发现新问题,提升系统健壮性
如捣蛋猴
预留时间进行分享与持续学习
不责备
主动分享
全局分享
0 条评论
下一页