基于Kubernetes的云原生DevOps(第二版)
基于Kubernetes的云原生DevOps(第二版)
Justin Domingus, John Arundel 著
马晶慧 译
出版时间:2023年12月
页数:381
“这是一本新手宝典。内容丰富,从技术的角度客观地介绍了Kubernetes,同时展示了具体的使用方法。”
——Adam McPartlan
NYnet的安全经理和高级系统工程师

Kubernetes是云原生世界的操作系统,为运行容器化的工作负载提供了可靠、可伸缩的平台。这本实用教程充分地向你展示了Kubernetes的主要功能,以及Kubernetes的使用方法。
在本书,我们将带领你了解不断发展的Kubernetes生态系统,并针对当前使用软件工具时遇到的日常问题,提供实用的解决方案。你将逐步学习如何在Kubernetes中运行容器化的应用程序,学习如何构建应用程序的开发环境以及持续部署流水线,并探索可用于自己的应用程序的模式。你将学习如何在Kubernetes和开发运维的帮助下,打造精简、快速且高效的开发团队。
● 学习容器和Kubernetes的基本知识,无需任何经验。
● 在托管的云Kubernetes服务或本地环境中运行应用程序。
● 设计自己的云原生服务与基础设施。
● 通过Kubernetes管理资源的使用和容器的生命周期。
● 从成本、性能、弹性、容量和可伸缩性等方面优化集群。
● 学习开发、测试和部署应用程序的最佳工具。
● 应用可观察性与监控方面的最新行业实践。
● 保证生产环境中容器与集群的安全。
  1. 序
  2. 第一版序
  3. 前言
  4. 第1章 云革命
  5. 1.1 云的诞生
  6. 1.1.1 购买时间
  7. 1.1.2 基础设施即服务
  8. 1.2 开发运维拉开序幕
  9. 1.2.1 改善反馈循环
  10. 1.2.2 开发运维的含义
  11. 1.2.3 基础设施即代码
  12. 1.2.4 共同学习
  13. 1.3 容器的到来
  14. 1.3.1 最先进的技术
  15. 1.3.2 箱子带来的启发
  16. 1.3.3 将软件放入容器中
  17. 1.3.4 即插即用的应用程序
  18. 1.4 容器的编排
  19. 1.5 Kubernetes
  20. 1.5.1 从Borg到Kubernetes
  21. 1.5.2 Kubernetes成功的原因
  22. 1.5.3 Kubernetes会消失吗?
  23. 1.5.4 Kubernetes并非万能
  24. 1.6 云原生
  25. 1.7 运维的未来
  26. 1.7.1 分布式开发运维
  27. 1.7.2 有些系统仍然是中心式
  28. 1.7.3 开发人员生产力工程
  29. 1.7.4 你就是未来
  30. 1.8 小结
  31. 第2章 Kubernetes简介
  32. 2.1 运行第一个容器
  33. 2.1.1 安装Docker桌面版
  34. 2.1.2 什么是Docker?
  35. 2.1.3 运行容器镜像
  36. 2.2 演示应用程序
  37. 2.2.1 查看源代码
  38. 2.2.2 Go简介
  39. 2.2.3 演示应用程序的原理
  40. 2.3 建立容器
  41. 2.3.1 了解Dockerfile
  42. 2.3.2 最低限度的容器镜像
  43. 2.3.3 运行Docker image build
  44. 2.3.4 命名镜像
  45. 2.3.5 端口转发
  46. 2.4 容器仓库
  47. 2.4.1 镜像仓库的身份验证
  48. 2.4.2 命名和推送镜像
  49. 2.4.3 运行镜像
  50. 2.5 Kubernetes入门
  51. 2.5.1 运行演示应用
  52. 2.5.2 如果容器无法启动
  53. 2.6 Minikube
  54. 2.7 小结
  55. 第3章 获取Kubernetes
  56. 3.1 集群架构
  57. 3.1.1 控制平面
  58. 3.1.2 节点组件
  59. 3.1.3 高可用性
  60. 3.2 自托管Kubernetes的成本
  61. 3.2.1 超出预期的工作量
  62. 3.2.2 不仅仅是初始设置
  63. 3.2.3 不能完全依赖工具
  64. 3.2.4 Kubernetes the Hard Way
  65. 3.2.5 Kubernetes很难
  66. 3.2.6 管理费用
  67. 3.2.7 从托管服务开始
  68. 3.3 托管Kubernetes服务
  69. 3.3.1 Google Kubernetes Engine(GKE)
  70. 3.3.2 集群自动伸缩
  71. 3.3.3 Autopilot
  72. 3.3.4 亚马逊的Elastic Container Service for Kubernetes(EKS)
  73. 3.3.5 Azure Kubernetes Service(AKS)
  74. 3.3.6 IBM Cloud Kubernetes Service
  75. 3.3.7 DigitalOcean Kubernetes
  76. 3.4 Kubernetes安装程序
  77. 3.4.1 kops
  78. 3.4.2 Kubespray
  79. 3.4.3 kubeadm
  80. 3.4.4 Rancher Kubernetes Engine(RKE)
  81. 3.4.5 Puppet Kubernetes模块
  82. 3.5 买还是构建:我们的建议
  83. 3.5.1 运行更少软件
  84. 3.5.2 尽可能使用托管Kubernetes
  85. 3.5.3 如何应对提供商锁定呢?
  86. 3.5.4 裸金属与内部服务器
  87. 3.5.5 多云Kubernetes集群
  88. 3.5.6 OpenShift
  89. 3.5.7 Anthos
  90. 3.5.8 根据需要使用标准的Kubernetes自托管工具
  91. 3.6 无集群容器服务
  92. 3.6.1 AWS Fargate
  93. 3.6.2 Azure Container Instances(ACI)
  94. 3.6.3 谷歌Cloud Run
  95. 3.7 小结
  96. 第4章 Kubernetes对象
  97. 4.1 部署
  98. 4.1.1 监督与调度
  99. 4.1.2 重启容器
  100. 4.1.3 创建部署
  101. 4.2 Pod
  102. 4.3 副本集
  103. 4.4 维持所需状态
  104. 4.5 Kubernetes调度器
  105. 4.6 YAML格式的资源清单
  106. 4.6.1 资源就是数据
  107. 4.6.2 部署清单
  108. 4.6.3 使用kubectl apply
  109. 4.6.4 服务资源
  110. 4.6.5 使用kubectl查询集群
  111. 4.6.6 资源的高级使用方式
  112. 4.7 Helm:Kubernetes包管理器
  113. 4.7.1 安装Helm
  114. 4.7.2 安装Helm Chart
  115. 4.7.3 Chart、Repository与Release
  116. 4.7.4 查看Helm Release
  117. 4.8 小结
  118. 第5章 资源管理
  119. 5.1 了解资源
  120. 5.1.1 资源单位
  121. 5.1.2 资源请求
  122. 5.1.3 资源约束
  123. 5.1.4 服务质量
  124. 5.2 管理容器的生命周期
  125. 5.2.1 存活探针
  126. 5.2.2 探针延迟及频率
  127. 5.2.3 其他类型的探针
  128. 5.2.4 就绪探针
  129. 5.2.5 启动探针
  130. 5.2.6 gRPC探针
  131. 5.2.7 基于文件的就绪探针
  132. 5.2.8 minReadySeconds
  133. 5.2.9 Pod中断预算
  134. 5.3 命名空间
  135. 5.3.1 命名空间的使用
  136. 5.3.2 应该使用哪些命名空间?
  137. 5.3.3 服务地址
  138. 5.3.4 资源配额
  139. 5.3.5 默认资源请求和约束
  140. 5.4 优化集群的成本
  141. 5.4.1 Kubecost
  142. 5.4.2 优化部署
  143. 5.4.3 优化Pod
  144. 5.4.4 Pod垂直自动伸缩
  145. 5.4.5 优化节点
  146. 5.4.6 优化存储
  147. 5.4.7 清理未使用的资源
  148. 5.4.8 检查备用容量
  149. 5.4.9 使用预留实例
  150. 5.4.10 抢占式(Spot)实例
  151. 5.4.11 保持工作负载平衡
  152. 5.5 小结
  153. 第6章 集群运维
  154. 6.1 集群的规模与伸缩
  155. 6.1.1 容量规划
  156. 6.1.2 节点与实例
  157. 6.1.3 集群伸缩
  158. 6.2 一致性检查
  159. 6.2.1 CNCF认证
  160. 6.2.2 Sonobuoy一致性测试
  161. 6.2.3 Kubernetes审计日志
  162. 6.3 混乱测试
  163. 6.3.1 生产环境是无法复制的
  164. 6.3.2 Chaoskube
  165. 6.3.3 kube-monkey
  166. 6.3.4 PowerfulSeal
  167. 6.4 小结
  168. 第7章 强大的Kubernetes工具
  169. 7.1 掌握kubectl
  170. 7.1.1 Shell别名
  171. 7.1.2 使用缩写标志
  172. 7.1.3 缩写资源类型
  173. 7.1.4 自动补齐kubectl命令
  174. 7.1.5 获取帮助
  175. 7.1.6 获取有关Kubernetes资源的帮助
  176. 7.1.7 显示更详细的输出
  177. 7.1.8 使用JSON数据和jq
  178. 7.1.9 监视对象
  179. 7.1.10 描述对象
  180. 7.2 处理资源
  181. 7.2.1 命令式的kubectl命令
  182. 7.2.2 何时不应该使用命令式的命令
  183. 7.2.3 生成资源清单
  184. 7.2.4 导出资源
  185. 7.2.5 对比资源
  186. 7.3 处理容器
  187. 7.3.1 查看容器的日志
  188. 7.3.2 附加到容器
  189. 7.3.3 利用kubespy监视Kubernetes资源
  190. 7.3.4 转发容器端口
  191. 7.3.5 在容器上执行命令
  192. 7.3.6 用于故障排除的容器
  193. 7.3.7 BusyBox命令
  194. 7.3.8 将BusyBox添加到容器
  195. 7.3.9 在容器上安装程序
  196. 7.4 上下文与命名空间
  197. 7.4.1 kubeconfig文件
  198. 7.4.2 kubectx与kubens
  199. 7.4.3 kube-ps1
  200. 7.5 Kubernetes shell与工具
  201. 7.5.1 kube-shell
  202. 7.5.2 Click
  203. 7.5.3 Kubed-sh
  204. 7.5.4 Stern
  205. 7.6 Kubernetes IDE
  206. 7.6.1 Lens
  207. 7.6.2 VS Code的Kubernetes扩展
  208. 7.7 构建自己的Kubernetes工具
  209. 7.8 小结
  210. 第8章 运行容器
  211. 8.1 容器与Pod
  212. 8.1.1 什么是容器?
  213. 8.1.2 Kubernetes中的容器运行时
  214. 8.1.3 容器中有什么?
  215. 8.1.4 Pod中有什么?
  216. 8.2 容器清单
  217. 8.2.1 镜像标识符
  218. 8.2.2 latest标签
  219. 8.2.3 容器摘要
  220. 8.2.4 基础镜像标签
  221. 8.2.5 端口
  222. 8.2.6 资源请求和约束
  223. 8.2.7 镜像拉取策略
  224. 8.2.8 环境变量
  225. 8.3 容器安全
  226. 8.3.1 以非root用户身份运行容器
  227. 8.3.2 阻止Root容器
  228. 8.3.3 设置只读文件系统
  229. 8.3.4 禁用权限升级
  230. 8.3.5 能力
  231. 8.3.6 Pod安全上下文
  232. 8.3.7 Pod服务账号
  233. 8.4 卷
  234. 8.4.1 emptyDir卷
  235. 8.4.2 持久卷
  236. 8.5 重启策略
  237. 8.6 ImagePullSecret
  238. 8.7 初始化容器
  239. 8.8 小结
  240. 第9章 管理Pod
  241. 9.1 标签
  242. 9.1.1 什么是标签?
  243. 9.1.2 选择器
  244. 9.1.3 高级选择器
  245. 9.1.4 标签的其他用途
  246. 9.1.5 标签与注释
  247. 9.2 节点亲和性
  248. 9.2.1 硬亲和性
  249. 9.2.2 软亲和性
  250. 9.3 Pod的亲和性与反亲和性
  251. 9.3.1 将Pod调度到一起
  252. 9.3.2 分开Pod
  253. 9.3.3 软反亲和性
  254. 9.3.4 何时使用Pod亲和性
  255. 9.4 污点与容忍
  256. 9.5 Pod控制器
  257. 9.5.1 守护进程集
  258. 9.5.2 状态集
  259. 9.5.3 作业
  260. 9.5.4 定时作业
  261. 9.5.5 Pod水平自动伸缩器
  262. 9.5.6 操作器与自定义资源定义(CRD)
  263. 9.6 Ingress资源
  264. 9.6.1 Ingress控制器
  265. 9.6.2 Ingress规则
  266. 9.6.3 通过Ingress终止TLS
  267. 9.7 服务网格
  268. 9.7.1 Istio
  269. 9.7.2 Linkerd
  270. 9.7.3 Consul Connect
  271. 9.7.4 NGINX服务网格
  272. 9.8 小结
  273. 第10章 配置与Secret
  274. 10.1 ConfigMap
  275. 10.1.1 创建ConfigMap
  276. 10.1.2 利用ConfigMap设置环境变量
  277. 10.1.3 利用ConfigMap设置整个环境
  278. 10.1.4 使用环境变量指定命令的参数
  279. 10.1.5 利用ConfigMap创建配置文件
  280. 10.1.6 配置发生变化后更新Pod
  281. 10.2 Kubernetes Secret
  282. 10.2.1 利用Secret设置环境变量
  283. 10.2.2 将Secret写入文件
  284. 10.2.3 读取Secrest
  285. 10.2.4 Secret的访问权
  286. 10.2.5 静态加密
  287. 10.2.6 防止Secret和ConfigMap被修改
  288. 10.3 Secret管理策略
  289. 10.3.1 在版本控制中加密机密
  290. 10.3.2 使用专业的机密管理工具
  291. 10.4 使用Sops加密机密数据
  292. 10.4.1 使用Sops加密文件
  293. 10.4.2 使用KMS后端
  294. 10.5 Sealed Secrets
  295. 10.6 小结
  296. 第11章 安全、备份与集群健康
  297. 11.1 访问控制与权限
  298. 11.1.1 按集群管理访问权限
  299. 11.1.2 基于角色的访问控制(RBAC)
  300. 11.1.3 角色
  301. 11.1.4 将角色绑定到用户
  302. 11.1.5 我需要哪些角色?
  303. 11.1.6 保护集群管理员的权限
  304. 11.1.7 应用程序与部署
  305. 11.1.8 RBAC故障排除
  306. 11.2 集群的安全扫描
  307. 11.2.1 Gatekeeper/OPA
  308. 11.2.2 kube-bench
  309. 11.2.3 Kubescape
  310. 11.3 容器安全扫描
  311. 11.3.1 Clair
  312. 11.3.2 Aqua
  313. 11.3.3 Anchore Engine
  314. 11.3.4 Synk
  315. 11.4 备份
  316. 11.4.1 Kubernetes需要备份吗?
  317. 11.4.2 备份etcd
  318. 11.4.3 备份资源状态
  319. 11.4.4 备份集群状态
  320. 11.4.5 大小灾害
  321. 11.4.6 Velero
  322. 11.5 监视集群状态
  323. 11.5.1 Kubectl
  324. 11.5.2 CPU和内存利用率
  325. 11.5.3 云提供商控制台
  326. 11.5.4 Kubernetes仪表板
  327. 11.5.5 Weave Scope
  328. 11.5.6 kube-ops-view
  329. 11.5.7 node-problem-detector
  330. 11.6 延伸阅读
  331. 11.7 小结
  332. 第12章 部署Kubernetes应用程序
  333. 12.1 使用Helm构建清单
  334. 12.1.1 Helm Chart包含什么?
  335. 12.1.2 Helm模板
  336. 12.1.3 插值变量
  337. 12.1.4 引用模板中的值
  338. 12.1.5 指定依赖项
  339. 12.2 部署Heml Chart
  340. 12.2.1 设置变量
  341. 12.2.2 在Helm Release中指定值
  342. 12.2.3 使用Helm更新应用程序
  343. 12.2.4 回滚到以前的版本
  344. 12.2.5 创建Helm Chart库
  345. 12.2.6 使用Sops管理Helm Chart的机密数据
  346. 12.3 使用Helmfile管理多个Chart
  347. 12.3.1 Helmfile中有什么?
  348. 12.3.2 Chart元数据
  349. 12.3.3 应用Helmfile
  350. 12.4 高级清单管理工具
  351. 12.4.1 kustomize
  352. 12.4.2 Tanka
  353. 12.4.3 Kapitan
  354. 12.4.4 kompose
  355. 12.4.5 Ansible
  356. 12.4.6 kubeval
  357. 12.5 小结
  358. 第13章 开发流程
  359. 13.1 开发工具
  360. 13.1.1 Skaffold
  361. 13.1.2 Telepresence
  362. 13.1.3 Waypoint
  363. 13.1.4 Knative
  364. 13.1.5 OpenFaaS
  365. 13.1.6 Crossplane
  366. 13.2 部署策略
  367. 13.2.1 滚动更新
  368. 13.2.2 重建
  369. 13.2.3 maxSurge和maxUnavailable
  370. 13.2.4 蓝绿部署
  371. 13.2.5 彩虹部署
  372. 13.2.6 金丝雀部署
  373. 13.3 使用Helm处理迁移
  374. 13.3.1 Helm的钩子
  375. 13.3.2 处理失败的钩子
  376. 13.3.3 其他钩子
  377. 13.3.4 钩子链
  378. 13.4 小结
  379. 第14章 Kubernetes的持续部署
  380. 14.1 什么是持续部署?
  381. 14.2 CD工具
  382. 14.3 托管CI/CD工具
  383. 14.3.1 Azure流水线
  384. 14.3.2 谷歌云构建
  385. 14.3.3 Codefresh
  386. 14.3.4 GitHub Actions
  387. 14.3.5 GitLab CI
  388. 14.4 自托管CI/CD工具
  389. 14.4.1 Jenkins
  390. 14.4.2 Drone
  391. 14.4.3 Tekton
  392. 14.4.4 Concourse
  393. 14.4.5 Spinnaker
  394. 14.4.6 Argo
  395. 14.4.7 Keel
  396. 14.5 谷歌云构建的CD流水线
  397. 14.5.1 设置谷歌云和GKE
  398. 14.5.2 分叉demo代码库
  399. 14.5.3 创建 Artifact Registry容器存储库
  400. 14.5.4 配置云构建
  401. 14.5.5 构建测试容器
  402. 14.5.6 运行测试
  403. 14.5.7 构建应用程序容器
  404. 14.5.8 替换变量
  405. 14.5.9 Git SHA标签
  406. 14.5.10 验证Kubernetes清单
  407. 14.5.11 发布镜像
  408. 14.5.12 创建第一个构建触发器
  409. 14.5.13 测试触发器
  410. 14.5.14 利用CI/CD流水线部署
  411. 14.5.15 创建部署触发器
  412. 14.5.16 调整示例流水线
  413. 14.6 GitOps
  414. 14.7 小结
  415. 第15章 可观察性与监控
  416. 15.1 什么是可观察性?
  417. 15.1.1 什么是监控?
  418. 15.1.2 黑盒监控
  419. 15.1.3 “正常”指什么?
  420. 15.1.4 日志
  421. 15.1.5 指标
  422. 15.1.6 跟踪
  423. 15.1.7 可观察性
  424. 15.2 可观察性流水线
  425. 15.3 Kubernetes中的监控
  426. 15.3.1 外部的黑盒检查
  427. 15.3.2 内部健康检查
  428. 15.4 小结
  429. 第16章 Kubernetes的指标
  430. 16.1 什么是指标?
  431. 16.1.1 时间序列数据
  432. 16.1.2 计数器和计量器
  433. 16.1.3 指标可以告诉我们什么?
  434. 16.2 选择指标
  435. 16.2.1 服务:RED模式
  436. 16.2.2 资源:USE模式
  437. 16.2.3 业务指标
  438. 16.2.4 Kubernetes指标
  439. 16.3 分析指标
  440. 16.3.1 简单的平均值有什么问题?
  441. 16.3.2 均值、中位数和离群值
  442. 16.3.3 百分位数
  443. 16.3.4 将百分位数应用于指标数据
  444. 16.3.5 最坏的情况
  445. 16.3.6 比百分位数更好的方式
  446. 16.4 通过仪表板显示指标的图表
  447. 16.4.1 所有服务都使用相同的标准布局
  448. 16.4.2 利用主仪表板构建信息发射源
  449. 16.4.3 在仪表板上显示故障
  450. 16.5 根据指标发出警报
  451. 16.5.1 警报有什么问题?
  452. 16.5.2 值班不应该成为地狱
  453. 16.5.3 紧急、重大且需要付诸行动的警报
  454. 16.5.4 跟踪警报、工作时间外的呼叫
  455. 16.6 指标工具和服务
  456. 16.6.1 Prometheus
  457. 16.6.2 谷歌的 Operations Suite
  458. 16.6.3 AWS Cloudwatch
  459. 16.6.4 Azure Monitor
  460. 16.6.5 Datadog
  461. 16.6.6 New Relic
  462. 16.7 小结
  463. 后记
书名:基于Kubernetes的云原生DevOps(第二版)
译者:马晶慧 译
国内出版社:中国电力出版社
出版时间:2023年12月
页数:381
书号:978-7-5198-8382-9
原版书书名:Cloud Native DevOps with Kubernetes, 2nd Edition
原版书出版商:O'Reilly Media
Justin Domingus
 
Justin Domingus是CareZone.com的开发运维工程师,专门从事Kubernetes和云计算。
 
 
John Arundel
 
John Arundel是一位顾问和作家,拥有30多年计算机行业的从业经验。他为全世界各大公司提供有关Kubernetes、云,以及基础设施的咨询。
 
 
本书封面的动物是一只阿岛军舰鸟(学名:Fregata aquila,英文名:Ascension Frigatebird),这种海鸟分布在南大西洋的阿森松岛和附近的水手长鸟岛上,大约在安哥拉和巴西之间。这种鸟类的繁殖地是阿森松岛(Ascension Island),这个小岛被发现那天是基督教日历上的耶稣升天节(Ascension Day),所以该岛因此而得名。
阿岛军舰鸟翼展超过2米,但体重不足1.25公斤,可以毫不费力地在海洋上滑行,捕捉到游近水面的鱼,尤其是飞鱼。有时也以鱿鱼和小乌龟为食,还会掠夺其他海鸟。阿岛军舰鸟全身黑色且有光泽,略带绿色和紫色。成年雄鸟喉囊呈鲜红色,求偶期会鼓胀。成年雌鸟毛色略暗,下侧有褐色或白色的斑点。和其他军舰鸟一样,阿岛军舰鸟有深叉形尾巴,嘴尖弯曲,尖翅显著。
阿岛军舰鸟觅食于阿森松岛顶峰的裸露岩层。这种鸟类不会筑巢,它们会在地上挖洞,并用羽毛、鹅卵石和骨头做保护。雌鸟每次产卵一枚,然后由双亲喂食至六七个月,直到学会飞翔。由于繁殖成功率低且栖息地有限,因此该物种被列入了易危物种。
19世纪早期,英国人出于军事目的而定居在阿森松岛上。如今,该岛上有美国国家航空航天局(NASA)和欧洲航天局(European Space Agency)的观测基地,英国广播公司(BBC)世界服务站的中继站,同时这里也是GPS四大地面卫星监控站之一。在19世纪和20世纪期间,由于流浪猫捕杀雏鸟,因此阿岛军舰鸟只能在阿森松海岸外的水手长鸟岛上繁殖。2002年,英国皇家鸟类保护协会在岛上发起了一场消灭野猫的运动。几年后,阿岛军舰鸟又开始在阿森松岛上筑巢。
O’Reilly出版的图书,封面上很多动物都濒临灭绝。这些动物都是地球的至宝。如果你想知道如何保护这些动物,请访问animals.oreilly.com。
购买选项
定价:128.00元
书号:978-7-5198-8382-9
出版社:中国电力出版社