暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

云原生:DevOps & CI/CD 常见面试题汇总

云世 2021-11-02
5488

(文末提供最新【云原生系列课程】(DDD、K8s、ServiceMesh、微服务、Docker、Go语言学习)+【职场软技能】(架构师面试技能、管理实践、职场技能)免费课程资料获取途径)


DevOps 术语和定义

 

面试过程中,有两个必问问题:“你们公司是如何应用 DevOps 的”,以及“你是如何理解 DevOps 的”。

 

国内企业都已经开始通过自研工具或开源工具应用 DevOps 了,基本上都是先从自动化入手,将之前手动编译、打包、部署等环节转变为自动化方式。但是大多数企业的 DevOps 之旅也都停留在这个阶段,他们认为到这里企业就已经 DevOps 了。

 

这个结论和第二个问题的答案是完全匹配的。候选人在回到第二个问题时大多会认为:使用了 DevOps 工具,能够自动化部署,就是 DevOps 了。而事实上,DevOps并没有限制使用什么样的工具,强调的 DevOps 是一种理念,一种思想,将现代的科学技术应用于端到端的价值链中,并通过对企业文化、流程和制度的变革来获得更大的成功。

 

因此,虽然 DevOps 开发方法已经被证明是有效的,并且被越来越多的企业所接受,但企业在落地 DevOps 的过程中却不是一帆风顺的,大多数只停留在应用 DevOps 的初级阶段, 这也是很多人/企业普遍误认为 DevOps 不好,或者发挥不出真正价值的原因所在。


主要原因有以下三点:

 

DevOps 人才紧缺。由于 DevOps 进入国内市场的时间较短,真正做过 DevOps 平台的企业和个人更是屈指可数,市场需求的不断增加和 DevOps 人才供不应求,是目前的一个待解问题。

 

DevOps 技能待提升。大多数 DevOps 工程师都是半路出家,从运维、测试等转岗而来,往往由于之前工作经验的局限性,上手学习存在困难,工作中对 DevOps “只见树木,不见森林”,缺乏整体性认知,在开发和应用 DevOps 的过程中,很容易忽略全局。

 

缺乏整体视角的学习资料。 市场上关于 DevOps 的课程大多是讲具体的工具如何使用(比如,如何使用 Jenkins 搭建流水线),或者是对某个细分领域的讲解(比如,如何做好自动化测试),这些课程虽然对学习具体的技能很有用,但缺少对端到端的软件研发全生命周期,以及对 DevOps 的全面系统化讲解,难以培养出具有全局视角的 DevOps 工程师。

 

1. 什么是 DevOps

答:用最简单的术语来说,DevOps 是产品开发过程中开发(Dev)和运营(Ops) 团队之间的灰色区域。DevOps 是一种在产品开发周期中强调沟通,集成和协作的文化。因此,它消除了软件开发团队和运营团队之间的孤岛,使他们能够快速,连续地集成和部署产品。

想要将DevOps真正落地,首先第一点,是思维转变,也就是“洗脑”。不仅是运维的要洗,开发的也要洗。员工要洗,领导更要洗。

DevOps并不仅仅是组织架构变革,更是企业文化和思想观念的变革。如果不能改变观念,即使将员工放在一起,也不会产生火花。

除了洗脑之外,就是根据DevOps思想重新梳理全流程的规范和标准

在DevOps的流程下,运维人员会在项目开发期间就介入到开发过程中,了解开发人员使用的系统架构和技术路线,从而制定适当的运维方案。而开发人员也会在运维的初期参与到系统部署中,并提供系统部署的优化建议。

DevOps的实施,促进开发和运维人员的沟通,增进彼此的理(gan)解(qing)。

在思维和流程改变的同时,想要充分落地DevOps,当然离不开软件和平台的支持。

目前支持DevOps的软件实在是太多了。限于篇幅,就不一一介绍了。话说回来,现在DevOps之所以被吹得天花乱坠,也有这些软件和平台的功劳,可以趁机卖钱啊。 

2. 什么是持续集成

答:持续集成(Continuous integration,缩写为 CI)是一种软件开发实践,团队开发成员经常集成他们的工作。利用自动测试来验证并断言其代码不会与现有代码库产生冲突。理想情况下,代码更改应该每天在 CI 工具的帮助下,在每次提交时进行自动化构建(包括编译,发布,自动化测试),从而尽早地发现集成错误,以确保合并的代码没有破坏主分支。


3. 什么是持续交付

答:持续交付(Continuous delivery,缩写为 CD)以及持续集成为交付代码包提供了完整的流程。在此阶段,将使用自动构建工具来编译工件,并使其准备好交付给最终用户。它的目标在于让软件的构建、测试与发布变得更快以及更频繁。这种方式可以减少软件开发的成本与时间,减少风险。


美其名曰:“持续(Continuous)”,其实就是“加速——反复——加速——反复……”,这样子。

大名鼎鼎的——“敏捷开发(Agile Development)”解压图

友情提示:将该动图设为电脑屏幕背景,遇到压力可有效缓解)

4. 什么是持续部署

答:持续部署(Continuous deployment)通过集成新的代码更改并将其自动交付到发布分支,从而将持续交付提升到一个新的水平。更具体地说,一旦更新通过了生产流程的所有阶段,便将它们直接部署到最终用户,而无需人工干预。因此,要成功利用连续部署,软件工件必须先经过严格建立的自动化测试和工具,然后才能部署到生产环境中。

 

5. 什么是持续测试及其好处

答:连续测试是一种在软件交付管道中尽早、逐步和适当地应用自动化测试的实践。在典型的 CI/CD 工作流程中,将小批量发布构建。因此,为每个交付手动执行测试用例是不切实际的。自动化的连续测试消除了手动步骤,并将其转变为自动化例程,从而减少了人工。因此,对于 DevOps 文化而言,自动连续测试至关重要。

持续测试的好处:

a. 确保构建的质量和速度。

b. 支持更快的软件交付和持续的反馈机制。

c. 一旦系统中出现错误,请立即检测。

d. 降低业务风险。在潜在问题变成实际问题之前进行评估。

  

6. 什么是版本控制及其用途?

答:版本控制(或源代码控制)是一个存储库,源代码中的所有更改都始终存储在这个代码仓库中。版本控件提供了代码开发的操作历史记录,追踪文件的变更内容、时间、人等信息忠实地了记录下来。版本控制是持续集成和持续构建的源头。

 

 


上述这些关键要素里面,技术(工具和平台)是最容易实现的,流程次之,思维转变反而最困难。

换言之,DevOps考验的不仅是一家企业的技术,更是管理水平和企业文化。

对比前面所说的瀑布式开发和敏捷开发,我们可以明显看出,DevOps贯穿了软件全生命周期,而不仅限于开发阶段。


7. 如何在 DevOps 实践中进行变更管理

答:典型的变更管理方法需要与 DevOps 的现代实践适当集成。

第一步是将变更集中到一个平台中,以简化变更,问题和事件管理流程。

接下来,企业应建立高透明度标准,以确保每个人都在One-Page(同一认知和统一信息)上,并确保内部信息和沟通的准确性。

对即将到来的变更进行分层并建立可靠的策略,将有助于最大程度地降低风险并缩短变更周期。

最后,组织应将自动化应用到流程中,并与 DevOps 软件集成。 

 

如何有效实施 CI/CD

 

1. CI/CD 的一些核心组件是什么?

答:稳定的 CI/CD 管道需要用作版本控制系统的存储库管理工具。这样开发人员就

可以跟踪软件版本中的更改。

在版本控制系统中,开发人员还可以在项目上进行协作,在版本之间进行比较并消除他们犯的任何错误,从而减轻对所有团队成员的干扰。


连续测试和自动化测试是成功建立无缝 CI CD 管道的两个最关键的关键。自动化测试必须集成到所有产品开发阶段(包括单元测试,集成测试和系统测试),以涵盖所有功能,例如性能,可用性,性能,负载,压力和安全性。

 

2. CI/CD 的一些常见做法是什么?

答:以下是建立有效的 CI CD 管道的一些最佳实践:

¡ 发展 DevOps 文化

¡ 实施和利用持续集成

¡ 以相同的方式部署到每个环境

¡ 失败并重新启动管道

¡ 应用版本控制

¡ 将数据库包含在管道中

¡ 监控你的持续交付流程

¡ 使你的 CD 流水线流畅

 

 

3. 什么时候是实施 CI/CD 的最佳时间?

答:向 DevOps 的过渡需要彻底重塑其软件开发文化,包括工作流,组织结构和基

础架构。因此,组织必须为实施 DevOps 的重大变化做好准备。

 

 

4. 有哪些常见的 CI/CD 服务器

答:

Visual Studio 

Visual Studio 支持具有敏捷计划,源代码控制,包管理,测试和发布自动化以及持续监视的完整开发的 DevOps 系统。

TeamCity 

TeamCity 是一款智能 CI 服务器,可提供框架支持和代码覆盖,而无需安装任何额外的插件,也无需模块来构建脚本。

Jenkins 

Jenkins 它是一个独立的 CI 服务器,通过共享管道和错误跟踪功能支持开发和运营团队之间的协作。它也可以与数百个仪表板插件结合使用。

GitLab 

GitLab 的用户可以自定义平台,以进行有效的持续集成和部署。GitLab 帮助 CI CD 团队加快代码交付,错误识别和恢复程序的速度。

Bamboo 

Bamboo 是用于产品发布管理自动化的连续集成服务器。Bamboo 跟踪

所有工具上的所有部署,并实时传达错误。

 


5. 描述持续集成的有效工作流程

答:实施持续集成的成功工作流程包括以下实践:

¡ 实施和维护项目源代码的存储库

¡ 自动化构建和集成

¡ 使构建自检

¡ 每天将更改提交到基准

¡ 构建所有添加到基准的提交

¡ 保持快速构建

¡ 在生产环境的克隆中运行测试

¡ 轻松获取最新交付物

¡ 使构建结果易于所有人监视

¡ 自动化部署


每种术语之间的差异


1. 敏捷和 DevOps 之间有哪些主要区别?

答:基本上,DevOps 和敏捷是相互补充的。敏捷更加关注开发新软件和以更有效的方式管理复杂过程的价值和原则。同时,DevOps 旨在增强由开发人员和运营团队组成的不同团队之间的沟通,集成和协作。


它需要采用敏捷方法和 DevOps 方法来形成无缝工作的产品开发生命周期:敏捷原理有助于塑造和引导正确的开发方向,而 DevOps 利用这些工具来确保将产品完全交付给客户。


 


2. 持续集成,持续交付和持续部署之间有什么区别?

答:持续集成(CI)是一种将代码版本连续集成到共享存储库中的实践。这种做法可确保自动测试新代码,并能快速检测和修复错误。

持续交付使 CI 进一步迈出了一步,确保集成后,随时可以在一个按钮内就可以释放代码库。因此,CI 可以视为持续交付的先决条件,这是 CI CD 管道的另一个重要组成部分。

对于连续部署,不需要任何手动步骤。这些代码通过测试后,便会自动推送到生产环境。

所有这三个组件:持续集成,持续交付和持续部署是实施 DevOps 的重要阶段。

一方面,连续交付更适合于活跃用户已经存在的应用程序,这样事情就可以变慢一些并进行更好的调整。

另一方面,如果你打算发布一个全新的软件并且将整个过程指定为完全自动化的,则连续部署是你产品的更合适选择。


3. 连续交付和连续部署之间有哪些根本区别?

答:在连续交付的情况下,主分支中的代码始终可以手动部署。通过这种做法,开发团队可以决定何时发布新的更改或功能,以最大程度地使组织受益。

同时,连续部署将在测试阶段之后立即将代码中的所有更新和修补程序自动部署到生产环境中,而无需任何人工干预。


4. 持续集成和持续交付之间的区别是什么?

答:持续集成有助于确保软件组件紧密协作。整合应该经常进行;最好每小时或每天一次。持续集成有助于提高代码提交的频率,并降低连接多个开发人员的代码的复杂性。最终,此过程减少了不兼容代码和冗余工作的机会。

持续交付是 CI CD 流程中的下一步。由于代码不断集成到共享存储库中,因此可以持续测试该代码。在等待代码完成之前,没有间隙可以进行测试。这样可确保找到尽可能多的错误,然后将其连续交付给生产。

 

5. DevOps 和持续交付之间有什么区别?

答:DevOps 更像是一种组织和文化方法,可促进工程团队和运营团队之间的协作和沟通。

同时,持续交付是成功将 DevOps 实施到产品开发工作流程中的重要因素。持续交付实践有助于使新发行的版本更加乏味和可靠,并建立更加无缝和短的流程。DevOps 的主要目的是有效地结合 Dev  Ops 角色,消除所有孤岛,并实现独立于持续交付实践的业务目标。


另一方面,如果已经有 DevOps 流程,则连续交付效果最佳。因此,它扩大了协作并简化了组织的统一产品开发周期。


6. 敏捷,精益 IT 和 DevOps 之间有什么区别?

答:敏捷是仅专注于软件开发的方法。敏捷旨在迭代开发,建立持续交付,缩短反馈循环以及在整个软件开发生命周期(SDLC)中改善团队协作。

精益 IT 是一种旨在简化产品开发周期价值流的方法。精益专注于消除不必要的过程, 这些过程不会增加价值,并创建流程来优化价值流。

DevOps 专注于开发和部署-产品开发过程的 Dev 和 Ops。其目标是有效整合自动化工具和 IT 专业人员之间的角色,以实现更简化和自动化的流程。


7. DevOps与虚拟化、容器、微服务 之间有什么联系? 

大家可以设想一下,如果要对一项工作进行精细化分工,我们是对一个大铁疙瘩进行加工方便?还是拆成一块一块进行加工更加方便?

显然是拆分之后会更加方便。

所谓“微服务”,就是将原来黑盒化的一个整体产品进行拆分(解耦),从一个提供多种服务的整体,拆成各自提供不同服务的多个个体。

微服务架构下,不同的工程师可以对各自负责的模块进行处理,例如开发、测试、部署、迭代。

而虚拟化,其实就是一种敏捷的云计算服务。它从硬件上,将一个系统“划分”为多个系统,系统之间相互隔离,为微服务提供便利。

容器就更彻底了,不是划分为不同的操作系统,而是在操作系统上划分为不同的“运行环境”(Container),占用资源更少,部署速度更快。

虚拟化和容器,其实为DevOps提供了很好的前提条件。开发环境和部署环境都可以更好地隔离了,减小了相互之间的影响。




未来,公号将专门开辟一个DevOps专栏,分享DevOps实践,包括以下内容,欢迎关注。

DevOps 开发方法的发展历史。本部分志在追本溯源,为你梳理 DevOps 发展的来龙去脉,产生的时代背景,以及要解决的具体问题,这些软件行业存在的问题,DevOps 能否解决?学完本部分,你可以对 DevOps 有更清晰的了解,知道任何事物的产生都是有其原因,也是有其特点的,为后面更深入地实践 DevOps 打好基础。

 

DevOps 开发方法的最佳实践。本部分为你梳理 DevOps 的关键实践,包括短周期迭代、限制在制品数量、代码预检查、自动化、持续集成等,也会介绍常用的管理工具,比如影响地图、用户故事地图、看板方法等。学完本部分,你可以知道如何将 DevOps 实践应用到软件开发流程中,这些实践和工具应该在哪些阶段使用,用来解决什么问题。此外,该模块还选择了实际工作中比较有特点的两个案例,希望从三方及测试角度出发,帮助你理解 DevOps 如何落地。

 

DevOps 开发方法的度量指标。 DevOps 的一个核心思想是持续改进,而度量指标为持续改进软件交付提供了强力支持。学完本部分,你能够了解有哪些指标可用,以及如何有效发挥作用。


附:Devops实践过程

Devops 简单易懂、运维落地知识

一、什么是DevOps

二、公司开发流程

三、如何实现 DevOps 落地

四、持续集成交付部署

传统交付流程

容器交付流程

五、什么是 CI CD CD

六、总结


一、什么是DevOps

DevOps 是一种思想或方法论,它涵盖开发、测试、运维的整个过程

DevOps 强调软件开发人员与软件测试、软件运维、质量保障 (QA) 部门之间有效的沟通与协作

强调通过自动化的方法管理软件变更,软件集成,软件部署上线(CI/CD/CD)

使软件从 构建 到 测试、发布、更加快捷、可靠,最终按时交付软件。

如下图涵盖了整个 DevOps 的流程结构。

实现以下流程,也就实现了 DevOps 的产品落地。


开发Dev:

plan :开发设计,上线需求

code:开发人员编码实现需求

build:发开人员构建软件环境

管理Ops:

test:测试上线

release:发布到服务端

deploy:部署软件程序

operate:监控

monitor:运维


一个需求/软件,从诞生开始到上线维护的闭环流程。这个流程也就是 DevOps 实现一体化的方向。


二、公司开发流程

大白话讲解公司一个项目的落地过程:

  1. 用户给一个反馈,产品经理拿到客户反馈后,书写计划任务,变成对应的需求。

  2. 拿到产品的需求后,根据需求列举代办清单,代办清单里面有优先级。重要的事情优先处理。

  3. 然后进行迭代的计划,第一个拿到任务的是开发人员。

  4. 开发人员进行程序的开发,开发之后将代码上传到 github/gitlab 里面。最终发布到持续集成系统

  5. 持续集成系统有测试环境、发布环境、生产环境。测试负责干测试的事,运维负责干运维的事。


三、如何实现 DevOps 落地

DevOps 兴起于2009年,近年来由于云计算,互联网的发展。促进了 DevOps的基础设施以及工具链的发展,涌现了一大批优秀的工具,这些工具涵盖各个领域。帮助 DevOps 实现落地。

例如:Github/Gitlab、Git/svn、Docker、Jenkins、HudSon、Maven/Nexus 、Ansible(puppet)、ELk 等

开发人员只需要修改代码,并将其上传到仓库。剩下的事全部由 DevOps 持续集成自动完成。

开发 — devops — 测试 — 上线 ---- 监控 ---- 运维 。这一套自动化实现,不需要你手动操作,就叫 DevOps落地。

实现这些你必须的会很多可以实现 DevOps 的应用软件。


四、持续集成交付部署


生产线完成代码更新,之后的所有任务全部自动完成。


传统交付流程

提交代码至 gitlab/github,通过webhook出发SVN分支检测并触发构建

通过持续集成系统(jenkins-CI)对检测到的软件包进行分发部署


容器交付流程

在持续集成部分构建镜像并进行推送。推送至镜像仓库后,再执行批量部署。


五、什么是 CI CD CD

CI:持续集成 (代码写好存盘提交后,后续的构建能够自动化执行,再被测试工具部署到测试环境中进行测试,将所有步骤自动完成。一但出现问题打回重新处理)

CD:持续交付,Delivery(交付给运维进行部署,测试完成后打包到可以被运维拿到的共享文件服务,仓库当中。让运维工程师能从中得到打包好的构建好的产品)

CD:持续部署,Deployment (交付完成后进行部署,自动将包拖出来,触发任务自动发布到线上)


六、总结


传统模式 👉 敏捷模式 👉 DevOps 模式

开发团队需要与运维团队进行了大规模的"交接"。运维团队负责执行一系列“部署”活动,将软件代码转移到生产环境。并负责后续的系统稳定运行。生产环境的基础设施与开发或者测试不同。需要额外的检查和平衡,以确保它的一切功能正常。


DevOps 这种软件开发方法,涉及到软件整个开发生命周期,这些活动只能在 DevOps中实现,而不是传统与敏捷。

DevOps 是在较短的开发周期内开发高质量软件的首选方法,同时可以提高客户满意度。

往期推荐

关注 云世 微信公众号。

云原生:Docker容器各方面面试题汇总

云原生:K8s高频经典面试题汇总

架构师&技术面试专题


下一节,持续分享腾讯TSF面试问题+答案,记得来读。

如果你觉得这个系列有价值,也欢迎转发给有需要的朋友。



喜欢就|关注|转发|点赞|订阅专题吧
公号专题
云原生」「微服务」「Service Mesh
K8s」「DockerDDD
职场养分」「职场软实力认知跨越
架构师专题」「带团队专题

---END---

⚠️更新⚠️

回复:DDD,领取DDD全系列解决方案;

回复:K8s,领取K8s架构全系列资料;

回复:微服务,领取微服务实践方案;

回复:容器,领取容器全系列学习资料;

回复:servicemesh,领取servicemesh全系列实践方案;

回复:go,领取Go语言学习全系列学习资料;

回复:职场软技能,领取职场软技能系列;

回复:管理实践,领取管理实践资料;

回复:面试技能,领取面试技能资料;

回复 2021报告,领取35份最新行业分析报告;

回复:PPT,领取海量面试资料和简历模板;


文章转载自云世,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论