DevOps 工程师成长日记系列五:部署

原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-5-deploy-83e790545c23
原文作者:Igor Kantor
翻译君:CODING?戴维奥普斯

让我们简要回顾下我们的 DevOps 之旅:
在第一篇,我们介绍了 DevOps?文化以及相关的基础技能;
在第二篇,我们讨论了如何为将来的代码部署奠定基础;
在第三篇,我们讨论了如何有组织地管理代码;
在第四篇,我们讨论如何简单地打包代码。
以下是我们贯穿前后的路线图:

如果在上图每列的技术栈上花费一个月左右的话,那么我们现在处于第 4 个月。基于前文的学习,我们已经知道了如何配置将要运行代码的服务器基础架构、如何正确地对代码进行版本管理、如何将代码打包以备部署。今天我们要讨论如何部署代码。

部署代码

注意到了吗?我没有说“如何轻松地部署代码”,因为代码从开发环境到正确部署仍然是一个充满了错误和失败的痛苦过程。

原因很多,但在我看来,这主要归结为差异。具体而言,创建代码的环境与实际代码运行的环境之间存在差异。我认为减少这些差异意味着你不仅可以在整体代码部署中实现最大的改进,还可以在代码部署后的运行时达到一定的优化。那么,我们如何减少或消除生产和非生产环境之间的差异呢?

在我的机器上明明是可以跑的

如果你的开发基础设施是这样的:


用“温柔的爱和关怀”手工组装而成的开发基础设施

但你的生产环境基础设施看起来像这样:

那你就会遇到麻烦。

如果你使用基础设施即为代码的方式而不是手动配置,那么差异这事儿你已经搞定得七七八八了。如果不是,请不要绝望 ——?你并不孤单。花一个下午,找出你所碰到的所有差异(培训、文化、人员、流程等),并逐一消除它们。

最重要的是,如果你仍在手动配置,那你可能很难去管理现代技术栈。因此你需要做的第一件事是确保涉及产品的所有内容都是由部署服务器构建的版本化软件包。假设上述事情你已经完成,我会告诉你部署代码的最佳方法是不部署代码

现代化的代码部署

将代码部署到生产环境机器是一件非常 90 年代的事情。


现有技术的“代码部署装置”

将代码部署到一组固定生产环境机器的最大问题是:你的生产环境服务器(代码运行的地方)与你的开发环境服务器(编写代码的地方)不同。这就难怪在部署后会立即出现大量问题。

因此,你需要尽一切可能确保构建产物(而不是一小段代码)一直处在运行环境当中。换句话说,将代码一次性部署到开发环境,克隆运行代码的整个机器环境,然后将其复制到需要的任何位置。这被称为“不可变部署”,是一个非常强大的模式,可以避免你数小时部署后的头痛。当然,如果你运行容器,同样的想法也是适用的:在任何地方部署相同的容器即可。

“但是我的生产环境和开发环境就是不同的!”你可能会说。数据库用户名密码,连接字符串,S3 存储桶位置等等,这些都是不同的。解决这个问题的方法是使用 12 因子应用配置原则。所有配置都需要外部化并作为环境变量传递到服务器。

例如,如果在 AWS,可以使用 SSM 作为外部参数存储,它很好地集成了 CloudFormation。直接通过 aws ssm?cli 命令行工具设置环境变量也非常容易。当然,其它云厂商也提供了类似的机制。

当出现问题时,你需要压制“修理”生产环境机器的冲动。这些机器是不可变的,这意味着你所做的任何修复都必须来自开发环境。事实上,你的终极目标应该是根本不允许任何在生产环境服务器上的接入。没有 ssh、没有 scp、没有人有任何访问权限,不是你,更不是觊觎中的黑客。

但如果我需要日志来解决问题呢?所以日志也应该外部化。理想情况下可以通过ElasticSearch / Logstash / Kibana(ELK)技术栈或商业软件(如 SumoLogic 或Datadog)将日志转储到其它地方。

无论你做什么,你的产品都是“黄牛” ——?它们会在出现最轻微的不健康信号时就被替换。它们不是“宠物”,需要耗费数小时进行故障排除来恢复健康。我知道这个比喻被太多人使用了,并且我听到那些真正养牛的人说过实际上他们的工作原理和我们刚所讨论的不同,但重点事务确实如此。不要“修复”你的生产环境机器,而是修复你的开发环境并重新部署。

代码部署机制

所以你知道要做些啥了,但怎么做呢?

“不幸”的是,这就是 Jenkins 的用武之地,Jenkins 是最受欢迎的开源部署自动化服务器之一。我说“不幸”是因为 Jenkins(及其前任 Hudson)已经存在了近十年,并且在漫长的使用过程当中我们发现了:它的设置很复杂,维护起来更复杂。它带有数以百万计的可疑质量插件。这些插件往往会在最不合适的时候崩溃,把所有事情搞砸。实际上,真正具有弹性的分布式 Jenkins 设置很少见,通常只有最大的研发组织里才能看到。

那为什么我还建议你从 Jenkins 开始呢?因为尽管存在各种缺陷,它仍然非常受欢迎,并且在我们的行业中被大量使用。了解 Jenkins,特别是 Jenkinsfile 的结构,对就业前景会是一个巨大并且不容忽视的好处。当你学习 Jenkins 时,请确保你遵循较新的 Pipeline?BlueOcean 技术路径,而不是更旧的“Jenkins jobs”。

参考阅读:
Jenkinsfile:https://jenkins.io/doc/book/pipeline/jenkinsfile/
Pipeline?BlueOcean:https://jenkins.io/doc/book/blueocean/

当你希望 CI/CD 流水线被直接包含在代码仓库当中后,持续集成工具会变得非常重要,这样的话流水线本身就是一段版本化的代码。

一切都是代码

你的应用程序如何被部署、监控、配置等等——说到底最终都化作为存储在代码仓库里被正确版本化的代码片段。

我们的目标是为核心开发人员(编写功能代码的软件工程师)创建一个真正无摩擦的环境。例如,我应该能够编写我自己的微服务、添加我认为必要的测试、添加监控即代码的配置、在一些“env.yaml”?文件中指定我的参数、将它们全部存储在一个代码仓库中;通过 CI/CD 流水线自动触发构建、测试、部署(金丝雀发布或蓝绿发布),并在完成后给我发送电子邮件。事实上,这是 DevOps 工程师核心使命的本质。

Jenkins 的替代品

就像我之前说过的那样,Jenkins 已经被广大开发者使用很长一段时间了。现在还有其它的工具,在我看来更好,即使没有 Jenkins?那么为人所知。

  • 一个是 AWS 自己的 CodeDeploy 服务。它有局限性,但 CodeDeploy 背后的开发人员在过去一年做了很大的改进,如果你在用 AWS,建议你试一试。
  • 另一个是 GitLab CI。如果你的研发组织运行在 GitLab?上,你可以考虑使用,因为它与 GitLab 的其它部分良好地集成在一起。
  • 去年十月 GitHub 宣布了 Actions(目前仍处在公测中),用于 GitHub 用户的自动化工作流场景。

我认为这里的工具并不是最重要的。重要的是要记住包括代码部署流水线在内的所有内容都是版本化的软件部件,它首先得来自于开发环境,而不是生产环境。

如果你从 Jenkins 开始学习持续集成,请尝试将其设置为容器模式。这并不是一件非常困难的事情,反而会是一个很不错的学习机会,你可以找到弹性的、容器化的 Jenkins 机器节点来部署容器化的 Jenkins。

你也完全可以从简单的、没有任何容器编排的方式开始,这是下一篇文章的主题,敬请关注。

写在最后

原文作者给我们介绍了一个非常重要的实践:在部署环境遇到的问题要去调整和修改开发环境,让生产环境与开发环境保持一致,修改生产环境治标不治本。同时也给我们介绍了一些他喜欢的国外持续集成工具。针对国内的工具,译者推荐你还可以考虑使用 CODING?持续集成,它是 CODING 提供的一站式 DevOps 解决方案中重要的一环。其构建脚本在语法上全面兼容 Jenkins,又免除开发者部署和维护持续集成环境的繁杂事务。

同时 CODING?支持包括 Docker 镜像、Jar、APK 等软件包的构建,预置了主流开发语言的构建环境:Java、PHP、Go、Python 等等;开启缓存加速功能可以平均提高 300%?的构建速度。对于包括 Maven,NPM?在内的主流镜像源有专用网络优化,保证拉取速度;?支持单项目并行构建,以满足重度持续集成用户的需求。对不太喜欢脚本的同学还提供了完善的图形化编排能力,以降低使用门槛。

CODING?还对构建产物提供了统一的制品库管理,目前制品库已支持 Docker 镜像、NPM、Helm 等常见包类型的制品管理。后续 CODING 会逐步支持多种主流的软件包类型来进一步完善 DevOps 工作流,敬请期待。

原文地址:https://www.cnblogs.com/codingdevops/p/11168663.html

时间: 2024-10-08 00:47:04

DevOps 工程师成长日记系列五:部署的相关文章

网络工程师成长日记402-乌审旗某采气厂项目

这是网络工程师成长日记的第402篇连载文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 7日晚,接上级通知,要去榆林参加一次项目.由我带领郑工,当然其他的几位工程师也都电话通知过,是否愿意去参加此次项目,本着自愿参加的原则,由老大带队,前往项目地.准备了项目用到的一些资源,如:网线,console线,笔记本,字和笔等工具.晚上10点多火车,西安-榆林,行程12小时.买到了最后两张去榆林的车票,当然是无坐了,挤上车后,发现没有立脚之地,刚好赶上学生放假,车上挤了个水泄不通,几乎找不到立足之

网络工程师成长日记076-如何成为网络工程师中的高手

这是我的第076篇原创文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 首先,所有最重要的就是你要有坚定不移的信念学习网络工程师 相信你自己完全可以做到这是所有的重中之重,因为如果你没有信心,用什么方法都很难,我写的这些也都成了废话. 根据自己从事网络工程师行业,也从事过网络工程司培训,一共十五年从业的时间,曾经在外企,在世界五百强,在中小型企业都待过,我接触过大量的优秀的工程师,带过大量的,中国移动,中国电信,中国联通的技术员工,也培养过很多的大学生,所以我把培训的最有效的一些方法总结

网络工程师成长日记322-阿克苏诺贝尔油漆苏州公司西安分公司工程回忆录

这是网络工程师成长日记的第322篇连载文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 今天和老大去阿克苏诺贝尔油漆苏州公司西安分公司做个技术支持,比较激动,老大让我写个回忆录给大家看看踏进公司的大门时,有点紧张和激动,这毕竟是第一次做工程--一位漂亮的行政秘书对我们很热情,让我们坐,给我们拿报纸--使我的心情平静了下来.坐下来才发现公司的布置还是有点品位的,装饰的也不俗套,后来才知道是500强企业.(图1-办公环境) (图2-机架) 第一步:通过与行政小秘书的沟通了解我们要做的内容--

网络工程师成长日记325-红牛西安工程回忆录

这是网络工程师成长日记的第325篇连载文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 红牛全国组网项目感想也许是幸运,也许是补偿吧!昨天在房地产公司的项目特让人郁闷,毕竟机房的面积太小,以至于我们有进去,也没有动手,反而耗费了五个小时的时间回来后还发现有人将我用的电脑重启了,我写的文档丢了,真是气不打一处出啊!正在和他们闲聊的时候老大跟刘工说明天继续做项目,我来劲了,当即找老大说明今天的情况申请明天继续跟项目,没想到居然得到了批准 得知客户公司地址的时候又是一阵欢喜,在我租的房子的对面

网络工程师成长日记412-长安大学项目

网络工程师成长日记412-长安大学项目 这是我的第412篇原创文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 这一周过的非常充实,除了星期二那天把从农行那边借过的v3.5线调配到宁夏银行外其余大部分时间都在长安大学渭水校区度过. 我们的主要工作是将长安大学的14栋楼共28个机房里的8台交换机重新堆叠起来因为原来的8台21系列交换机堆叠起来的这是堆叠的极限因为它的包传输速率为6.6mpps,所以8台堆叠后容易导致丢包让用户感觉上网不顺畅甚至上不去. 现在我们做的是把8台21系列交换机分成

网络工程师成长日记306-西安保时捷项目实习感想

这是网络工程师成长日记的第306篇连载文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 前几天接到老大的通知,星期一要去北二环的保时捷,做一个打环测试的项目.听到打环,比较陌生,经过尹Sir的讲解还有在网上查了些资料,大概有了些了解.但是毕竟还是没有做过,总有点心虚. 星期一早上9点,我们准时来到了客户所在地点,锦园新世纪保时捷展示店,还没走进大门,就看到一辆保时捷cayman跑车停在玻璃门后,好家伙,快100万啊.来不及细看,进去和客户介绍自己,表明来意.前台女孩很漂亮但不太热情,告诉

网络工程师成长日记330-西安壳牌项目实习

这是网络工程师成长日记的第330篇连载文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 昨天接到通知,说今天会去做个项目,公司的名称是壳牌公司,工程的目的是安装新的路由器目的是使北京的总公司能访问西安的分公司. 当然还是跟往常一样,总共是3个人,由很牛的人带队哦.也许项目做多了,也没有像前几次那么紧张,就好像是完成一件很简单的事情,享受那份做工程的快乐.今天坐车去工程现场,路线是昨天查了好长时间才确定的还好我比较幸运,坐的那辆公交车离工作现场比较近,一下车马路对面就是.下车之后,看到了一

网络工程师成长日记315-汉中某银行技术支持

这是网络工程师成长日记的第315篇连载文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 9/10随同老大到汉中市人民银行总行,对网络故障进行排查主要是核心交换机上的VRRP热备份冗余出现不稳定状态,核心交换机光模块上的23/24口不停的出现UP/Down时间紧迫,第2天早上,我们很早来到银行的机房,由于银行有重要的业务流量,只能对3层交换做一些简单查看,要对交换机问题进行仔细的排查,还需要等到晚上工作人员都下班后,这样我们先通过网管进行了解,问题的关键所在. 我们来到机房后,老大首先是对

网络工程师成长日记316-宝鸡冀东水泥厂技术支持

这是网络工程师成长日记的第316篇连载文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 这是第一次在老大带领下去较远的地方做工程,对于此次宝鸡之行我觉得收获颇多.出发前在听到去宝鸡冀东水泥公司调试的是华为设备,由于之前没有接触到华为的设备,出发前我还是比较担心,同时也有些紧张.经过长时间的车程,最终到达冀东水泥宝鸡凤翔分公司. 到达现场后,老大很快就和赵师傅处了解施工方的情况.以及我们到达机房所要做的事,并认真考虑配置方法.从开始我就有一些紧张,期间老大也多次与赵师傅讨论施工策略,并带领