DevOps那点事
对于DevOps基本概念的理解
首先看下DevOps的定义:
DevOps(英文Development和Operations的组合)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它的出现是由于软件行业日益清晰地认识到,为了按时交付软件产品和服务,开发和运营工作必须紧密合作。
首先看下DevOps的定义:
DevOps(英文Development和Operations的组合)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它的出现是由于软件行业日益清晰地认识到,为了按时交付软件产品和服务,开发和运营工作必须紧密合作。
在实际开发中,会使用git作为版本控制工具来完成团队协作。因此,对基本的git操作指令进行总结是十分有必要的,本文对一些术语或者理论基础,不重新码字,可以参考廖雪峰老师的博文,本文只对命令做归纳总结。
git的通用操作流程如下图(来源于网络)
linux 的包过滤功能,即 linux 防火墙,它由 netfilter 和 iptables 两个组件组成。netfilter 位于内核空间,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables 是一个命令行工具,位于用户空间,它使得插入、修改和删除信息包过滤表中的规则变得容易。
我们知道 iptables 是按照规则来办事的,规则其实就是网络管理员预定义的条件,规则一般的定义为”如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables 就根据规则所定义的方法来处理这些数据包,如放行(ACCEPT)、拒绝(REJECT)和丢弃(DROP)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
几年前,DevSecOps 成为敏捷应用安全(AppSec)模块中最受欢迎的新成员。尽管有许多组织仍在寻找如何在整个 DevOps 周期中通过左移和集成确定安全性的方法,但将安全性嵌入到 DevOps 周期中已成为标准。
采用 DevSecOps 方法需要组织转变态度,并将其应用于流程、人员及他们使用的工具。
尽管这种组织变革一直是一个挑战,但是越来越多的企业和组织正在齐心协力地将安全实践向左迁移,并将其纳入 DevOps 周期,以确保实施必要的安全检查而不会影响产品上市时间。
DevSecOps 方法的一个主要组成部分是自动化:在整个 SDLC 中,尽早并尽可能频繁地确保安全性贯穿于整个开发生命周期,从而节省时间和金钱,并减少安全团队和开发团队之间的摩擦。
很多人可能遇到过开机重启时,由于Docker守护程序在占用多核CPU使用100%C使用的情况,导致所有容器都无法启动,服务都不能用的情况。很悲催的是这事儿虫虫也遇到了,之前文章中虫虫介绍过利用Docker重构WP博客的新架构。由于VPS机器不是很稳定,时常会重启,重启时候就会遇到这个事情,VPS负载很高,容器都没有起来,网站就无法访问了。这时候只能杀掉所有容器并重启守护进程,才能恢复。经过了解该问题是由于Docker守护进程引起,而且Docker守护进程是以root特权权限启动的,是一个安全问题,那么有什么方法解决呢?
为什么Docker需要一个守护进程呢?
DevOps工程师或SRE工程师,可能都知道Prometheus普罗米修斯。Prometheus于2012年由SoundCloud创建,目前已经已发展为最热门的分布式监控系统。Prometheus完全开源的,被很多云厂商(架构)内置,在这些厂商(架构)中,可以简单部署Prometheus,用来监控整个云基础架构设施。比如DigitalOcean或Docker都是普罗米修斯作为基础监控。
希腊神话中,普罗米修斯是最具智慧的神明之一,是泰坦巨神后代,其名字意思为”先见之明”,那么以该名字命名的监控系统究竟怎么样呢?今天虫虫给大家讲讲这个以神之名命名的监控系统。
SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误。目前支持java,C#,C/C++,Python,PL/SQL,Cobol,JavaScrip,Groovy等二十几种编程语言的代码质量管理与检测。
SRE(Site Reliability Engineering)即网站可靠性工程,提及SRE很多人会联想到运维工程师、系统工程师,其实不然,SRE本质上仍然是软件工程师,下面我们从SRE的发展历史展开来进行介绍。
SRE最早在十多年前Google提出并应用,近几年逐步在国内外TOP互联网公司都开始广泛应用。据笔者了解业界SRE落地成功的权威有Google、Netflix等,前者缔造了SRE,并奠定了其权威的地位,而后者将SRE的实践做到了极致,据官方曝露的信息,Netflix仅有的个位数的Core SRE支持了190个国家、数亿用户、数万微服务实例业务规模的运维。
近几年随着DevOps的发展,SRE开始被大家熟知,国内的一线互联网公司如BAT、美团也都逐步从组织架构、招聘上均有体现。以阿里为例,不同的BU均有设置SRE团队,然而在不同的部门,SRE的职责划分却不尽相同,那么SRE究竟在做什么?
SRE主要负责Google所有核心业务系统的可用性、性能、容量相关的事情,根据《Site Reliability Engineering 》一书提及的内容,笔者做简单汇总,Google SRE的工作主要包括但不限于如下:
随着系统效率和复杂程度的日益提高,我们用于承载服务的IT环境也变得异常复杂。许多企业在向微服务和容器化的迈进的过程中,给已有的应用进一步增加了大量的服务组件。那么如何管理和协调好各个组件之间的功能与关系,显然是我们需要面对和处理的巨大挑战。
对于大多数企业而言,他们的IT运营(IT Ops)团队往往只能疲于应付上述复杂局面,且很难获取到更多的实用信息与管理资源。而这恰恰是人工智能化IT运营(AIOps)一显身手的地方。通过由大数据、数据分析和机器学习等技术所提供高水准的定制服务,AIOps能够为当下流行的基础架构提供的全面、且深入的宝贵支持。
下面我们来一起了解一下,那些涉及到AIOps落地实践方面的关键知识点。
Kubernetes 以其超前的设计理念和优秀的技术架构,在容器编排领域拔得头筹。越来越多的公司开始在生产环境部署实践 Kubernetes,在阿里巴巴和蚂蚁金服 Kubernetes 已被大规模用于生产环境。Kubernetes 的出现使得广大开发同学也能运维复杂的分布式系统,它大幅降低了容器化应用部署的门槛,但运维和管理一个生产级的高可用 Kubernetes 集群仍十分困难。本文将分享蚂蚁金服是如何有效可靠地管理大规模 Kubernetes 集群的,并会详细介绍集群管理系统核心组件的设计。
Kubernetes 集群管理系统需要具备便捷的集群生命周期管理能力,完成集群的创建、升级和工作节点的管理。在大规模场景下,集群变更的可控性直接关系到集群的稳定性,因此管理系统可监控、可灰度、可回滚的能力是系统设计的重点之一。除此之外,超大规模集群中,节点数量已经达到 10K 量级,节点硬件故障、组件异常等问题会常态出现。面向大规模集群的管理系统在设计之初就需要充分考虑这些异常场景,并能够从这些异常场景中自恢复。
当应用上线以后,运维面临的一大挑战是如何能够在不影响已上线业务的情况下进行升级。做过产品的同学都清楚,不管在发布前做过多么完备的自动化和人工测试,在发布后都会出现或多或少的故障。根据墨菲定律,可能会出错的版本发布一定会出错。
“ANYTHING THAN CAN GO WRONG WILL GO WRONG”
—— MURPHY’S LAW
因此我们不能寄希望于在线下测试时发现所有潜在故障。在无法百分百避免版本升级故障的情况下,需要通过一种方式进行可控的版本发布,把故障影响控制在可以接受的范围内,并可以快速回退。
可以通过灰度发布(又名金丝雀发布)来实现业务从老版本到新版本的平滑过渡,并避免升级过程中出现的问题对用户造成的影响。
当我们开始推行敏捷时,还没有容器和 Kubernetes。但是它们改变了过去最困难的部分:将敏捷性从小团队应用到整个组织。
— Matt Hicks(作者)
数字化转型大潮中,常常说到DevOps,但是其并不是数字化转型所特有的。从一个高度及敏捷的研发团队的角度,其是必要的技术组成部分,甚至不在于是否用不用敏捷。并随着大数据的特有应用,衍生出DataOps;同时由于互联网相关应用等的大规模分布式的使用,及虚拟化、容器化等等的海量集群的应用,AIOps也被冠名了。
K歌亭是唱吧的一条新业务线,旨在提供线下便捷的快餐式K歌方式,用户可以在一个电话亭大小的空间里完成K歌体验。K歌亭在客户端有VOD、微信和Web共三个交互入口,业务复杂度较高,如长连接池服务、用户系统服务、商户系统、增量更新服务、ERP等。对于服务端的稳定性要求也很高,因为K歌亭摆放地点不固定,很多场所的运营活动会造成突发流量。
为了快速开发上线,K歌亭项目最初采用的是传统的单体式架构,但是随着时间的推移,需求的迭代速度变得很快,代码冗余变多,经常会出现牵一发动全身的改动。重构不但会花费大量的时间,而且对运维和稳定性也会造成很大的压力;此外,代码的耦合度高,新人上手较困难,往往需要通读大量代码才不会踩进坑里。
鉴于上述弊端,我们决定接下来的版本里采用微服务的架构模型。从单体式结构转向微服务架构中会持续碰到服务边界划分的问题:比如,我们有user服务来提供用户的基础信息,那么用户的头像和图片等是应该单独划分为一个新的service更好还是应该合并到user服务里呢?如果服务的粒度划分的过粗,那就回到了单体式的老路;如果过细,那服务间调用的开销就变得不可忽视了,管理难度也会指数级增加。目前为止还没有一个可以称之为服务边界划分的标准,只能根据不同的业务系统加以调节,目前K歌亭拆分的大原则是当一块业务不依赖或极少依赖其它服务,有独立的业务语义,为超过2个的其他服务或客户端提供数据,那么它就应该被拆分成一个独立的服务模块。
在采用了微服务架构之后,我们就可以动态调节服务的资源分配从而应对压力、服务自治、可独立部署、服务间解耦。开发人员可以自由选择自己开发服务的语言和存储结构等,目前整体上使用PHP做基础的Web服务和接口层,使用Go语言来做长连接池等其他核心服务,服务间采用thrift来做RPC交互。
都信息时代了,各行各业自然也就离不开各类软件系统了,无论是微信支付宝还是看病挂号,打车住店,你能说出来的业务都信息化了或者在信息化的建设路上。一套软件系统要想用的好,就需要软件开发者和运行维护人员以及维保开发人员通力合作。近年来DevOps这个概念开始流行起来,所谓开发运维结合模式,就是把软件开发和运行维护结合起来的工作模式。它通过传递一种分享文化、协作文化和精益文化,促进团队协作,从而不断生产出更好的产品,提供更优质的服务。
它是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
DevOps平台在研发过程中,集成了许多的第三方工具来完善持续集成的流程,诸如Jira、Gitlab、Jenkins等,集成一个工具其实是一个繁琐的工作,需要注意到许多的细节,那么我们又是怎么做的呢?本文就是介绍一下我们是如何将这些工具集成到DevOps平台中去的。
1.DevOps平台第三方服务集成概览
2.DevOps平台第三方服务集成思路
3.DevOps平台第三方服务集成示例
说明:DevOps平台所有集成的第三方服务信息都保存在平台管理的服务集成页面,如下图展示:
1、介质服务器
DevOps平台采用的介质服务器类型为NEXUS,NEXUS是一个强大的maven仓库管理器,它极大的简化了本地内部仓库的维护和外部仓库的访问。
2、构建引擎
DevOps平台采用的构建引擎类型为Jenkins,Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
Jenkins是DevOps平台很重要的一个组成部分,CICD就靠Jenkins来实现,用户可以在DevOps平台创建一个构建定义、配置好需要的任务如maven构建,还可配置定期执行或触发执行该构建任务,将用户从繁琐的构建工作中解脱出来。
3、部署引擎
DevOps平台采用的部署引擎类型与构建引擎同为Jenkins。
阅读更多北京时间 2019 年 8 月 9 日,GitHub 官方宣布了 GitHub Actions 将支持 CI/CD,并且对所有开源项目免费!GitHub 将迎来内置的 CI/CD,你是不是不用在 Travis,AppVeyor,Azure Pipelines 或是其他 CI/CD 工具之间而纠结了?
任何 OS利用 GitHub 托管的环境,你可以在任何 OS 上运行你的 CI/CD 工作流,包括 Linux, macOS, Windows 以及容器。任何语言GitHub Actions 现在已经支持更多的语言和框架:Node.js, Python, Java, PHP, Ruby, Go, Rust, C/C++, .NET, Android, iOS 等等。任何云不论你使用的 AWS、Azure 或是 GCP,GitHub Actions 都有着很好的支持,轻松部署你的代码到你所喜爱的云平台。
价格价格问题一定是大家最关心的~ 是的!GitHub Actions 对于开源项目是完全免费的,对于私有项目,也有每个月 2000 分钟的免费额度。
与 GitHub Package Registry 无缝集成今年五月份,GitHub 发布了 GitHub Package Registry。GitHub Actions 可以完美地与 GitHub Package Registry 集成,轻松地使用和发布你所熟悉的软件包:JavaScript (npm),Java (Maven),Ruby (RubyGems),.NET (NuGet),Docker 镜像等等。未来未来 GitHub Actions 还会有以下的两个重要更新:
注册使用 Beta 版目前,大家可以注册使用 Beta 版。11 月 13 日,GitHub Actions 将在 GitHub Universe 上正式发布!
几年前没用过jenkins的时候,每次都需要用eclipse打个war包,然后小心翼翼的上传到服务器,给服务器原有的war包改个名字,mv到bak目录中,停止服务,删除原有的webapps的项目,再把新上传的war包放进到tomcat的webapp说的目录下,启动项目。每次改个html的标签的名字都需要重新上传,每次都是这么繁琐的操作。其实小公司还可以容忍,如果是比较大的项目,还持续停留在这个脚本上运维人员都累死了,因为有可能一次部署几十个项目。
jenkins
Hudson是在2004年的夏天由Sun公司开发
2005年2月开源并发布了第一个版本。
Hudson发布的时候CruiseControl是CI界的老大哥,但是很快,在大约2007年的时候Hudson已经超越CruiseControl。2008年5月的JavaOne大会上,Hudson获得了开发解决方案类的Duke’s Choice奖项。从此,小弟翻身做大哥,Hudson成为CI的代名词。
2010年9月,乌龟壳公司偷偷把Hudson®™变成了注册商标。2010年11月,Hudson社区的核心开发人员发现并angry了,双方进行了不太友好的会谈,不出意料的谈崩了。圣诞节过后,
2011年的第一场雪,比以往来的要晚一些,几个秃顶的大叔在McDonald‘s的豪华包间里做了一个艰难的决定:
mv -f hudson jenkins
Hudson和Jenkins都拥有代码;
Hudson有Oracle和Sonatype’s corporate的支持和Hudson的注册商标
Jenkins拥有的是大多数的核心开发者,社区,和后续更多的commit。
jenkins git 、maven gitlab 、tomcat 构建持续集成环境 流程
1> 开发者将新版本push到git server (Gitlab)。
2> Gitlab随后触发jenkins master结点进行一次build。(通过web hook或者定时检测)
3> jenkins master结点将这个build任务分配给若干个注册的slave结点中的一个,这个slave结点根据一个事先设置好的脚本进行build。这个脚本可以做的事情很多,比如编译,测试,生成测试报告等等。这些原本需要手动完成的任务都可以交给jenkins来做。
4> 我们在build中要进行编译,这里使用了分布式编译器distcc来加快编译速度。
jenkins的工作原理是先将源代码从gitlab中拷贝一份到本地,然后根据设置的脚本进行build。我们可以看出,整个系统的关键就是那个build脚本,用来告诉jenkins在一次集成中需要执行的任务。
阅读更多