DevOps Essentials

https://community.aws/concepts/devops-essentials

What is DevOps?

DevOps 一词由 Patrick Debois 于 2009 年创造,是软件开发 (Dev) 和信息技术运营 (Ops) 实践的结合。DevOps 的核心是一种协作解决问题的方法。它重视团队合作和沟通、快速反馈和迭代,以及通过自动化消除摩擦或浪费。它之所以受欢迎,是因为它鼓励团队将他们的工作分解成更小的块,并以整体方式处理产品交付,从而实现更好的团队透明度和更快、更可靠的部署。DevOps 由多种实践组成,包括文化、流程和工具。虽然需要注意的是,实施DevOps实践不仅仅是简单地添加管道或使用容器,但这些和其他领域是我们为帮助实现目标而努力的常见技术领域。DevOps 的很大一部分围绕着采用 DevOps 文化,我们在 DevOps Foundations 中更详细地介绍了这种文化,以及通用框架和团队拓扑。

Getting started

在本节中,我们将介绍一些概念,例如如何决定从哪里开始以及不同的开始方法。在开始时,请务必注意,没有太小的步骤不能计入进度。你不需要一直潜入 - 事实上,最好不要这样做!一开始,您希望通过采取较小的行动并获得快速反馈来最大限度地减少风险和摩擦。然后,您将通过进行小的迭代更改和建立动力来继续改进。

找到一个好的起点的另一种方法是与将依赖您工作的团队交谈。他们是否采取了导致时间浪费或瓶颈的手动步骤?他们是否有关于如何部署或测试工作的愿望清单?有时,最容易开始的地方是你已经知道你需要的地方。您已经决定进行一些小的迭代更改,但是我们如何处理它也很重要。构建基础架构有多种方法,每种方法都有不同的优势和挑战。

Infrastructure implementation patterns

通常存在一些团队用来交付软件系统的基础设施,从构建管道到数据库、Web 服务器、负载均衡器等。有几种方法可以设置此基础结构。

ClickOps

将基于浏览器的控制台用于工具或平台(如 AWS 管理控制台)是探索哪些服务可供您使用以及它们如何组合在一起的好方法。但是,它不能很好地扩展,因为它不可重复,不明显是谁进行了更改,或者易于与他人协作,并使您更容易创建更多的手动错误。

Procedural

这些是以编程方式自动执行的一系列步骤,例如必须按特定顺序完成才能完成任务的脚本。这种方法告诉程序要做什么,一步一步,程序按照指令的编写顺序执行指令。过程脚本的示例可能类似于数据库备份脚本,该脚本连接到数据库,将数据导出到文件,然后将文件复制到备份存储位置.

Declarative config

描述系统的所需最终状态,而不是指定实现该状态所需的步骤。该程序负责确定实现所需状态所需的步骤。声明性脚本的一个示例可能是指定系统所需设置的配置文件,例如应安装的软件包、应创建的用户和网络配置。

这些是按最小复杂性和短期收益与较高复杂性和长期收益相比的顺序列出的。通过遵循基于浏览器的向导或使用现有的 CLI 命令,通常更容易快速浏览和创建某些内容,但随着团队或系统的增长,扩展和维护起来就更难了。从列表的更高位置开始,然后逐步下降是可以的。您可以评估权衡取舍,并决定目前哪种最适合您的团队。

Examples of procedural compared to declarative

让我们用一个例子来说明过程方法和声明性方法之间的区别。在此示例中,您需要创建新的虚拟机和数据库,并配置防火墙规则以允许从虚拟机访问数据库。在过程方法中,您将使用以下步骤(伪代码)创建脚本:

create-virtual-machine --name "my server" --cpu 8 --mem 16 --disk 50
create-database --name "my db" --cpu 8 --mem 16 --disk 50
create-firewall --name "database firewall"
create-firewall-rull --name "allow db access from vm" --port 3306 --protocol tcp --source

此脚本可以运行一次,如果需要进行任何更改,则需要对其进行修改或编写新脚本。重复运行此脚本将不起作用,因为它将尝试创建全新的资源,而不是管理现有资源。命令需要按一定顺序运行,否则会遇到错误。例如,在 VM 存在之前,您将无法创建防火墙规则。如果需要更改名称,则无法运行相同的命令,而是需要添加 update-virtual-machine --machine-id XYZ --name “My new servers”。

使用声明式,您可以通过指定所需的内容来处理它,并将其留给工具来决定如何执行此操作。将上述过程示例与以下声明性示例(伪代码)进行比较:

virtual-machine: { name: "my server", cpu: 8, mem: 8, disk: 50 }
database: { name: "my db", cpu: 8, mem: 8, disk: 50 }
firewall: { name: "database firewall", rules: [ { name: "allow db access from vm", port: 3306, protocol: tcp, source: virtual-machine.IP } ] }
您使用的声明性工具将创建您声明的资源,而无需指定顺序。此外,如果需要更改 VM 名称,只需更新 name 变量并重新运行它。然后,它将确定需要哪些更改才能使您达到声明的所需状态。

Core concepts and why they’re important

作为应用DevOps概念的人,您将在整个堆栈中的多个不同位置工作。由于域附带的跨团队协作的性质,您有时可以直接在源代码、网络、安全、数据、测试框架或介于两者之间的任何位置工作。现在我们已经讨论了入门和一些方法,让我们介绍一些关键概念、它们的好处以及用于实现它们的工具示例。

Infrastructure as Code

基础结构即代码 (IaC) 通常是一种声明性方法,用于管理基础结构,其处理基础结构组件(如物理服务器和虚拟机)的方式与应用程序代码类似。根据您选择的工具,您可以使用标记语言(YAML、HCL 或 TOML)或更通用的语言(Python、Go 或 Java)来描述它们,然后将其存储在版本控制中,以便我们以可重复和自动化的方式对其进行管理。基础架构即代码允许我们将开发应用程序代码时使用的相同最佳实践和过程应用于基础架构。可以对配置文件进行测试和版本控制,并且可以使用与代码更改相同的过程对基础结构进行更改。如果出现问题,我们可以回滚到上一个稳定版本。这有助于减少错误并提高可靠性。此外,IaC 可以更轻松地扩展和管理基础结构,尤其是在基础结构需要频繁更改的动态环境中。您可能用于预置基础设施的一些工具包括 HashiCorp 的 Terraform、AWS CDK 或 AWS CloudFormation。

Configuration management

配置管理 (CM) 允许我们通过组织和维护有关硬件和软件的信息来将系统保持在所需状态。想一个文件,它列出了要使用的操作系统、要在设备上安装的软件及其版本或将应用于系统的设置和配置等信息。过去,这可能是手动完成的,或者使用连接到存储库并一次安装一个工具的过程脚本来完成,在第一个问题时停止。CM 有助于建立可见性并简化配置过程,从而更轻松地跟踪和管理随时间推移的更改,从而降低成本、复杂性和错误。配置管理工具的一些示例包括 Ansible、Chef 和 Puppet。

Secrets management

机密管理使我们能够通过存储、管理和分发敏感信息(如密码、API 密钥和加密密钥)来安全地组织和维护应用程序的信息。它是安全性和合规性的一个重要方面,因为它有助于确保以安全的方式存储和传输敏感信息,并且只能通过代码和授权程序访问。密钥管理工具的一些示例包括 HashiCorp Vault、AWS Secrets Manager 和 AWS Key Management Service。

Containers

容器是一种以一致、轻量级和可移植的方式打包和运行应用程序的方式,因此它们可以在开发人员的笔记本电脑、测试服务器或生产环境中运行。应用程序及其依赖项被打包到一个容器映像中,确保应用程序无论是在笔记本电脑、测试服务器还是在生产环境中都能一致地运行,从而更轻松地进行开发、测试和部署。这不仅有助于建立可靠性,还简化了运行软件的运营开销,因为它提供了一种构建、测试、部署和运行软件的标准化方法。您将看到的最常见的容器化工具是 Docker。

posted @ 2024-03-21 13:43  goldtree358  阅读(1)  评论(0编辑  收藏  举报