DevOps 的道术法器,探寻 DevOps “立体化”实践之旅
引言
随着业务的发展,软件发布迭代的频率越来越高,传统的瀑布型模式已经不能满足快速交付的需求,DevOps 也因此受到持续关注。越来越多的公司开始接受并尝试使用 DevOps,期望能使得软件开发中的构建、测试与发布工作变得更加快捷、频繁和可靠。
DevOps 究竟是什么,它想要解决的是什么问题?为什么 DevOps 很好,但却很难落地,其中的阻力是什么?DevOps 的采用现状如何,那些成功的公司都做对了什么?本期「TVP 技术夜未眠」邀请了前易宝技术中心负责人、腾讯云 TVP 刘斌老师与腾讯云 CODING DevOps 高级解决方案架构师——陈钧桐老师一起畅聊 DevOps,分享在行业内的落地实践经验,帮助大家更好理解、规划和实施 DevOps。
如何定义DevOps? 其究竟是要解决什么问题?
陈钧桐:DevOps 客观来说没有一个官方定义,我们现在市面上大概有三种讲法:
维基百科对 DevOps 的定义是 Development 和 Operations 组合词,它通过自动化的软件交付、架构变更的流程使得更加快捷和可靠。这也说明了 DevOps 是强调开发和运维密切做协作,并且强调通过自动化的方式让整个流程进行改善。
亚马逊云对 DevOps 的定义是它是一种集文化、理念、实践和工具于一身。出发点就认为它们是密不可分的,目的是提高交付能力,它更突出的是传统的开发和运维的出发点,是有帮助组织更好改进或者服务。
Atlassian 提出 DevOps 是一套实践,用于自动化集成软件与 IT 团队之间的流程,以便做到更快的软件发布。它对 DevOps 的定义也是包括了运营这个词,弥补了之前的鸿沟,它强调的是实践,并且强调的是弥补以前开发和运维两个团队之间的鸿沟。
综上,我们可以看到如果做一个大概的定义,DevOps 包含了文化、流程、工具和实践,并且这几者之间的关系是密不可分的。
DevOps 初衷是通过工具平台、流程或者人的文化结合,建立一种可以持续快速安全交付高质量的流程改进。前面来讲它的初衷是让整个组织的用户价值交付更加快速高效,它里面又包含了文化、流程和工具,以及很多的实践,它们之间是密不可分的,所以我们不用太纠结于它的定义如何,只要它能达到我们的目的,那我们可以采用这样一种原则的集合。
为什么DevOps很好,但却很难落地? 曾遇到什么难题或阻力?
刘斌:我在易宝做 DevOps 转型的时候确实遇到一些困难,后来也去过蚂蚁,大家对基建确实有很多呼声,都很渴望能改造好,但是我发现达到一种理想的状态各有各的难题。业务快速增长的时候大家会比较排斥基础设施上的折腾,如果工作人员对 DevOps 的理解不是很深刻,会很难做到围绕业务的推进和实施,这些问题导致 DevOps 会变得很难推动。
再有就是传统运维的思路难以转变,传统运维关注的是设备是否稳定,更希望专注自己的领域,各司其职,并不服务于开发者或业务。所以这个思维如果不转变就遇到很大困难,当时我负责的运维团队里就有人觉得我好像一直让大家服务于开发,从而引起不满。开发和运维互相不理解也是一大难处。
我自己遇到的难题和阻力就是从「运维硬刚开发」转变成「运维服务开发」,这个转变是有比较大的困难。再一个是从「互相甩锅推责」变成「主动揽责」的转变,因为我当时的逻辑就是你配合我的改造,责任我来承担。当然会有人觉得特别不理解,觉得特别傻,但是挺过之后就好很多了。
再就是我们要注意寻找业务上的抓手,少说一些比较空洞的话,尽量从业务价值上找价值点,和业务开发的团队找到一个大家共同受力的点推动这个事情,甚至 KPI 或者 OKR 上都可以写成类似一个产出。
还有一个问题就是要坚守我们的核心架构。我非常反对「好的实践就是 DevOps,不好的实践就是 DevOps 反模式」。我们不能根据问题的难易程度来做取舍。还有就是坚持不可变基础设施,否则的话有可能会转变成一个非常凌乱的、针对大家抱怨提的需求来做一些零碎的工具,我感觉主要是这三个阻力和难题。
实施DevOps有哪些常见的坑?
刘斌:我说一下除了推动别的团队所受的阻力外,我们自己内部的一些坑。其中一个很大的坑就是运维容易把运维自动化等同于 DevOps,可能有些人会这么想。但我认为 DevOps 应该先做贴近于业务开发的事情,而不是只把运维的自动化做得特别好。如果把自动化等同于 DevOps,可能会导致沟通模式还是开发在找运维解决问题,然后运维再基于自己挺满意的自动化运维工具操作服务于开发,这样就是没有做到 DevOps。本质上应该让开发自己去自主运维,大家都对自己的事情负责,而不是委托给别人做完操作再让他去看结果。
另外一点就是我发现我当时团队里在做 DevOps 平台和工具的时候过早关注界面,可能觉得要先把先进的理念展示出来,但其实这种做法是本末倒置的。
我觉得 DevOps 应该从交付物出发,交付物指的什么呢,就是源代码、配置信息,打出的包,镜像,或者测试脚本,甚至包括日志。例如这个交付涉及的环境或者你希望它的运行是不是 DevOps 的;你的自动化测试是不是真的可以自动执行,而不是只是一个触发工具,更多还是依赖人工。再有是日志的管理,还有包括监控的事件能否对应起来。这个就是整个围绕运维这块的几个对象,你的建模、标签是否能串起来,需要先把这些事情做好,哪怕先找一个简单的开源软件,甚至你用商业软件也要先把这个问题先考虑清楚,之后再考虑界面上该怎么用。因为我遇到过很多做得非常漂亮,但是大家用起来很难受的界面。实际上也增加了使用的复杂性。所以我觉得对制度、交付的约定是一个最优先的事情,非常难以反过来,我认为这也是一个坑。
DevOps需要打通部门之间的“墙”, 您觉得最困难的地方是什么?
刘斌:从我自己的经验,当时 DevOps 的八字循环,左边是 Dev,右边是 Ops。那个循环我当时感觉右侧的环是相对好推进一些,大家做 DevOps 也可以考虑先做右边的环,很容易出效果。左边的环我觉得非常困难,因为对开发人员的工作方式侵入比较多,毕竟需要自动化测试。他们的工作离业务更近,业务压力也更大,所以非常难推动,这是一点。
如果单从部门之间的“墙”而言,我认为最重要的是改变运维的服务意识,这个说起来有点虚,但是也是最核心的,而且是我当时一直在团队里反复关注的事情,大家很清楚技术都是为业务服务的,我们整体的阵型应该更贴近业务,而不是下沉夯实自己的基础。例如我当时遇到运维团队非要做自动化运维工具,这样会花费更多的精力,人肯定离业务越来越远,这思路是错的,只会导致自己思维守旧。如果我们关注于服务业务会看到更丰富的场景,看到更高的挑战,这个是最困难的,因为必须得有对业务的服务意识。所以我会反复盯这个团队里大家是否把这个思维转变过来了。
陈钧桐:本质上还是团队之间思维的转变是很重要的事情。大家要对齐认知和目标,要持续地和大家讲事情是如何推进,目标是什么。我们从认知到真正的落地实践中间还有很大的隔阂,需要不断磨合。
其实我自己对这个话题也有点感慨,以前我也是开发,会更关注代码,但是我们怕大家沉溺于写工具代码去了,实际上你做的事情可能是在你团队的第一个,但是放大到市面上或者业界有很成熟的工具或案例,不管是开源的还是商业的直接去用就好了,我们的目的并不是生产基础设施,它的目的是有一个使命、价值观和愿景,要把这个东西转换成金钱的收入的一个商业链条,中间我们做的种种事情只是手段之一而已。我们更加关注的还是业务价值的交付,这个业务价值以前开发会觉得产品很难沟通,但实际上我们在 DevOps 的文化里更加强调于沟通和协作,大家交付的目的是一致的,更有利于打破部门墙。
DevOps实践情况如何? 那些成功的企业有何共同点?
陈钧桐:其实现在 DevOps 这种实践很多企业都会运用,因为这些东西是为了交付业务价值,绕开这个话题,其实它只是一系列原则的打包,只要我们做的任何动作有益于我们想追逐的东西,那么我们可以说它实践了 DevOps。
成功案例大家可能会比较关注国外的先进公司,以谷歌为例,我们梳理一下谷歌研发模式的变革过程,当时他们第一个变革点就是对测试下手,开始招聘具有测试思维的开发人员,整个测试开始向测试开发转型。然后就是运维,开始招有开发经验的运维,加上 SRE 角色的转型,当然这是第一时代。到了 2008 年他们就做了第二次变革,他把测试开始的横向延伸至整体研发效能的领域。从 2013 年到 2014 年进行了第三次变革,针对工程效率,通过开发的工具、基础架构、指标分析做了一个精细化的运营,针对运维 SRE 的工程实践也可以对外输出一些能力,整体的方向是向自动化和智能化发展。
我们分析谷歌的这三个变革可以发现关键岗位和人员它的要求有以下几点变化。第一点是开发需要对整个软件生命周期的质量负责,包括最基本的执行单元测试,要做自动化部署。第二点,测试研发效能提升转型,现在把整个招聘标准按照开发能力做严格升级,这样也是一个重要的变革点。第三点是向运维开发 SRE 转型,关注的是整个运维系统工具化和智能化,并且有一个隐性的要求,50% 的时间 SRE 用于开发,并且它在变革的过程中会有意识地培养大家的质量意识、安全意识等,这是一个整体持续渐进的过程。我们可以借鉴其中的某些点应用到自己的环境中,比如说规律性的定期培训,统一大家的意识,制定统一的规范,然后在招聘人员的标准上有意识做一些区分。
它的变更模式是自上而下、有高层的支持,这个对国内来说非常重要。
如何平稳落地DevOps?
刘斌:第一点还是要贴合业务和业务开发那边做 DevOps 的建设,不需要追求工具的完备性,不要等工具都完善了才去做另外的事情。我们当时是结合诉求最强烈的点来推动 DevOps 的实践,这是一方面。当时我们做的时候就是从现象可观测,让开发能快速查出问题,所以要从业务价值上找抓手。另外就是从一个横向面去推动,会有很多东西会配合做这个事情。
另外一个我们说要服务于开发,但实际上也不能太顺着开发的需求走,不然可能陷入到一种杂事的鏖战里,有种思路就是你在做这个事情的时候得找个锚点,这个锚点得影响他去往你期望的方向思考这个问题。我觉得这个还是需要引导的,这个锚点实际上就锚定了他的关注点,关注点如果关注错了就陷入到一种需求实现的汪洋大海里去了。
有哪些比较推荐的DevOps工具分享?
陈钧桐:我简单分类列举一下,整个软件开发最开始有代码,有代码就要做代码托管,代码托管的工具有大家耳熟能详的 GitHub,有 Bitbucket、GitLab,包括 CODING 也是在 2014 年的时候在做国内的代码托管工具。
源代码打完包之后我们叫制品,制品的管理工具这里也有一些选择,比如常见的 JFrog 的 Artifactory;然后是 Harbor,它更专注于 Docker;还有 Nexus 等。
接下来就是持续集成工具,就是 CI,这里有 Jenkins、CI,包括 GitHub,本来它是没有这个功能的,后来它也上了,还有 Travis。
有了制品就要运转到生产环境上去我们需要持续部署,持续部署也有很多的工具,有 Spinnaker。还有很多一站式的工具,GitLab、GitHub,包括国内 CODING 也是做一站式的解决方案,也是覆盖了需求的诞生,甚至前面 OKR 目标的拆解,到最后的交付上线,CODING 都有一整套的产品方案,感兴趣的同学可以在腾讯云的官网搜索 CODING,可以更加具体地了解我们的产品。
对企业而言,比较推荐根据现状去选择更合适自己的工具,比如说如果这个企业自身的研发能力很强,它的业务复杂度不高,只是对某个研发阶段有一些痛点,就可以用单点的工具做组装。如果企业本身的研发资源有限,或者说它的目标专注度更在业务场景,这个时候可以选择一些一站式工具,比如 CODING,当然我们在这个环节里还有其他的角度,比如说重视质量,重视安全,这些里面都有一些插件,我们在一站式的平台里也可以针对企业关注的点对插件做集成和嵌入。
DevOps是否会成为一种趋势?
刘斌:我说这个问题的时候先从运维发展的眼界来讲,是我自己的总结。我认为分三个阶段运维发展,第一阶段就是按需获取机器,第二阶段是按需获取资源,第三阶段是按需获取服务。
这个演进过程的趋势本身是为了更好支撑业务响应市场,我们的技术整体的振兴是在往业务靠近,而且这个阵型越来越紧凑,向下沟通层级越来越少了,而且是变得越来越薄了。这个趋势会一直有,随着技术能力的发展,包括对设计能力的演进,包括对业务的理解,我们会越来越贴近业务,这个基础设施团队,包括运维团队也会往前端跟进,所以 DevOps 会是一个进化的过程,而不只是一个工具。所以 DevOps 本身也会是一个趋势,如果没有实践 DevOps,也会向 DevOps 转变,因为这个团队阵型更紧凑,就像现代足球,它是一个敏捷的团队,业务发展肯定会比你快,这个公司如果不想被淘汰肯定会往这个方向转型。
结语
DevOps 能否成功,关键之一在于各部门之间要有共同的业务目标,并不断磨合,以达到良好的沟通和互相学习,相互协作,从而提高生产效率。这也应该是我们在实施 DevOps 时需要认真考虑的核心内容。
相关文章:

DevOps 的道术法器,探寻 DevOps “立体化”实践之旅
引言 随着业务的发展,软件发布迭代的频率越来越高,传统的瀑布型模式已经不能满足快速交付的需求,DevOps 也因此受到持续关注。越来越多的公司开始接受并尝试使用 DevOps,期望能使得软件开发中的构建、测试与发布工作变得更加快捷…...

redis 7.x 缓存双写一致性的解决方案
一 redis缓存双写一致性 1.1 保证redis一致性的原则 1.给缓存设置过期时间,定期清理缓存并写回,是保证最终一致性的解决方案。使用场景:在数据读多写少的情况下作为缓存来使用。 我们可以对已存入缓存的数据设置过期时间,所有…...

真题详解(语法分析输入记号流)-软件设计(八十)
真题详解(求叶子结点数)-软件设计(七十九)https://blog.csdn.net/ke1ying/article/details/130787349?spm1001.2014.3001.5501 极限编程XP最佳实践: 测试先行、 按日甚至按小时为客户提供可运行的版本。 组件图的 插座 和插头…...
ffmpeg-编译汇总01
ffmpeg-编译汇总 ubuntu18.04下编译ffmpeg 所有安装目录 /usr/local 1.nasm编译器编译 (nasm-2.13.03解包) ./configure --prefix/usr/local make -j4 sudo make install 注意:能检测到可以不用设置下面的环境。 安装完成后,为了系统能自动找到nasm程序&…...

素雅的登录界面,简单而优雅
先上效果图: 再上代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>*, *::after, *::before {margin: 0;padding: 0;box-sizing: bord…...

Docker数据目录迁移方法
文章目录 前言一、停掉Docker服务?二、迁移docker数据到数据盘目三、备份原数据目录四、添加软链接五、重启docker服务六、确认服务没有问题后,删除备份的目录总结 前言 服务器上安装的docker服务,数据默认存储在/var/lib/docker目录&#x…...
C++——动态规划
动态规划是一种解决复杂问题的算法思想。它通过将问题分解为更小的子问题,并利用子问题的解来构建原问题的解。动态规划通常用于优化问题,其中需要找到最优解或最大值/最小值。 动态规划的核心思想是存储并重复使用子问题的解,以避免重复计算…...

【FAQ】视频编辑服务常见问题及解答
Q1问题描述 1、 访问贴纸等素材的时候提示“网络异常,请重试”怎么办? 2、 使用AI能力时,提示“errorCode:20124 errorMsg:Method not Allowed”? 解决方案 请做以下检查: 1、 在代码中检查鉴权信息是否已设置。如…...

JavaEE(系列8) -- 多线程案例(单例模式)
目录 1. 设计模式 2. 单例模式 -- 饿汉模式 3. 单例模式 -- 懒汉模式 4. 单例模式(懒汉模式-多线程) 1. 设计模式 什么是设计模式? 设计模式好比象棋中的 "棋谱". 红方当头炮, 黑方马来跳. 针对红方的一些走法, 黑方应招的时候有一些固定的套路. 按照套路…...

深度剖析,如何从底层代码层面理解Selenium和Appium的关联
目录 前言: 一、Selenium和WebDriver 二、Appium和WebDriver 三、Selenium和Appium的底层关联 1. Selenium WebDriver提供底层的浏览器控制机制 2. 利用JSON Wire Protocol通信协议实现通讯机制 四、实例代码 总结: 前言: Selenium和…...

【Three.js】第一、二章 入门指南和基础知识
01.介绍 Three.js 非常庞大,你可以用它做无数的事情。 在第一章中,我们将学习所有基础知识,例如创建第一个场景、渲染、添加对象、选择正确的材料、添加纹理、为所有内容制作动画,甚至将其放到网上。有些人可能会觉得这部分有点…...

力扣第 104 场双周赛 2681. 英雄的力量
原题链接力扣 题目大意:我开始看成连续子段了,写了个递归程序....... 一个数组任选一个子序列,子序列的力量值最大值平方*最小值。求所有子序列的力量和。 分析过程:如序列长度为n,子序列总数为2的n次幂,…...
在linux上创建crypto_LUKS格式的块设备
要在Linux上创建一个块设备并将其格式化为 crypto_LUKS,可以按照以下步骤进行: 创建一个空白文件,作为块设备的基础。可以使用 dd 命令创建指定大小的文件,例如: dd if/dev/zero of/path/to/device bs1M count100这将创…...

76.建立一个主体样式第二部分
上节课的时候我们完成的页面是这个样子! ● 之后我们通过绝对定位来解决位置定位的问题 .header-container {width: 1200px;margin: 0 auto;position: absolute;left: 50%;top: 50%; }header {height: 100vh;background-color: orange;position: relative; }● 之…...

SQL删除重复的记录(只保留一条)-窗口函数row_number()
文章目录 一、关于mysql表中数据重复二、聚合函数min(id)not in二、窗口函数row_number()四、补充:常见的窗口函数 一、关于mysql表中数据重复 关于删除mysql表中重复数据问题,本文中给到两种办法:聚合函数、窗口函数row_number()的方法。 (注…...
CF1660D Maximum Product Strikes Back 题解
CF1660D Maximum Product Strikes Back 题解 题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 思路点拨(分类题)缩小研究对象范围除0的分析加上0的分析 代码实现小方法陈述 题目描述 你有一个长度为 n n n 的数组,每一个元素都在 …...
基于CSSOM的暗链检测技术实现方案
什么是暗链 大部分的开源代码在实现暗链检测的时候都是直接判断页面里面有没有敏感词,如果有,就认为该链接为暗链。这种做法其实是有误的。 违规链接应该分为:外链、内链、死链和暗链。而暗链除了违规,还应该具备“暗”这个看不见的特征。 暗链的特征 其实“暗链”就是看…...
MySQL db、tables_priv、columns_priv和procs_priv权限表
在 MySQL 数据库中,权限表除了 user 表外,还有 db 表、tables_priv 表、columns_priv 表和 procs_priv 表。在《MySQL user权限表详解》中我们讲解了 MySQL 的 user 表,下面主要介绍其它几种权限表。 db表 db 表比较常用,是 MyS…...

JavaWeb-JSP的学习
JSP 今日目标: 理解 JSP 及 JSP 原理能在 JSP中使用 EL表达式 和 JSTL标签理解 MVC模式 和 三层架构能完成品牌数据的增删改查功能 1、JSP 概述 JSP(全称:Java Server Pages):Java 服务端页面。是一种动态的网页技术…...

力扣sql中等篇练习(二十三)
力扣sql中等篇练习(二十三) 1 统计实验的数量 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 有可能数据本身就不全,就需要自行创建临时表 WITH T as (SELECT Android p1,Reading e1UNIONSELECT Android p1,Sports e1UNIONSELECT Android p1,Prog…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...

数据分析六部曲?
引言 上一章我们说到了数据分析六部曲,何谓六部曲呢? 其实啊,数据分析没那么难,只要掌握了下面这六个步骤,也就是数据分析六部曲,就算你是个啥都不懂的小白,也能慢慢上手做数据分析啦。 第一…...