mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-09-27 05:36:42 +08:00
1177 lines
33 KiB
HTML
1177 lines
33 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
|
||
<head>
|
||
|
||
<head>
|
||
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
|
||
|
||
<link rel="icon" href="/static/favicon.png">
|
||
|
||
<title>36 DevOps工程师到底要做什么事情?.md.html</title>
|
||
|
||
<!-- Spectre.css framework -->
|
||
|
||
<link rel="stylesheet" href="/static/index.css">
|
||
|
||
<!-- theme css & js -->
|
||
|
||
<meta name="generator" content="Hexo 4.2.0">
|
||
|
||
</head>
|
||
|
||
|
||
|
||
<body>
|
||
|
||
|
||
|
||
<div class="book-container">
|
||
|
||
<div class="book-sidebar">
|
||
|
||
<div class="book-brand">
|
||
|
||
<a href="/">
|
||
|
||
<img src="/static/favicon.png">
|
||
|
||
<span>技术文章摘抄</span>
|
||
|
||
</a>
|
||
|
||
</div>
|
||
|
||
<div class="book-menu uncollapsible">
|
||
|
||
<ul class="uncollapsible">
|
||
|
||
<li><a href="/" class="current-tab">首页</a></li>
|
||
|
||
</ul>
|
||
|
||
|
||
|
||
<ul class="uncollapsible">
|
||
|
||
<li><a href="../">上一级</a></li>
|
||
|
||
</ul>
|
||
|
||
|
||
|
||
<ul class="uncollapsible">
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/00 开篇词 你为什么应该学好软件工程?.md">00 开篇词 你为什么应该学好软件工程?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/01 到底应该怎样理解软件工程?.md">01 到底应该怎样理解软件工程?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/02 工程思维:把每件事都当作一个项目来推进.md">02 工程思维:把每件事都当作一个项目来推进.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/03 瀑布模型:像工厂流水线一样把软件开发分层化.md">03 瀑布模型:像工厂流水线一样把软件开发分层化.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/04 瀑布模型之外,还有哪些开发模型?.md">04 瀑布模型之外,还有哪些开发模型?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/05 敏捷开发到底是想解决什么问题?.md">05 敏捷开发到底是想解决什么问题?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/06 大厂都在用哪些敏捷方法?(上).md">06 大厂都在用哪些敏捷方法?(上).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/07 大厂都在用哪些敏捷方法?(下).md">07 大厂都在用哪些敏捷方法?(下).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/08 怎样平衡软件质量与时间成本范围的关系?.md">08 怎样平衡软件质量与时间成本范围的关系?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/09 为什么软件工程项目普遍不重视可行性分析?.md">09 为什么软件工程项目普遍不重视可行性分析?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/10 如果你想技术转管理,先来试试管好一个项目.md">10 如果你想技术转管理,先来试试管好一个项目.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/11 项目计划:代码未动,计划先行.md">11 项目计划:代码未动,计划先行.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/12 流程和规范:红绿灯不是约束,而是用来提高效率.md">12 流程和规范:红绿灯不是约束,而是用来提高效率.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/13 白天开会,加班写代码的节奏怎么破?.md">13 白天开会,加班写代码的节奏怎么破?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/14 项目管理工具:一切管理问题,都应思考能否通过工具解决.md">14 项目管理工具:一切管理问题,都应思考能否通过工具解决.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/15 风险管理:不能盲目乐观,凡事都应该有B计划.md">15 风险管理:不能盲目乐观,凡事都应该有B计划.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/16 怎样才能写好项目文档?.md">16 怎样才能写好项目文档?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/17 需求分析到底要分析什么?怎么分析?.md">17 需求分析到底要分析什么?怎么分析?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/18 原型设计:如何用最小的代价完成产品特性?.md">18 原型设计:如何用最小的代价完成产品特性?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/19 作为程序员,你应该有产品意识.md">19 作为程序员,你应该有产品意识.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/20 如何应对让人头疼的需求变更问题?.md">20 如何应对让人头疼的需求变更问题?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/21 架构设计:普通程序员也能实现复杂系统?.md">21 架构设计:普通程序员也能实现复杂系统?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/22 如何为项目做好技术选型?.md">22 如何为项目做好技术选型?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/23 架构师:不想当架构师的程序员不是好程序员.md">23 架构师:不想当架构师的程序员不是好程序员.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/24 技术债务:是继续修修补补凑合着用,还是推翻重来?.md">24 技术债务:是继续修修补补凑合着用,还是推翻重来?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/25 有哪些方法可以提高开发效率?.md">25 有哪些方法可以提高开发效率?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/26 持续交付:如何做到随时发布新版本到生产环境?.md">26 持续交付:如何做到随时发布新版本到生产环境?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/27 软件工程师的核心竞争力是什么?(上).md">27 软件工程师的核心竞争力是什么?(上).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/28 软件工程师的核心竞争力是什么?(下).md">28 软件工程师的核心竞争力是什么?(下).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/29 自动化测试:如何把Bug杀死在摇篮里?.md">29 自动化测试:如何把Bug杀死在摇篮里?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/30 用好源代码管理工具,让你的协作更高效.md">30 用好源代码管理工具,让你的协作更高效.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/31 软件测试要为产品质量负责吗?.md">31 软件测试要为产品质量负责吗?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/32 软件测试:什么样的公司需要专职测试?.md">32 软件测试:什么样的公司需要专职测试?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/33 测试工具:为什么不应该通过QQ微信邮件报Bug?.md">33 测试工具:为什么不应该通过QQ微信邮件报Bug?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/34 账号密码泄露成灾,应该怎样预防?.md">34 账号密码泄露成灾,应该怎样预防?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/35 版本发布:软件上线只是新的开始.md">35 版本发布:软件上线只是新的开始.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
<a class="current-tab" href="/专栏/软件工程之美/36 DevOps工程师到底要做什么事情?.md">36 DevOps工程师到底要做什么事情?.md.html</a>
|
||
|
||
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/37 遇到线上故障,你和高手的差距在哪里?.md">37 遇到线上故障,你和高手的差距在哪里?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/38 日志管理:如何借助工具快速发现和定位产品问题 ?.md">38 日志管理:如何借助工具快速发现和定位产品问题 ?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/39 项目总结:做好项目复盘,把经验变成能力.md">39 项目总结:做好项目复盘,把经验变成能力.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/40 最佳实践:小团队如何应用软件工程?.md">40 最佳实践:小团队如何应用软件工程?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/41 为什么程序员的业余项目大多都死了?.md">41 为什么程序员的业余项目大多都死了?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/42 反面案例:盘点那些失败的软件项目.md">42 反面案例:盘点那些失败的软件项目.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/43 以VS Code为例,看大型开源项目是如何应用软件工程的?.md">43 以VS Code为例,看大型开源项目是如何应用软件工程的?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/44 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?.md">44 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/45 从软件工程的角度看微服务、云计算、人工智能这些新技术.md">45 从软件工程的角度看微服务、云计算、人工智能这些新技术.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/一问一答第1期 30个软件开发常见问题解决策略.md">一问一答第1期 30个软件开发常见问题解决策略.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/一问一答第2期 30个软件开发常见问题解决策略.md">一问一答第2期 30个软件开发常见问题解决策略.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/一问一答第3期 18个软件开发常见问题解决策略.md">一问一答第3期 18个软件开发常见问题解决策略.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/一问一答第4期 14个软件开发常见问题解决策略.md">一问一答第4期 14个软件开发常见问题解决策略.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/一问一答第5期 22个软件开发常见问题解决策略.md">一问一答第5期 22个软件开发常见问题解决策略.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/学习攻略 怎样学好软件工程?.md">学习攻略 怎样学好软件工程?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/特别放送 从软件工程的角度解读任正非的新年公开信.md">特别放送 从软件工程的角度解读任正非的新年公开信.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/结束语 万事皆项目,软件工程无处不在.md">结束语 万事皆项目,软件工程无处不在.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
|
||
|
||
<div class="sidebar-toggle-inner"></div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<script>
|
||
|
||
function add_inner() {
|
||
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
|
||
inner.classList.add('show')
|
||
|
||
}
|
||
|
||
|
||
|
||
function remove_inner() {
|
||
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
|
||
inner.classList.remove('show')
|
||
|
||
}
|
||
|
||
|
||
|
||
function sidebar_toggle() {
|
||
|
||
let sidebar_toggle = document.querySelector('.sidebar-toggle')
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let content = document.querySelector('.off-canvas-content')
|
||
|
||
if (sidebar_toggle.classList.contains('extend')) { // show
|
||
|
||
sidebar_toggle.classList.remove('extend')
|
||
|
||
sidebar.classList.remove('hide')
|
||
|
||
content.classList.remove('extend')
|
||
|
||
} else { // hide
|
||
|
||
sidebar_toggle.classList.add('extend')
|
||
|
||
sidebar.classList.add('hide')
|
||
|
||
content.classList.add('extend')
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
function open_sidebar() {
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
|
||
sidebar.classList.add('show')
|
||
|
||
overlay.classList.add('show')
|
||
|
||
}
|
||
|
||
function hide_canvas() {
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
|
||
sidebar.classList.remove('show')
|
||
|
||
overlay.classList.remove('show')
|
||
|
||
}
|
||
|
||
|
||
|
||
</script>
|
||
|
||
|
||
|
||
<div class="off-canvas-content">
|
||
|
||
<div class="columns">
|
||
|
||
<div class="column col-12 col-lg-12">
|
||
|
||
<div class="book-navbar">
|
||
|
||
<!-- For Responsive Layout -->
|
||
|
||
<header class="navbar">
|
||
|
||
<section class="navbar-section">
|
||
|
||
<a onclick="open_sidebar()">
|
||
|
||
<i class="icon icon-menu"></i>
|
||
|
||
</a>
|
||
|
||
</section>
|
||
|
||
</header>
|
||
|
||
</div>
|
||
|
||
<div class="book-content" style="max-width: 960px; margin: 0 auto;
|
||
|
||
overflow-x: auto;
|
||
|
||
overflow-y: hidden;">
|
||
|
||
<div class="book-post">
|
||
|
||
<p id="tip" align="center"></p>
|
||
|
||
<div><h1>36 DevOps工程师到底要做什么事情?</h1>
|
||
|
||
<p>你好,我是宝玉。这些年,有关 DevOps 的概念很火,大家都在讨论 DevOps,有人说 DevOps 就是自动化运维,有人说 DevOps 是流程和管理,还有人说 DevOps 是一种文化。以前的运维工程师也纷纷变成了 DevOps 工程师。</p>
|
||
|
||
<p>今天,我将带你一起了解一下,究竟什么是 DevOps?DevOps 到底要做什么事情?</p>
|
||
|
||
<h2>传统的运维模式以及面临的挑战</h2>
|
||
|
||
<p>在传统的瀑布模型开发中,软件生命周期中的运行维护这部分工作通常是交给运维工程师来完成的。</p>
|
||
|
||
<p>当开发人员完成编码,测试人员测试验收通过后,到了要发布的时候,就会将程序交给运维人员部署发布到生产环境。</p>
|
||
|
||
<p><img src="assets/2b3c01636b37728e5684d9bbc5e383e0.png" alt="img" /></p>
|
||
|
||
<p>(图片来源:<a href="http://www.mindtheproduct.com/2016/02/what-the-hell-are-ci-cd-and-devops-a-cheatsheet-for-the-rest-of-us/">The Product Managers’ Guide to Continuous Delivery and DevOps</a>)</p>
|
||
|
||
<p>除了程序的部署更新,传统运维工程师最重要的职责就是保障线上服务的稳定运行。对服务器 24 小时监控,有意外情况发生时需要及时处理和解决。</p>
|
||
|
||
<p>除此之外,还有日常的更新维护,比如说安装升级操作系统、安装更新应用软件,更新数据库、配置文件等。</p>
|
||
|
||
<p>早些年这种运维模式运行的很好,但随着这些年互联网发展,有两个主要的因素对传统的运维模式产生了很大挑战。</p>
|
||
|
||
<p>第一,服务器规模快速增长和虚拟化技术的高速发展。</p>
|
||
|
||
<p>早些年,一般的企业服务器数量都不会太多,运维工作以手工为主,自动化为辅。几个人几十台服务器,即使用手动方式管理,也不会太困难。但随着这些年技术的快速发展,大型互联网公司的服务器数量越来越庞大,而中小公司都开始往云服务上迁移,基于 Docker 这样的虚拟化技术来搭建在线服务的基础架构。</p>
|
||
|
||
<p>服务器规模的增加和虚拟化技术的使用,就意味着以前的手动方式或者半自动的方式难以为继,需要更多的自动化和基于容器技术或者相关工具的二次开发。对于运维的工作来说,运维人员也需要更多的开发能力。</p>
|
||
|
||
<p>第二,高频的部署发布。</p>
|
||
|
||
<p>传统的软件部署频率不高,一般几天甚至几个月才部署发布一次,同时每一次的部署发布,也可能会导致系统的不稳定。而敏捷开发和持续交付的概念兴起后,更新的频率越来越高,每周甚至每天都会有若干次的更新部署。</p>
|
||
|
||
<p>高频部署带来的挑战,首先就是会引起开发和运维之间的冲突,因为开发想要快速更新部署,而对于运维来说,每次更新部署会导致系统不稳定,最好是不更新,可以让系统维持在稳定的状态。另一个挑战就是想要快速的部署发布,也意味着运维要有更高的自动化能力。</p>
|
||
|
||
<p>为了解决这些挑战,DevOps 出现了,它帮助解决开发和运维之间的沟通协作问题,提升运维开发和自动化能力。</p>
|
||
|
||
<h2>什么是 DevOps?</h2>
|
||
|
||
<p><strong>DevOps 可以理解为一种开发(Development)和运维(Operations)一起紧密协作的工作方式,从而可以更快更可靠的构建、测试和发布软件。</strong></p>
|
||
|
||
<p>DevOps 并不意味着开发一定要懂运维技术,运维要懂开发技术,而是说两个工种要更紧密的协作,有共同的目标:更快更可靠的构建、测试和发布软件。</p>
|
||
|
||
<p>这就意味着,对于运维来说,不再抵触开发的频繁更新部署,会帮助搭建自动化部署平台,提供自动化部署工具;对于开发来说,不再认为运维的工作和开发没关系,开发人员会邀请运维人员参与架构设计,帮助运维实现自动化脚本开发。</p>
|
||
|
||
<p>那么当你的团队采用 DevOps 的方式工作的话,会带来哪些好处呢?</p>
|
||
|
||
<ul>
|
||
|
||
<li><strong>整个软件的构建、测试和发布过程高度自动化</strong></li>
|
||
|
||
</ul>
|
||
|
||
<p>DevOps 一个很重要的基础就是自动化,通过对自动化的应用,是最简单有效的打破开发和运维之间壁垒的方式。</p>
|
||
|
||
<p>因为应用自动化后,对于运维人员来说,自动化的交付流程,减少了繁重的手工操作,自动化测试可以有效对产品质量提供很好的保障。对于开发人员来说,可以方便高频率地进行部署。</p>
|
||
|
||
<p>如果你的团队还没有开始实施自动化,可以先从持续交付开始,具体可以参考我们专栏在《26 持续交付:如何做到随时发布新版本到生产环境?》中的介绍。</p>
|
||
|
||
<ul>
|
||
|
||
<li><strong>信息更加透明和易于测量</strong></li>
|
||
|
||
</ul>
|
||
|
||
<p>在传统的开发和运维合作模式中,开发和运维之间的信息不是那么的透明。对于开发来说,不了解程序在服务器上运行的情况,对于运维来说,程序就是个黑盒子,无法对程序内部进行监控,出现问题只能重启或者回滚。</p>
|
||
|
||
<p>当采用 DevOps 的工作方式,信息更加透明,通过日志和工具,数据也可以被更好测量。比如说:</p>
|
||
|
||
<p>可以直观看到开发到部署需要多少时间,哪个环节可以改进?</p>
|
||
|
||
<p>当前服务运行情况如何,每分钟访问数多少,API 出错率多少?</p>
|
||
|
||
<p>当前用户数多少,有多少新增用户?</p>
|
||
|
||
<p>这些数据,不仅可以帮助运维更好地预警,或者是帮助开发更好地优化程序,还可以帮助业务团队更好地了解服务的运营情况。</p>
|
||
|
||
<ul>
|
||
|
||
<li><strong>培养跨职能协作的文化</strong></li>
|
||
|
||
</ul>
|
||
|
||
<p>DevOps 的核心文化是不同职能工种之间的紧密协作的文化。其实不仅限于开发和运维之间,就像我们之前在《32 软件测试:什么样的公司需要专职测试?》)中讨论的,开发和测试之间也一样离不开紧密的协作。</p>
|
||
|
||
<p>如果你的团队是在真正地实践 DevOps 的工作方式,就会积极拥抱这样的跨职能协作的文化,在日常工作中包容错误、对事不对人,能对项目的开发流程持续改进,鼓励创新。</p>
|
||
|
||
<p>有关 DevOps,也有一些不错的文章,有兴趣的话可以进一步阅读:<a href="http://juejin.im/post/5c98372c6fb9a070f2377ff6">DevOps 前世今生 | mPaaS 线上直播 CodeHub #1 回顾</a>,<a href="https://mp.weixin.qq.com/s?__biz=MzI3MzEzMDI1OQ==&mid=2651819931&idx=1&sn=0a4d940b122f65ac910ef9f0175c5bad&chksm=f0dcd9e7c7ab50f11b0b2395a293e8ac6ee807e843d77fa54ba677c8f0bcf6ab1db2d1110458&scene=0#rd">孙宇聪:来自 Google 的 DevOps 理念及实践</a>和<a href="https://www.jianshu.com/p/645bb1283a77">关于 DevOps ,咱们聊的可能不是一回事</a>。</p>
|
||
|
||
<p>DevOps 看起来很美好,也许你迫不及待想去实施,但 DevOps 这种工作方式的建立,也不是一下子能完成的,上面提到的这些带来的好处,相应的也是你要去遵守的 DevOps 原则:<strong>自动化、信息透明可测量、构建协作文化。</strong></p>
|
||
|
||
<p>这也意味着:</p>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
|
||
<p>你需要去构建自动化部署的系统,从构建、测试到部署实现高度的自动化;</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>建立数据监控的系统,让信息透明可测量;</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>最后要形成跨职能协作的文化。</p>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
<p>看起来很难,但也不需要有压力,因为要实践 DevOps,不需要你改变开发模式,瀑布模型或者敏捷开发都可以实施;不需要靠管理层推动;也不一定要让开发人员去学习运维知识或者运维去学习开发知识。而是通过了解 DevOps 的核心价值,也就是跨职能之间紧密协作,更快更可靠地构建、测试和发布软件,一点一点地做出改变。</p>
|
||
|
||
<h2>DevOps 工程师到底要做什么事情?</h2>
|
||
|
||
<p>在了解了什么是 DevOps 后,我们再来看看基于 DevOps 的实践,DevOps 工程师到底要做什么事情?</p>
|
||
|
||
<p>对于 DevOps 工程师的定义其实是有争议的,因为有人认为 DevOps 是一种团队工作的方式,而不是一种职业。也有人认为 DevOps 工程师是一种职位,用来帮助团队形成 DevOps 工作方式的职位。</p>
|
||
|
||
<p>在这里我们没必要陷入这种争论,而是从 DevOps 实践的角度,来看看 DevOps 工程师,要做什么事情,可以帮助团队来实践 DevOps 的工作方式。至于是 Dev 来做这些事情,还是 Ops 来做这些事情,还是一起协作来做这些事情,并不是最重要的。</p>
|
||
|
||
<p><strong>首先,DevOps 工程师要帮助团队建立基于持续集成和持续交付工作流程。</strong></p>
|
||
|
||
<p>关于持续集成和持续交付,不仅仅是工具的使用,同时还是基于工具之上的一整套的交付工作流程。</p>
|
||
|
||
<p>这套工作流程已经是业界公认的好的实践,但在很多中小团队普及率还不高,主要的难点之一是搭建比较复杂,可能还涉及二次开发;另一个是不知道该怎么建立这样的流程。</p>
|
||
|
||
<p>对于这样的工具和流程的建设,最初的时候,就是需要有专门的人,专门的时间去建立,也是 DevOps 工程师首先要去解决的问题。</p>
|
||
|
||
<p>其次,要建立一套基于日志的监控报警的系统,以及故障响应的流程。</p>
|
||
|
||
<p>对于线上系统,应急响应非常重要,要在故障发生后,第一时间作出响应,及时恢复生产,避免更大损失。而要做到这一点,同样离不开工具和流程的支持。</p>
|
||
|
||
<p>需要能建立一套基于日志的监控报警的系统,将应用程序还有运行环境的各项数据监控起来,设置报警的阈值。当数据异常,超出阈值,就马上触发报警,然后进入应急响应的流程。</p>
|
||
|
||
<p>对于应急响应流程,首先应该能第一时间通知最合适的人去处理,比如负责这个服务值班的开发人员,然后对于怎么第一时间恢复应该有准备,涉及跨部门协作也应该有相应的配合流程;最后对于故障应该有总结,避免类似情况再次发生。</p>
|
||
|
||
<p>有关监控和日志分析,我还会在我们专栏后续文章《 监控和日志分析:如何借助工具快速发现和定位产品问题 ?》中有更多介绍。</p>
|
||
|
||
<p><strong>然后,要构建基于云计算和虚拟化技术的基础设施。</strong></p>
|
||
|
||
<p>虽然并非每一个软件项目都是基于云计算或虚拟化技术来搭建的,但云计算和虚拟化技术方面的技术,其实是横跨开发和运维的,可能对于大部分开发和运维来说,都只了解其中一部分知识,这就需要有人能同时懂软件开发和云计算或虚拟化技术,或者一起协作,才能搭建出真正适合云计算或虚拟化技术的架构。</p>
|
||
|
||
<p>构建出来基于云计算和虚拟化技术的基础设施后,对于开发人员来说,只要通过 API 或脚本即可搭建应用,对于运维来说,也只要通过脚本和工具即可管理。</p>
|
||
|
||
<p>这其实也是 DevOps 中的<a href="https://insights.thoughtworks.cn/nfrastructure-as-code/">基础设施即代码</a>的概念。</p>
|
||
|
||
<p><strong>最后,要形成 DevOps 的文化。</strong></p>
|
||
|
||
<p>DevOps 最核心的本质就是工作方式和协作的文化,而这样的文化需要有人引领,一点点去形成。</p>
|
||
|
||
<p>DevOps 工程师要帮助开发和运维相互理解对方的工作,帮助开发和运维在一起协作时多沟通,相互学习。出现问题不指责,而是分析原因,共同承担责任,找出改进的方案。</p>
|
||
|
||
<p>这些就是 DevOps 工程师要做的事情,本质上还是 DevOps 的几条基本原则:自动化、信息透明可测量、构建协作文化。不需要有 DevOps 工程师的头衔,基于 DevOps 的原则去做事情,就可以算的上是 DevOps 工程师。</p>
|
||
|
||
<h2>总结</h2>
|
||
|
||
<p>今天我带你一起学习了当前热门的 DevOps 概念,DevOps 可以理解为一种开发和运维一起紧密协作的工作方式,从而可以更快更可靠地构建、测试和发布软件。DevOps 的主要原则就是自动化、信息透明可测量、构建协作文化。</p>
|
||
|
||
<p>DevOps 工程师,要做的事情就是帮助团队来实践 DevOps 的工作方式。具体可以帮助团队:</p>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
|
||
<p>建立基于持续集成和持续交付工作流程;</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>建立基于日志的监控报警的系统,以及故障响应的流程;</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>构建基于云计算和虚拟化技术的基础设施;</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>形成 DevOps 的文化。</p>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
<p>DevOps 工程师做的事情,就是帮助团队基于 DevOps 原则来做事,让团队形成紧密协作的工作方式,更快更可靠的构建、测试和发布软件。</p>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div>
|
||
|
||
<div style="float: left">
|
||
|
||
<a href="/专栏/软件工程之美/35 版本发布:软件上线只是新的开始.md">上一页</a>
|
||
|
||
</div>
|
||
|
||
<div style="float: right">
|
||
|
||
<a href="/专栏/软件工程之美/37 遇到线上故障,你和高手的差距在哪里?.md">下一页</a>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||
|
||
</div>
|
||
|
||
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"70997c8c6bc03cfa","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
|
||
|
||
</body>
|
||
|
||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
|
||
|
||
<script>
|
||
|
||
window.dataLayer = window.dataLayer || [];
|
||
|
||
|
||
|
||
function gtag() {
|
||
|
||
dataLayer.push(arguments);
|
||
|
||
}
|
||
|
||
|
||
|
||
gtag('js', new Date());
|
||
|
||
gtag('config', 'G-NPSEEVD756');
|
||
|
||
var path = window.location.pathname
|
||
|
||
var cookie = getCookie("lastPath");
|
||
|
||
console.log(path)
|
||
|
||
if (path.replace("/", "") === "") {
|
||
|
||
if (cookie.replace("/", "") !== "") {
|
||
|
||
console.log(cookie)
|
||
|
||
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
setCookie("lastPath", path)
|
||
|
||
}
|
||
|
||
|
||
|
||
function setCookie(cname, cvalue) {
|
||
|
||
var d = new Date();
|
||
|
||
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
|
||
|
||
var expires = "expires=" + d.toGMTString();
|
||
|
||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||
|
||
}
|
||
|
||
|
||
|
||
function getCookie(cname) {
|
||
|
||
var name = cname + "=";
|
||
|
||
var ca = document.cookie.split(';');
|
||
|
||
for (var i = 0; i < ca.length; i++) {
|
||
|
||
var c = ca[i].trim();
|
||
|
||
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
|
||
|
||
}
|
||
|
||
return "";
|
||
|
||
}
|
||
|
||
|
||
|
||
</script>
|
||
|
||
|
||
|
||
</html>
|
||
|