发布于 2026-01-06 1 阅读
0

DevOps 职业发展与面试

DevOps 职业发展与面试

DevOps 是开发和运维的交汇点,也是应用程序发布流程的核心。在开发应用程序时,无论采用敏捷开发还是瀑布式开发方法,开发人员的主要目标都是将成果交付给最终用户。用户必须能够随时使用应用程序。DevOps
旨在加快持续交付流程,最大限度地减少错误并预防 bug。因此,DevOps 能够为用户提供高质量且经过充分测试的改进方案。

本文是与我举办的网络研讨会配套的文章,您可以观看完整版。

DevOps旨在解决哪些挑战?

首先也是最重要的一点是:

沟通不畅

开发人员和运维人员之间沟通不畅、缺乏协作。DevOps 团队必须牢记,应用程序发布包含以下几个方面:

  • 编写应用程序代码、部署和运行应用程序;
  • 开发人员负责编写代码,运维人员负责运行。

开发人员通常面临的问题是“我编写了一个应用程序,但我无法部署和运行它”,而运维人员则面临着“我正在运行应用程序,但我不知道它是如何工作的”。开发人员在编写代码时没有考虑应用程序的部署位置和方式。而运维人员则在不了解部署内容和原因的情况下尝试部署。

这通常会导致开发人员和运维团队之间沟通不畅。代码编写完成后,开发人员往往未能充分编写部署指南,或者某些应用程序的功能可能引发过多问题。结果,运维团队部署困难重重,甚至可能提出改进建议后退回开发。这种沟通不畅可能导致发布周期延长数天、数周甚至数月。

因此,从代码编写完成到部署开始之间并没有明确的自动化流程。即使存在这样的流程,它也是基于复杂的检查清单,需要不断获得两个团队的批准。

团队合作

传统上,一个团队负责开发,另一个团队负责运维。这两个团队的目标截然不同,导致他们难以有效合作。开发人员希望更快地推出新功能;而运维团队则需要确保这些变更不会引发任何问题,因为运维团队负责维护生产环境的稳定性。他们的工作重点是保证应用程序的可用性、稳定性、安全性等等。

这意味着该应用程序可能需要更长时间才能发布,尤其考虑到运营部门对代码并不完全了解。

例如,开发人员创建了一个新功能,该功能在生产环境中消耗了过多资源。服务器过载并崩溃——现在运维团队需要修复这个问题。由于是运维团队负责救火,开发人员往往不像运维人员那样谨慎对待产品和稳定性方面的每一次变更。尽管每位员工的主要目标都应该是快速地向最终用户交付高质量的应用程序。实际上,开发人员希望尽快实现并发布新功能,而运维人员则专注于维护系统的稳定性。这就是为什么他们经常抵制新的变更,从而造成利益冲突。因此,这种架构自然使得这两个团队难以协作。

安全

每家公司在开发新功能时都必须将安全性放在首位。运维和安全团队必须仔细评估所有变更,以确保不会影响系统稳定性。在传统的运维模式下,这种手动流程需要耗费数天、数周甚至数月的时间。

如前所述,DevOps 的核心在于消除任何阻碍流程的障碍,包括安全问题。正因如此,才有了 DevSecOps 这个术语——旨在强调并提醒团队安全的重要性。

应用测试

许多项目会组建专门的团队或设立新的职位,负责对应用程序进行不同层面的测试,例如特定功能测试、完整应用测试、不同环境测试以及性能测试。这些测试通常需要手动完成:团队不能总是依赖自动化测试。

只有经过人工测试后,变更才能发布。虽然这可能并非由开发或运维团队完成,而是由专门的测试人员执行,但这却是发布流程中至关重要的一环。同时,它也可能显著减慢发布速度。

体力劳动

在发布过程中,许多任务,例如测试、安全检查和部署,过去都是手动完成的。例如,运维人员通常会手动完成大部分任务,他们要么直接在服务器上执行命令来安装工具、配置组件、打补丁,要么编写脚本或小程序来执行这些任务。

但两种情况都包含人工操作——部署应用程序、准备部署环境、配置服务器、用户访问权限等。这使得流程更慢,也更容易出错。人工操作的另一个缺点是知识共享困难。由于执行这些任务的人员需要记录操作过程,而其他人又需要阅读这些记录,因此流程较为复杂。此外,人工操作也不透明,难以追踪。

如果基础设施配置是手动完成的,并且基础设施出现问题,则快速恢复和复制完全相同的基础设施状态将变得不可能。

你必须清楚地记住对服务器进行了哪些操作。同样,由于新的障碍,发布流程再次放缓。

在安全性和测试方面,DevOps工程师具备相应的资质,能够审查开发团队和运维团队的任务。无论问题是什么,DevOps都能消除所有阻碍发布流程的障碍。

DevOps 可以提供完全自动化、精简的流程,取代手动、低效的流程,使应用程序的发布变得轻松高效。

DevOps工程师如何帮助解决这些问题?

DevOps 是一系列实践和工具的组合,旨在快速、高质量地发布软件。

DevOps 让开发人员和运维人员能够更频繁地协同工作。不同的公司实施 DevOps 的方式各不相同,因此成为 DevOps 工程师并没有统一的标准途径。

然而,自从DevOps开始被采用以来,这一流程已经呈现出更加具体的形式,并在许多公司中形成了共同的模式,包括设立专门的DevOps工程师职位。用于实现DevOps原则的一系列技术被称为DevOps技术,每位DevOps工程师都需要学习这些技术。DevOps包括众所周知的CI(持续集成)和CD(持续交付)流程。

如何成为一名DevOps工程师?

让我们来看看 CI/CD 流水线由哪些部分组成,成为一名 DevOps 工程师需要学习哪些工具和概念,他们的任务和职责,以及 DevOps 与开发和运维团队之间的界限。

一切都始于开发者使用特定技术栈、不同编程语言和构建工具编写的应用程序。他们会有一个代码仓库用于工作,其中最流行的仓库之一是 Git。作为 DevOps 工程师,您无需编写应用程序代码。您需要了解开发者的工作方式、他们偏好的 Git 工作流程,以及应用程序如何与其他服务(例如数据库)进行配置,并掌握基本的自动化测试概念等等。

当应用程序部署到服务器供用户访问时,DevOps 团队需要创建一些基础设施,包括本地服务器或云服务器。作为 DevOps 工程师,您将负责准备运行应用程序所需的基础设施。由于大多数服务器和应用程序都运行在 Linux 服务器上,因此您还需要具备 Linux 基础知识(Linux shell 命令和 Linux 文件系统)、命令行界面 (CLI)、服务器管理以及如何通过 SSH 连接到服务器。

网络与安全

最好还能学习一些网络和安全方面的基础知识,例如配置防火墙来保护应用程序以及打开端口使其可以从外部访问。

其他必备技能包括:

  • 了解 IP 地址和端口
  • DNS

然而,DevOps工程师无需掌握高级网络和安全概念,也无需能够从头到尾管理服务器。系统管理员和网络安全工程师通常专门负责这些领域。

作为一名 DevOps 工程师,你的工作是充分理解相关概念,以便能够准备服务器来运行你的应用程序,但不需要管理服务器和整个基础设施。

容器

如今,应用程序都以所谓的容器形式运行。这意味着您需要了解虚拟化和容器的概念,并能在服务器上管理容器化应用程序。目前最知名的容器化解决方案之一是 Docker。

一方面,开发人员负责开发新功能和修复漏洞。另一方面,我们拥有用于运行应用程序的基础设施和服务器。问题在于如何将新功能和漏洞修复从
开发团队快速高效地部署到服务器,并最终提供给最终用户。这正是DevOps工程师的主要目标。

首先,当功能或错误修复完成后,我们需要运行测试并将应用程序打包成工件,例如 jar 或 zip 文件,以便进行部署。这就需要用到构建和包管理工具(Java 应用程序使用 Maven Graden,JavaScript 应用程序使用 Npm)。

下一步是将此工件保存到某个位置,例如镜像仓库、Docker Hub 上的 Docker 工件仓库或 ECR(Amazon Elastic Container Registry)。这意味着 DevOps 工程师必须了解如何创建和管理工件仓库,方法是创建一个流水线,按顺序执行所有这些步骤。GitHub Actions、GitLab 或 Jenkins 自动化工具可以帮助您完成这项工作。

将流水线与 Git 代码库连接,即可获取实际的开发代码。这是持续集成 (CI) 流程的一部分,该流程会对 Git 代码库中的代码变更进行持续测试。只有在新功能和错误修复经过测试、构建和打包后,才能将其部署到服务器。

可能还有更多步骤,例如向
团队发送关于流水线状态的 Slack 通知,或者处理部署失败的情况。此流程代表了 CI/CD 流水线的核心。

CI/CD 流水线是所有 DevOps 任务和职责的核心。作为一名 DevOps 工程师,你应该能够对其进行全面配置。

如今,许多公司使用云端虚拟基础设施(也称为基础设施即服务,例如 AWS、Google Cloud 等),而不是创建自己的物理基础设施。

如果你不掌握至少一种云基础设施的核心概念,你的工作将寸步难行。这些平台可以为你管理很多东西。例如,你可以使用云服务提供商的用户界面管理门户,通过各种服务创建网络、防火墙以及基础设施的各个组成部分。

例如,假设您的应用程序运行在 AWS 上。您需要了解 AWS 云提供商及其服务(请注意,AWS 非常复杂,但您不必了解其每一项服务)。

容器编排(Kubernetes)

我们的应用程序将以容器形式运行。Docker 足以管理这些容器,但如果您有大量的容器和微服务,则需要更强大的容器编排工具。其中最流行的工具是 Kubernetes。

Kubernetes 是一个功能强大但非常复杂的工具,因此为不同的团队设置和管理多个集群需要付出很多努力。

监测

数千个容器和数百台服务器。如何跟踪单个应用程序的性能和基础设施问题?

DevOps工程师负责设置和监控应用程序、底层Kubernetes集群和服务器。Prometheus等监控工具通常可以帮助完成这项工作。

基础设施即代码

每个项目都需要测试和开发环境,以便正确准备应用程序并进行部署。创建和维护基础设施本身就非常耗时,而且极易出错。我们不想进行任何手动测试。

如前所述,每位 DevOps 工程师的目标都是尽可能地自动化流程。那么,我们如何实现基础设施创建、配置和部署的自动化呢?这可以通过两种基础设施即代码 (IaC) 工具来实现:

  • 基础设施配置工具(Terraform、Pulumi)
  • 配置管理工具(Ansible、Chef)

作为一名 DevOps 工程师,你必须了解以下至少一种类型才能胜任工作。

脚本语言

由于您需要与开发人员和系统管理员紧密合作,实现部分任务的自动化,因此您需要为他们编写脚本,例如备份、系统监控、定时任务或网络管理等小型应用程序。为此,您需要掌握一种脚本语言。这可以是特定于操作系统的脚本语言,例如 Linux/Mac 的 Bash 或 Windows 的 PowerShell,也可以是功能更强大、更灵活的语言(例如 Golang 或 Python)。这些编程语言不受服务器或本地操作系统的限制。

Golang 易于学习、易于阅读且灵活。它拥有适用于大多数数据库以及不同云平台(例如 AWS 和 Google Cloud)的库。

结论

你现在可能在想:“我需要学习多少种工具?每个类别都需要学习多种工具吗?我应该选择哪些工具呢?”

你应该学习每个类别中最流行、最常用的工具。因为一旦你理解了一种工具的概念,正确使用其他工具就会容易得多。

一次性掌握这些技术非常重要,因为这正是DevOps工程师的工作内容。最好能立即在实际项目中应用它们。

文章来源:https://dev.to/firdavs_kasymov/master-devops-career-and-interview-3lko