快捷菜单
常用功能一站直达
更多功能请点顶栏「快捷菜单」

[toc]



为什么会存在孤岛? 我来给大家简单的描述一下。这个这种情况可能出现的也比较多。如图所示左边是开发团队, 右边是我们的运维团队。
举个例子: 现在我们有一套应用的生产环境(PROD 生产环境),以开发同学的角度来说“提交代码想要快速更新的生产环境” 而以运维同学的角度来说“不希望频繁的更新,更希望环境的稳定”。这时候就会产生沟通和协作类的问题。
形成了中间的一堵墙,怎么来打破这个墙? 通过DevOps解决Dev开发团队与Ops运维团队之间的沟通和协作问题。
DevOps最重要的一点就是要提高研发效能!

DevOps是一种思维方式,同时也是一组工作实践。
成功的DevOps是将人、过程和工具相互融合。
DevOps并不是简单的理解为自动化工具。
DevOps 一词是由“开发”和“运营”这两个词组合而成的,是一种文化转变,在开发团队与运维团队架起了桥梁(一般开发团队与运维团队形成孤岛、隐形的墙)。

DevOps不仅仅是工具,也不仅仅是自动化而是文化与工具的相互结合。 (如果想了解更多DevOps文化相关的知识可以网上找下或者买本书**==《DevOps实践指南》 《持续交付》==**)
在企业中去实施DevOps, 工具是底层的技术,更多的是先了解软件开发团队之间的一些协作的过程,找出协作相关的问题进行实施改进。自动化流程改进涉及到很多工具链的集成技术。
DevOps方法论是我们在进行DevOps实践时必须掌握的原则类知识。

我们开发过程中一般经常会遇到以下环境:
简单的来说就是:
pro环境:生产环境,面向外部用户的环境,连接上互联网即可访问的正式环境。
uat环境:验收测试环境,主要面向要交付的人员进行验证测试。
pre环境:灰度环境,外部用户可以访问,但是服务器配置相对低,其它和生产一样。
test环境:测试环境,外部用户无法访问,专门给测试人员使用的,版本相对稳定。
dev环境:开发环境,外部用户无法访问,开发人员使用,版本变动很大


然后我们来了解一下, 传统的这个应用发布模式。 更有助于理解DevOps解决的核心问题。
GitLab作为我们的版本控制系统,存储相关的项目开发代码。 开发人员写完代码会Push到版本控制系统并通知运维同学进行部署。
运维同学会Pull下载代码并通过一些构建工具进行Build阶段生成Artifact制品。如果Artifact制品生成失败,定位错误原因如果是代码问题需要开发同学Review和Check。 Artifact制品打包成功后通过scp等工具发布到应用环境服务器,然后通过脚本启动运行服务。
最后交给测试同学进行测试验证(发现功能性问题提Bug给开发,环境不稳定问题提Bug给运维同学)。
问题:
手动操作很多、出现的问题很多。上面看似很流畅的过程,其实每次构建或发布都可能会出现问题。未对每次提交验证、构建环境不一致:开发人员本地测试成功后提交代码,运维同学下载代码进行编译却出现了错误。

传统的发布模式存在的一些问题: 这都是人工手动操作的。 手动进行一些这个更新和发布的一些操作,极容易出现一些错误。流程太依赖于手动操作了。
DevOps第一件事情就是将人工手动重复操作的事情都进行自动化实现。将Build、Deploy、Test阶段进行结合,对流程可视化有助于发现问题。









现在的coreOS被redhat收购了。

CI工具:(gitlabCI,github-action) Prow是kubernetes官方使用的工具! Kaniko在云原生平台做镜像打包的工具;











上一章节我们说了是“DevOps核心=CI/CD自动化”。 主要是因为这些传统的发布模式所带来的一些问题,导致我们不得不做一些自动化。
代码是写死的,失败就是失败,成功就是成功。排查失败原因并不断的优化最后形成稳定的工作流程。人工手动操作可能会出现随着时间的增长,某些集群未同步导致应用启动等问题发生。
只有掌握了DevOps的一些方法论的相关知识,你才能够通过这些技术工具等一些手段来实现它的效能的提升。
核心还是价值流和效能提升。



开发人员频繁(—天内多次)合并和提交代码到分支。
Cl是合并开发人员正在开发编写的所有代码的一种做法。
目标:在初始阶段检测到任何集成错误,以便可以迅速修复。
理想状态:每次提交代码会触发持续集成流程和反馈。
注意:以前有个争议?有必要每次提交代码都要触发持续集成流程和反馈吗? –>推荐:一组代码提交!
持续集成主要指的是开发人员的一些操作, 为什么会出现持续集成? 有些开发人员并不会将每次开发完成的特性代码提交到版本控制系统, 发布时才会对代码进行集成导致出现代码冲突和编译等相关的问题。
持续集成提倡的是开发同学以小的特性为单位,每完成相关特性就更新同步到版本控制系统。 并进行一些测试和验证(例如:此时配置一套提交构建流水线,对提交的代码进行编译构建和代码扫描,发现问题邮件通知提交人)
持续集成的目标不是每次提交就进行构建,按照实际项目的情况选择定时构建或者自动触发。例如开发人员提交代码后晚上11点进行定时构建,第二天上班可以及时看到项目的集成测试情况。

在CI的基础上自动化的将软件部署到各种环境中;
理想状态:每次变更自动部署到生产环境;(CI和CD是一条流水线)
持续集成的流程完成后会有一个构建阶段,此阶段会输出一个包,即我们的应用程序。接下来开始去部署。
回顾传统的发布模式,运维同学通过scp手动的将包发布到服务器上面, 而如果要做自动化就要通过脚本或者自动化部署工具完成。
持续部署在持续集成阶段后面, 主要是通过自动化的方式将应用部署到各个环境中。 此时注意一个“无序交付”的问题。不应该变更后直接自动部署到生产环境,这样会造成错误的代码发布的生产环境造成风险。而是增加一个审批限制(卡点),通过审批后再进行生产环境的发布。

CI流程
更快的反馈有助于检查代码的质量问题;
尽快的发现问题,避免代码集成冲突;
CD流程
做了CI/CD之后有哪些好处呢
CI体现的就是更快的反馈, 有些问题的时候可以快速的反馈给开发人员。谁提的代码然后构建出问题了给他发个邮件、钉钉、企业微信通知。快速的反馈、尽快的发现问题,避免代码集成的冲突。 这是CI流程解决的一个问题
CD可以降低发布风险,自动化工具要比人工发布更可靠一些,出错的情况更少一些。 持续部署可以更快的获得用户的反馈。

提交阶段主要是对开发人员提交的代码进行检查,代码扫描;
构建阶段是通过构建工具进行打包生成制品的过程;
测试阶段主要对已发布到环境的应用进行自动化的测试;
生产发布是最后一个阶段,当测试没问题后进行生产版本的发布。
==AiOps,NoOps==

DevSecOps将安全工具和流程嵌入到DevOps工作流程中,并自动执行核心安全任务。
代码分析,识别安全漏洞;
变更分析,确定变更的影响;
合规性检查;
Sec指的是安全实践,每个公司里面都是有安全团队的。 我们之前做的一些实践,就比如说我们上面做的这个CI/CD管道。可以在管道中添加一些安全工具和流程。(安全是个单独的领域,如果感兴趣也可以进行学习和实践)
悬镜安全



借助GitOps,团队可以自动化基础架构的配置过程。
使用声明文件将基础架构编写为代码 (laC) 。
存储在Git存储库中,就像存储应用程序开发代码一样。
编写Terraform配置文件创建VM/K8s集群;
编写Yaml配置文件部署K8s应用;
GitOps,Git与代码有关,即将基础设施以代码的方式声明并存储到Git版本控制系统中。GitOps强调的是基础设施即代码。
1GitOps的火热程度基本上是要超过devops了;
2GitOps更偏向于底层的基础架构;
3
41.vm
52.非vm:k8s环境
6 1.k8s基础环境:tf写一个模板,我就可以调用云厂商的api,来创建一套k8s环境。--这个是收费的!
7 2.k8s上层的应用:
8 yaml文件也存到git上去,然后我们发布的时候在git里面修改yaml的配置就好。
9 所以:git里面存了一个是基础架构的代码,一个是k8s环境里应用配置代码;Pipeline as Code指的是以代码的方式描述Jenkins Pipeline。 而基础设施即代码指的是以代码的方式描述所使用的基础设施资源, 例如服务器,负载均衡器等等。



ChatOps是一种现代工作方式,它将人员,工具和聊天结合在一起,以提高生产力并帮助企业更快地发展。
ChatOps奖励组织提高效率,自动化和创新的能力,更高的可靠性,更快的事件响应时间。
1ChatOps
2 钉钉机器人
3 飞书机器人
4 企业微信
5 TEAMS
6 消息通知机器人/交互式机器人 需要自己去开发一个机器人!ChatOps, 大家应该都用过钉钉机器人来消息通知和协作。 以聊天的方式发送指令由机器人自动化处理。



那在企业里面怎么推起来,其实在企业里面去实施DevOps,除了技术上的一些问题,还有很多因素去决定的。
某条流水线并不是都适合每个公司团队的: 首先,要标准化他们的开发方式,开发模式。 然后,你再去设计这个流水线。
系统负载测试(压测)-并发量)(自动化测试)CI/CD常见的问题 CI遇到的问题比较多:走出这个误区:有时候jenkins报错并不一定是jenkins本身有问题,有可能是研发的代码有问题。之前有个案例,研发本地代码编译没问题,但用jenkins打包出现了问题!最后排查后发现是研发本地有缓存,但生产环境里没缓存导致的! CD遇到最多的一个问题就是环境不一致的问题:例如环境的配置不一致,最终导致我们的部署失败;
构建阶段: maven、go 构建(单元测试) –》 jar包–>配置中心:nexus docker镜像–>镜像仓库:harbor 仓库,配置中心:nexus 3制品库, (nacos,阿波罗, eurak) 制品库就是为了解决重复编译的问题。 制品类型: 制品(jar包 war包 二进制程序 镜像)
测试阶段: 手动测试 自动化测试:写测试用例,接口测试; //其实这种单元测试写起来还是非常费时间的;单元测试的代码基本都是重复的,都是可以直接去用;性能测试;压力测试; //压力测试:可能要熬夜哈哈。想用jenkins去解决这个问题,比如说定时,晚上自动去压。当时试了一下,还是可以的,但是还是有人要在线去值守的; 全链路测试; 基础测试:代码质量,你的项目能不能编译成功,单元测试用例能不能都跑过? 会扫描他们的代码:都是把这些工具集成到流水线里面。 有没有硬编码,有没有一些违规的东西; harbor自己就有一个容器镜像扫描;
代码库管理规范:
2种方式:
分支开发模式:
主、干分支 特性分支
禅道)Kaniko:在云原生平台做镜像打包的工具;)jacoco是什么?
Tekton是什么?
gitlab:一体化的平台
学习devops最好的方式,看devops的厂商,例如云原生监控,制品库厂商。
企业里用的最多的还是Jenkins,Gitlab-ci做ci还是可以的,做CD还是有一点点不方便的; 大型公司用的也是Jenkins;
Devops平台化(基于工具链开发一个UI) 学一些开发技巧对这个Devops平台进行扩展;
ci工具:
需求管理 Jira

⚠️ 问题:这些ci工具,如何才能无缝迁移?
我们可以写个python脚本去做发布流程,python–>jenkins(.sh),gitlab-ci(script) 你可以把jenkins、gitlab-ci等都可以当做成一个流程工具,具体的代码实现,你可以自己去写。

避免无序交付:手动确认仍然至关重要。避免将代码直接推送到生产中时用户可能会遇到的错误。
对DevOps误解:认为DevOps工程师的目标是解决与DevOps相关的所有问题。
速度胜于质量:急于在较短的时间内完成并完成尽可能多的DevOps项目,以保持其在竞争激烈的市场中的地位。
组建一支专门的DevOps团队:最好由QA,OPS和DEV的新团队成员和现有员工组成。
大型公司:商业付费软件(企业,商业化的软件,例如云霄,蓝鲸。) 小型公司:开源软件
Jenkins2.0核心特性:Pipeline As Code,以代码的方式描述流水线作业。特别适合大规模下的流水线复用,即多条流水线使用相同一套流水线模板。
训练营中最重要的一部分就是Jenkins PIpeline As Code,是最核心的内容。 Pipeline + Groovy YYDS!
Groovy这门语言其实与Python编程语言语法上很类似。
围绕着Gitlab做持续集成流水线,用Jenkins来集成Gitlab来实现提交流水线。–这个也是最基本的一个流水线。

回答:
其实这2种方式,都是我们经常用到的2种方式。
配置成提交即构建方式;
手动触发,例如发布到生产环境,中间需要有个审批(卡点)流程;
环境:
日本:跑灰度的
台湾:生产环境
日本跑完灰度,没问题后,想直接用这个镜像来发布到台湾的生产环境中去;
之前是2个job;
用ansible来发布的;
harbor镜像仓库;

回答:
1.把yaml模板通过版本管理起来; Jenkins调api从git上去拿;

2.或者镜像单独存git里,生成一个文件,总之要有一个状态 Jenkins调api从git上去拿;
延迟很大 2套jenkins库。
Harbor搭个主从,让异地自己去同步。(harbor是有这种策略的)
生产环境的灰度。
网关才是最可怕的。
如果两边合成一个集群的话,一定要考虑etcd一致性问题,时延一旦大,etcd必定出问题,集群必崩。
用istio的东西流量去做灰度,这个会更方便一点。






一个完整的Devops体系

我的博客主旨:
🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

🍀 微信公众号 《云原生架构师实战》

🍀 语雀
https://www.yuque.com/xyy-onlyone

🍀 csdn https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

🍀 知乎 https://www.zhihu.com/people/foryouone

好了,关于Devops理论与基础就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!

日历 · 精选 · 友链 · 更多
如果内容对你有帮助,欢迎请我喝杯咖啡 ☕



One的公众号
爱折腾博客的小白