描述
开 本: 16开纸 张: 胶版纸包 装: 线装是否套装: 否国际标准书号ISBN: 9787302658221
“基础设施即代码”模式与实践
基础设施即代码(Infrastructure as Code,IaC)是指利用脚本、配置或编程语言创建和维护基础设施的一组实践和流程。通过IaC,我们可以轻松测试各个组件、实现所需的功能并在最小化停机时间的前提下进行扩展。更值得一提的是,由于IaC遵循严谨的开发实践,我们只需要提交几次代码就能轻松实现系统级的变更!
在《“基础设施即代码”模式与实践》一书中,作者深入探讨了如何运用灵活的技术手段构建具备弹性和可扩展性的基础设施。书中内容涵盖了结构化和共享模块的应用、遗留系统的迁移等关键主题,并提供了在软件运行时构建网络、配置负载均衡器以及更新基础设施的实用指南。此外,书中还包含了一系列专家关于团队协作策略的建议,旨在帮助读者有效避免潜在的不稳定性,提升系统安全性,并实现对成本的合理控制。
主要内容
● 优化基础设施,以模块化并隔离依赖关系
● 缓解、排除故障并隔离失败的基础设施变更
● 采用蓝绿部署策略,以最少的停机时间更新基础设施
● 使用模式进行资源置备、配置管理及镜像构建
第Ⅰ部分 起步
第1 章 基础设施即代码简介 3
1.1 什么是基础设施 5
1.2 什么是IaC 7
1.2.1 手动配置基础设施 7
1.2.2 基础设施即代码 8
1.2.3 哪种不是基础设施即代码 10
1.3 基础设施即代码的原则 10
1.3.1 可重建性 10
1.3.2 幂等性 12
1.3.3 可组合性 14
1.3.4 可演进性 15
1.3.5 原则的应用 16
1.4 为什么使用基础设施即代码 17
1.4.1 变更管理 18
1.4.2 时间投资回报 18
1.4.3 知识共享 19
1.4.4 安全 20
1.5 工具 21
1.5.1 本书示例 21
1.5.2 资源置备 23
1.5.3 配置管理 24
1.5.4 镜像构建 25
1.6 本章小结 26
第2 章 编写基础设施代码 27
2.1 表述基础设施变更 29
2.2 理解不可变性 31
2.2.1 计划外手工变更补偿 33
2.2.2 迁移到基础设施即代码 35
2.3 编写整洁的基础设施即代码 41
2.3.1 把沟通上下文记录到版本控制 41
2.3.2 风格检查与格式化 42
2.3.3 为资源命名 43
2.3.4 变量和常量 44
2.3.5 依赖项参数化 45
2.3.6 妥善处理机密信息 49
2.4 本章小结 50
第3 章 基础设施模块的模式 51
3.1 单例模式 52
3.2 组合模式 55
3.3 工厂模式 58
3.4 原型模式 61
3.5 生成器模式 65
3.6 模式的选择 70
3.7 本章小结 73
第4 章 基础设施依赖模式 75
4.1 关系的单向性 76
4.2 依赖注入 77
4.2.1 控制反转 77
4.2.2 依赖倒置 80
4.2.3 应用依赖注入 85
4.3 外观模式 88
4.4 适配器模式 92
4.5 中介者模式 96
4.6 选择正确的模式 100
4.7 本章小结 102
第Ⅱ部分 团队规模化实践
第5 章 模块的存储结构与共享 105
5.1 存储库组织结构 107
5.1.1 单存储库 107
5.1.2 多存储库 110
5.1.3 选择一种存储库结构 114
5.2 版本控制 117
5.3 发布 120
5.4 模块共享 123
5.5 本章小结 125
第6 章 测试 127
6.1 基础设施测试周期 129
6.1.1 静态分析 129
6.1.2 动态分析 130
6.1.3 基础设施测试环境 131
6.2 单元测试 132
6.2.1 测试基础设施配置 133
6.2.2 测试领域特定语言DSL 135
6.2.3 何时编写单元测试 138
6.3 契约测试 140
6.4 集成测试 142
6.4.1 模块测试 142
6.4.2 环境配置测试 145
6.4.3 测试挑战 146
6.5 端到端测试 148
6.6 其他测试 150
6.7 测试的选择 151
6.7.1 模块测试策略 153
6.7.2 配置测试策略 154
6.7.3 识别有用的测试 155
6.8 本章小结 156
第7 章 持续交付与分支模型 159
7.1 交付变更至生产 161
7.1.1 持续集成 161
7.1.2 持续交付 162
7.1.3 持续部署 164
7.1.4 交付方式的选择 165
7.1.5 模块 169
7.2 分支模型 170
7.2.1 基于特性的开发 171
7.2.2 基于主干的开发 176
7.2.3 分支模型的选择 178
7.3 同行评审 182
7.4 GitOps 186
7.5 本章小结 188
第8 章 安全与合规 189
8.1 管理访问与机密 190
8.1.1 最小权限原则 190
8.1.2 保护配置中的机密 193
8.2 标记基础设施 194
8.3 策略即代码 197
8.3.1 策略引擎和标准 198
8.3.2 安全测试 200
8.3.3 策略测试 202
8.3.4 实践和模式 204
8.4 本章小结 208
第Ⅲ部分 管理生产环境复杂性
第9 章 执行变更 211
9.1 变更前实践 212
9.1.1 按工作清单行事 213
9.1.2 增加可靠性 214
9.2 蓝绿部署 219
9.2.1 部署绿色分组的基础设施 221
9.2.2 部署绿色分组基础设施的高层级依赖 222
9.2.3 金丝雀部署 225
9.2.4 开展回归测试 230
9.2.5 删除蓝色版本的基础设施 232
9.2.6 其他注意事项 234
9.3 有状态基础设施 235
9.3.1 蓝绿部署 235
9.3.2 修改交付流水线 236
9.3.3 金丝雀部署 237
9.4 本章小结 239
第10 章 重构 241
10.1 最小化重构的影响 242
10.1.1 通过滚动更新减小影响范围 243
10.1.2 在重构中使用特性开关 244
10.2 拆分单体应用 250
10.2.1 对高级别资源进行重构 251
10.2.2 重构具有依赖项的资源 262
10.2.3 重复重构工作流 265
10.3 本章小结 268
第11 章 修复故障 269
11.1 恢复功能 270
11.1.1 前滚以还原变更 270
11.1.2 新变更的前滚 272
11.2 故障诊断 273
11.2.1 检查漂移 273
11.2.2 检查依赖 275
11.2.3 检查环境差异 277
11.3 解决问题 278
11.3.1 解决漂移 279
11.3.2 解决环境差异 281
11.3.3 推进最初的变更 282
11.4 本章小结 284
第12 章 管理云服务费用 285
12.1 管理成本驱动因素 286
12.1.1 实施测试以控制成本 288
12.1.2 将成本估算自动化 291
12.2 降低云浪费 298
12.2.1 停止未标注和未使用的资源 298
12.2.2 按计划启动和停止资源 299
“基础设施即代码”模式与实践XVI
12.2.3 选择正确的资源类型和大小 301
12.2.4 使用自动缩放 302
12.2.5 为资源添加过期时间标签 304
12.3 成本优化 308
12.3.1 按需构建环境 309
12.3.2 使用多云环境 309
12.3.3 对多云和多区域之间的数据传输进行评估 310
12.3.4 在生产中测试 312
12.4 本章小结 313
第13 章 工具管理 315
13.1 使用开源的工具和模块 316
13.1.1 功能性 317
13.1.2 安全性 318
13.1.3 生命周期 319
13.2 工具升级 321
13.2.1 升级前检查清单 321
13.2.2 向后兼容性 322
13.2.3 升级中的破坏性变更 324
13.3 工具替换 327
13.3.1 新工具支持导入 327
13.3.2 不支持导入能力 329
13.4 事件驱动的IaC 330
13.5 本章小结 332
附录A 示例运行说明 335
附录B 练习题答案 349
我撰写本书的初衷是帮助大家更好地编写基础设施即代码(Infrastructure as Code,IaC),并且能够在不影响关键业务系统的情况下,稳定高效地变更基础设施资源。本书重点介绍了个人、团队或公司在基础设施系统中应用的模式与实践,聚焦能够应用到IaC 中的高级模式与实践,同时也提供示例演示了具体的实现方法。
本书读者对象
本书适用于任何开始使用云基础设施和IaC,并希望在团队或公司范围内对其进行扩展的人(软件开发人员、安全工程师、质量保证工程师或基础设施工程师)。通过本书,你将能编写一些IaC,并手动运行它们以在公有云上创建资源。
你可能正面临着在整个团队或公司中推动IaC 协作的挑战。你需要解决多个团队成员和其他团队在安全性、合规性或功能性方面对基础设施进行更改并请求更新所导致的摩擦问题。有许多的资源都是围绕某个工具来介绍IaC 的,而本书则提供了一些通用的模式与实践方法,适用于将随着时间的推移而持续演进的各种基础设施用例、工具和系统。
本书的组织方式:路线图
本书共分为3 个部分,包含13 章内容。
第Ⅰ部分介绍了IaC,以及如何编写它。
● 第1 章对基础设施即代码进行了定义,并介绍了其好处和原则。本章解释了本书包含的一些用Python 编写的例子,由HashiCorp Terraform 运行,并部署到谷歌云平台(GCP)。另外,还会讨论在你的IaC 旅程中,你会遇到的工具和用例。
● 第2 章深入探讨了不可变性原理以及如何将现有的基础设施资源迁移到IaC。另外,还介绍了编写整洁IaC 的实践。
● 第3 章提供了一些将基础设施资源划分和归类为模块的模式,每种模式的介绍都包含一个代码示例和一个用例。
● 第4 章介绍了如何管理基础设施资源和模块之间的依赖关系,并通过依赖注入和一些常见模式将它们解耦。
第Ⅱ部分描述了如何以团队形式来开展 IaC 的编写与协作。
● 第5 章介绍了在不同的存储库结构中呈现IaC 并在团队中共享它们的一些实践和考量。
● 第6 章提供了基础设施的测试策略,描述了每种类型的测试,以及如何为IaC 编写这些测试。
● 第7 章将持续交付应用于IaC,涵盖了分支模型的高级视图,以及团队如何使用这些模型对基础设施进行变更。
● 第8 章提供了构建安全和合规IaC 的技术,其中包括测试和标记。
第Ⅲ部分介绍了如何在整个公司范围内管理IaC。
● 第9 章将不可变性应用于基础设施变更,引入了一个蓝绿部署的示例。
● 第10 章通过重构大规模的IaC 来提高它们的可维护性,并限制变更的影响范围以减轻任一代码库中出现变更失败造成的影响。
● 第11 章描述了如何还原和回滚IaC 对系统的变更。
● 第12 章讨论了使用IaC 来管理云计算成本的方法,以及IaC 成本估算的示例。
● 第13 章总结了本书中介绍的管理和更新IaC 工具的实践方法。
你会发现整本书中有许多概念是相互关联的,如果你以前没有实践过IaC,推荐你按顺序阅读所有章节。当然,你也可以选择从最能应对你在IaC 实践中所面临的挑战的那部分开始阅读。
在阅读包含特定概念的各章节前,你可能需要先阅读第1 章或附录A,以了解如何阅读和运行示例。附录A 提供了与示例相关的库、工具和平台的更多详细信息,附录B 则提供了所有练习题的答案。
关于代码和Links 文件下载
GitHub 上提供了本书完整的代码清单,读者可通过链接[1]下载,也可扫描本书封底的二维码下载。由于基础设施的配置较冗长,为了清晰起见,书中的一些代码清单并没有包含整个基础设施的定义。第2~12 章中所包含的代码清单,主要作为其概念的示例。
现有的代码清单使用Python 3.9、HashiCorp Terraform 1.0 和Google CloudPlatform 的组合。附录中包含了有关如何运行示例及其工具和库的更多信息,我会在GitHub 上针对这些工具的小版本来更新源代码。
本书包含了许多源代码的例子,既有带编号的代码清单,也有普通的文本行。
在这两种情况下,源代码都以固定宽度的字体进行格式化,方便阅读时区分。有时,代码也会用粗体来高亮显示不同于前面章节的内容,例如当某一个新的功能添加到已存在的代码行时。
在大多数情况下,原始的源代码已被重新格式化;添加了换行符和重做了缩进以适应书中可用的页面空间。在极少数情况下,即使这样也不够,所以代码清单中会包含行连续标记(?)。此外,当代码在正文中做了描述时,源代码中的注释通常会从代码清单中删除。那些附带了注释的代码清单,主要为了突出重要的概念。
在此要说明的是,读者在阅读本书时会看到一些有关链接的编号,形式是数字编码加方括号,例如,[1]表示读者可扫描封底二维码下载Links 文件,在其中可找到对应章节中的[1]所指向的链接。
关于云提供商
我在决定使用哪家云提供商作为示例时遇到了一个挑战。虽然亚马逊网络服务(Amazon Web Services,AWS)或微软Azure 可能在本书出版时更受欢迎,但使用它们需要创建许多资源。例如,在使用它们的网络服务之前,需要创建网络、子网、路由表、网关和安全组。最终我决定使用谷歌云平台(Google Cloud Platform,GCP)作为主要的云提供商,以便简化需要创建的资源量。
尽管我在示例中使用了GCP,但概念、流程和指导方针是通用的,可以用于其他云提供商。对于喜欢使用AWS 或Azure 的读者来说,每个示例都包含了适用于这两个平台的等效信息。此外,也在代码库中提供了一些示例的等效代码。
第1 章中详述了我选择使用GCP 的众多原因,以及如何将这些示例应用于AWS 和Azure。在附录A 中,给出了在GCP 上设置和运行示例的说明,以及对AWS 和Azure 用户的提示。
其他在线资源
请参考你的特定IaC 工具或基础设施提供商的在线资源,这些资源可能包括在其工具中实现相应实践与模式的示例。
评论
还没有评论。