书籍详情
基于Kubernetes的云原生DevOps(第二版)
作者:[美]贾斯汀 多明格斯(Justin Domingus),[英]约翰 阿伦德尔(John Arundel)
出版社:中国电力出版社
出版时间:2023-12-01
ISBN:9787519883829
定价:¥128.00
购买这本书可以去
内容简介
在本书,我们将带领你了解不断发展的Kubernetes生态系统,并针对当前使用软件工具时遇到的日常问题,提供实用的解决方案。你将逐步学习如何在Kubernetes中运行容器化的应用程序,学习如何构建应用程序的开发环境以及持续部署流水线,并探索可用于自己的应用程序的模式。你将学习如何在Kubernetes和开发运维的帮助下,打造精简、快速且高效的开发团队。本书的主要内容有:学习容器和Kubernetes的基本知识,无需任何经验。在托管的云Kubernetes服务或本地环境中运行应用程序。设计自己的云原生服务与基础设施。通过Kubernetes管理资源的使用和容器的生命周期。从成本、性能、弹性、容量和可伸缩性等方面优化集群。学习开发、测试和部署应用程序的最Z佳工具。应用可观察性与监控方面的最Z新行业实践。保证生产环境中容器与集群的安全。
作者简介
Justin Domingus是一名高级IT与开发运维工程师,专门研究Kubernetes与云操作。他曾与许多使用Kubernetes的软件团队合作,其中既包含小型创业公司,也不乏大型企业。John Arundel是一名Go讲师、顾问和导师,拥有三十多年的计算机行业经验。曾出版过多本技术书籍,并为全世界多家公司提供有关Kubernetes、Puppet、可扩展性、可靠性,以及性能方面的咨询服务。
目录
目录
序 1
第一版序 .3
前言 5
第1 章 云革命 11
1.1 云的诞生12
1.1.1 购买时间 .13
1.1.2 基础设施即服务 13
1.2 开发运维拉开序幕 14
1.2.1 改善反馈循环 14
1.2.2 开发运维的含义 15
1.2.3 基础设施即代码 16
1.2.4 共同学习 .17
1.3 容器的到来 17
1.3.1 最先进的技术 17
1.3.2 箱子带来的启发 18
1.3.3 将软件放入容器中 .18
1.3.4 即插即用的应用程序.20
1.4 容器的编排 21
1.5 Kubernetes 21
1.5.1 从Borg 到Kubernetes 22
1.5.2 Kubernetes 成功的原因 22
1.5.3 Kubernetes 会消失吗? 24
1.5.4 Kubernetes 并非万能 .25
1.6 云原生 26
1.7 运维的未来 29
1.7.1 分布式开发运维 29
1.7.2 有些系统仍然是中心式 30
1.7.3 开发人员生产力工程.30
1.7.4 你就是未来 31
1.8 小结 .31
第2 章 Kubernetes 简介 33
2.1 运行第一个容器 33
2.1.1 安装Docker 桌面版 34
2.1.2 什么是Docker ? 35
2.1.3 运行容器镜像 35
2.2 演示应用程序 .36
2.2.1 查看源代码 36
2.2.2 Go 简介 37
2.2.3 演示应用程序的原理.38
2.3 建立容器38
2.3.1 了解Dockerfile 39
2.3.2 最低限度的容器镜像.39
2.3.3 运行Docker image build .40
2.3.4 命名镜像 .40
2.3.5 端口转发 .41
2.4 容器仓库42
2.4.1 镜像仓库的身份验证.42
2.4.2 命名和推送镜像 43
2.4.3 运行镜像 .43
2.5 Kubernetes 入门 .44
2.5.1 运行演示应用 44
2.5.2 如果容器无法启动 .45
2.6 Minikube 46
2.7 小结 .46
第3 章 获取Kubernetes 49
3.1 集群架构50
3.1.1 控制平面 .50
3.1.2 节点组件 .51
3.1.3 高可用性 .52
3.2 自托管Kubernetes 的成本 53
3.2.1 超出预期的工作量 .54
3.2.2 不仅仅是初始设置 .55
3.2.3 不能完全依赖工具 .55
3.2.4 Kubernetes the Hard Way 56
3.2.5 Kubernetes 很难 56
3.2.6 管理费用 .56
3.2.7 从托管服务开始 57
3.3 托管Kubernetes 服务 .58
3.3.1 Google Kubernetes Engine(GKE) .58
3.3.2 集群自动伸缩 58
3.3.3 Autopilot 58
3.3.4 亚马逊的Elastic Container Service for Kubernetes(EKS) 59
3.3.5 Azure Kubernetes Service(AKS) 60
3.3.6 IBM Cloud Kubernetes Service .60
3.3.7 DigitalOcean Kubernetes .60
3.4 Kubernetes 安装程序 60
3.4.1 kops 61
3.4.2 Kubespray 61
3.4.3 kubeadm 61
3.4.4 Rancher Kubernetes Engine(RKE) 62
3.4.5 Puppet Kubernetes 模块 62
3.5 买还是构建:我们的建议 62
3.5.1 运行更少软件 62
3.5.2 尽可能使用托管Kubernetes 63
3.5.3 如何应对提供商锁定呢? 63
3.5.4 裸金属与内部服务器.64
3.5.5 多云Kubernetes 集群 65
3.5.6 OpenShift 66
3.5.7 Anthos 66
3.5.8 根据需要使用标准的Kubernetes 自托管工具 66
3.6 无集群容器服务 67
3.6.1 AWS Fargate 67
3.6.2 Azure Container Instances(ACI) 67
3.6.3 谷歌Cloud Run 68
3.7 小结 68
第4 章 Kubernetes 对象 71
4.1 部署 .71
4.1.1 监督与调度 72
4.1.2 重启容器 .72
4.1.3 创建部署 .73
4.2 Pod 74
4.3 副本集 75
4.4 维持所需状态 .76
4.5 Kubernetes 调度器 77
4.6 YAML 格式的资源清单 .78
4.6.1 资源就是数据 79
4.6.2 部署清单 .79
4.6.3 使用kubectl apply 80
4.6.4 服务资源 .81
4.6.5 使用kubectl 查询集群84
4.6.6 资源的高级使用方式.85
4.7 Helm:Kubernetes 包管理器 85
4.7.1 安装Helm 86
4.7.2 安装Helm Chart 86
4.7.3 Chart、Repository 与Release 87
4.7.4 查看Helm Release .88
4.8 小结 .89
第5 章 资源管理 91
5.1 了解资源91
5.1.1 资源单位 .92
5.1.2 资源请求 .92
5.1.3 资源约束 .93
5.1.4 服务质量 .94
5.2 管理容器的生命周期 95
5.2.1 存活探针 .95
5.2.2 探针延迟及频率 96
5.2.3 其他类型的探针 96
5.2.4 就绪探针 .97
5.2.5 启动探针 .98
5.2.6 gRPC 探针 99
5.2.7 基于文件的就绪探针.99
5.2.8 minReadySeconds .100
5.2.9 Pod 中断预算 . 100
5.3 命名空间. 102
5.3.1 命名空间的使用 103
5.3.2 应该使用哪些命名空间? 103
5.3.3 服务地址 104
5.3.4 资源配额 105
5.3.5 默认资源请求和约束 107
5.4 优化集群的成本 . 108
5.4.1 Kubecost 108
5.4.2 优化部署 108
5.4.3 优化Pod 109
5.4.4 Pod 垂直自动伸缩 110
5.4.5 优化节点 110
5.4.6 优化存储 112
5.4.7 清理未使用的资源 113
5.4.8 检查备用容量 . 115
5.4.9 使用预留实例 . 116
5.4.10 抢占式(Spot)实例 116
5.4.11 保持工作负载平衡 119
5.5 小结 121
第6 章 集群运维 . 123
6.1 集群的规模与伸缩 . 123
6.1.1 容量规划 124
6.1.2 节点与实例 . 127
6.1.3 集群伸缩 129
6.2 一致性检查 131
6.2.1 CNCF 认证 132
6.2.2 Sonobuoy 一致性测试 134
6.2.3 Kubernetes 审计日志 135
6.3 混乱测试. 135
6.3.1 生产环境是无法复制的 . 136
6.3.2 Chaoskube 137
6.3.3 kube-monkey 137
6.3.4 PowerfulSeal 138
6.4 小结 138
第7 章 强大的Kubernetes 工具 141
7.1 掌握kubectl 141
7.1.1 Shell 别名 .141
7.1.2 使用缩写标志 . 142
7.1.3 缩写资源类型 . 143
7.1.4 自动补齐kubectl 命令 143
7.1.5 获取帮助 144
7.1.6 获取有关Kubernetes 资源的帮助 144
7.1.7 显示更详细的输出 145
7.1.8 使用JSON 数据和jq 145
7.1.9 监视对象 147
7.1.10 描述对象 147
7.2 处理资源. 147
7.2.1 命令式的kubectl 命令 147
7.2.2 何时不应该使用命令式的命令 148
7.2.3 生成资源清单 . 149
7.2.4 导出资源 150
7.2.5 对比资源 150
7.3 处理容器. 151
7.3.1 查看容器的日志 151
7.3.2 附加到容器 . 153
7.3.3 利用kubespy 监视Kubernetes 资源 153
7.3.4 转发容器端口 . 153
7.3.5 在容器上执行命令 154
7.3.6 用于故障排除的容器 155
7.3.7 BusyBox 命令. 156
7.3.8 将BusyBox 添加到容器 157
7.3.9 在容器上安装程序 158
7.4 上下文与命名空间 . 159
7.4.1 kubeconfig 文件 160
7.4.2 kubectx 与kubens. 160
7.4.3 kube-ps1 162
7.5 Kubernetes shell 与工具 162
7.5.1 kube-shell 162
7.5.2 Click 162
7.5.3 Kubed-sh 163
7.5.4 Stern 163
7.6 Kubernetes IDE 164
7.6.1 Lens . 164
7.6.2 VS Code 的Kubernetes 扩展 164
7.7 构建自己的Kubernetes 工具 165
7.8 小结 166
第8 章 运行容器 . 169
8.1 容器与Pod 169
8.1.1 什么是容器? . 170
8.1.2 Kubernetes 中的容器运行时 171
8.1.3 容器中有什么? 172
8.1.4 Pod 中有什么? . 172
8.2 容器清单. 173
8.2.1 镜像标识符 . 174
8.2.2 latest 标签 175
8.2.3 容器摘要 176
8.2.4 基础镜像标签 . 176
8.2.5 端口 . 177
8.2.6 资源请求和约束 177
8.2.7 镜像拉取策略 . 178
8.2.8 环境变量 178
8.3 容器安全. 179
8.3.1 以非root 用户身份运行容器 180
8.3.2 阻止Root 容器 181
8.3.3 设置只读文件系统 181
8.3.4 禁用权限升级 . 182
8.3.5 能力 . 182
8.3.6 Pod 安全上下文 . 184
8.3.7 Pod 服务账号 . 184
8.4 卷 185
8.4.1 emptyDir 卷 .185
8.4.2 持久卷 187
8.5 重启策略. 188
8.6 ImagePullSecret 188
8.7 初始化容器 189
8.8 小结 189
第9 章 管理Pod 191
9.1 标签 191
9.1.1 什么是标签? . 191
9.1.2 选择器 192
9.1.3 高级选择器 . 193
9.1.4 标签的其他用途 194
9.1.5 标签与注释 . 195
9.2 节点亲和性 196
9.2.1 硬亲和性 197
9.2.2 软亲和性 197
9.3 Pod 的亲和性与反亲和性 198
9.3.1 将Pod 调度到一起 199
9.3.2 分开Pod 200
9.3.3 软反亲和性 . 200
9.3.4 何时使用Pod 亲和性 . 201
9.4 污点与容忍 201
9.5 Pod 控制器 203
9.5.1 守护进程集 . 204
9.5.2 状态集 205
9.5.3 作业 . 206
9.5.4 定时作业 208
9.5.5 Pod 水平自动伸缩器 209
9.5.6 操作器与自定义资源定义(CRD) 211
9.6 Ingress 资源 212
9.6.1 Ingress 控制器 213
9.6.2 Ingress 规则 . 215
9.6.3 通过Ingress 终止TLS 216
9.7 服务网格. 217
9.7.1 Istio . 217
9.7.2 Linkerd 217
9.7.3 Consul Connect .217
9.7.4 NGINX 服务网格 .218
9.8 小结 218
第10 章 配置与Secret 221
10.1 ConfigMap 221
10.1.1 创建ConfigMap . 222
10.1.2 利用ConfigMap 设置环境变量 223
10.1.3 利用ConfigMap 设置整个环境 226
10.1.4 使用环境变量指定命令的参数 227
10.1.5 利用ConfigMap 创建配置文件 228
10.1.6 配置发生变化后更新Pod 230
10.2 Kubernetes Secret 231
10.2.1 利用Secret 设置环境变量 .231
10.2.2 将Secret 写入文件 232
10.2.3 读取Secrest 233
10.2.4 Secret 的访问权 235
10.2.5 静态加密 235
10.2.6 防止Secret 和ConfigMap 被修改 . 235
10.3 Secret 管理策略 236
10.3.1 在版本控制中加密机密 236
10.3.2 使用专业的机密管理工具 . 237
10.4 使用Sops 加密机密数据 . 238
10.4.1 使用Sops 加密文件 239
10.4.2 使用KMS 后端 241
10.5 Sealed Secrets 241
10.6 小结 242
第11 章 安全、备份与集群健康 243
11.1 访问控制与权限 243
11.1.1 按集群管理访问权限 243
11.1.2 基于角色的访问控制(RBAC) 244
11.1.3 角色 245
11.1.4 将角色绑定到用户 246
11.1.5 我需要哪些角色? 247
11.1.6 保护集群管理员的权限 247
11.1.7 应用程序与部署 .248
11.1.8 RBAC 故障排除 .248
11.2 集群的安全扫描 249
11.2.1 Gatekeeper/OPA 250
11.2.2 kube-bench 250
11.2.3 Kubescape 251
11.3 容器安全扫描 251
11.3.1 Clair 252
11.3.2 Aqua . 252
11.3.3 Anchore Engine 253
11.3.4 Synk .253
11.4 备份 254
11.4.1 Kubernetes 需要备份吗? 255
11.4.2 备份etcd 255
11.4.3 备份资源状态 256
11.4.4 备份集群状态 256
11.4.5 大小灾害 257
11.4.6 Velero 257
11.5 监视集群状态 261
11.5.1 Kubectl 261
11.5.2 CPU 和内存利用率 263
11.5.3 云提供商控制台 .264
11.5.4 Kubernetes 仪表板 . 264
11.5.5 Weave Scope .265
11.5.6 kube-ops-view .266
11.5.7 node-problem-detector .266
11.6 延伸阅读 266
11.7 小结 266
第12 章 部署Kubernetes 应用程序 269
12.1 使用Helm 构建清单 269
12.1.1 Helm Chart 包含什么? 270
12.1.2 Helm 模板 .271
12.1.3 插值变量 272
12.1.4 引用模板中的值 . 274
12.1.5 指定依赖项 274
12.2 部署Heml Chart 275
12.2.1 设置变量 275
12.2.2 在Helm Release 中指定值 276
12.2.3 使用Helm 更新应用程序 277
12.2.4 回滚到以前的版本 278
12.2.5 创建Helm Chart 库 278
12.2.6 使用Sops 管理Helm Chart 的机密数据 .279
12.3 使用Helmfile 管理多个Chart 281
12.3.1 Helmfile 中有什么? 282
12.3.2 Chart 元数据. 283
12.3.3 应用Helmfile 284
12.4 高级清单管理工具 285
12.4.1 kustomize 285
12.4.2 Tanka 287
12.4.3 Kapitan 288
12.4.4 kompose . 288
12.4.5 Ansible 289
12.4.6 kubeval 289
12.5 小结 290
第13 章 开发流程 293
13.1 开发工具 293
13.1.1 Skaffold 294
13.1.2 Telepresence .296
13.1.3 Waypoint 296
13.1.4 Knative 297
13.1.5 OpenFaaS 297
13.1.6 Crossplane . 297
13.2 部署策略 299
13.2.1 滚动更新 300
13.2.2 重建 300
13.2.3 maxSurge 和maxUnavailable 301
13.2.4 蓝绿部署 302
13.2.5 彩虹部署 303
13.2.6 金丝雀部署 303
13.3 使用Helm 处理迁移 304
13.3.1 Helm 的钩子 .304
13.3.2 处理失败的钩子 . 305
13.3.3 其他钩子 305
13.3.4 钩子链 . 306
13.4 小结 307
第14 章 Kubernetes 的持续部署 . 309
14.1 什么是持续部署? 309
14.2 CD 工具 310
14.3 托管CI/CD 工具 311
14.3.1 Azure 流水线 311
14.3.2 谷歌云构建 311
14.3.3 Codefresh 311
14.3.4 GitHub Actions 312
14.3.5 GitLab CI 312
14.4 自托管CI/CD 工具 . 312
14.4.1 Jenkins . 312
14.4.2 Drone 312
14.4.3 Tekton 313
14.4.4 Concourse 313
14.4.5 Spinnaker 313
14.4.6 Argo . 313
14.4.7 Keel 314
14.5 谷歌云构建的CD 流水线 314
14.5.1 设置谷歌云和GKE 314
14.5.2 分叉demo 代码库 .315
14.5.3 创建 Artifact Registry 容器存储库 315
14.5.4 配置云构建 316
14.5.5 构建测试容器 316
14.5.6 运行测试 317
14.5.7 构建应用程序容器 318
14.5.8 替换变量 318
14.5.9 Git SHA 标签 318
14.5.10 验证Kubernetes 清单 319
14.5.11 发布镜像 .319
14.5.12 创建第一个构建触发器 319
14.5.13 测试触发器 . 320
14.5.14 利用CI/CD 流水线部署 321
14.5.15 创建部署触发器 323
14.5.16 调整示例流水线 324
14.6 GitOps 324
14.7 小结 328
第15 章 可观察性与监控 . 329
15.1 什么是可观察性? 329
15.1.1 什么是监控? 329
15.1.2 黑盒监控 330
15.1.3 “正常”指什么? 331
15.1.4 日志 333
15.1.5 指标 335
15.1.6 跟踪 336
15.1.7 可观察性 337
15.2 可观察性流水线 339
15.3 Kubernetes 中的监控 .340
15.3.1 外部的黑盒检查 . 340
15.3.2 内部健康检查 342
15.4 小结 344
第16 章 Kubernetes 的指标 347
16.1 什么是指标? 347
16.1.1 时间序列数据 348
16.1.2 计数器和计量器 . 348
16.1.3 指标可以告诉我们什么? . 349
16.2 选择指标 349
16.2.1 服务:RED 模式 350
16.2.2 资源:USE 模式 351
16.2.3 业务指标 352
16.2.4 Kubernetes 指标 .353
16.3 分析指标 357
16.3.1 简单的平均值有什么问题? 358
16.3.2 均值、中位数和离群值 358
16.3.3 百分位数 359
16.3.4 将百分位数应用于指标数据 360
16.3.5 最坏的情况 361
16.3.6 比百分位数更好的方式 362
16.4 通过仪表板显示指标的图表 363
16.4.1 所有服务都使用相同的标准布局 363
16.4.2 利用主仪表板构建信息发射源 364
16.4.3 在仪表板上显示故障 365
16.5 根据指标发出警报 366
16.5.1 警报有什么问题? 367
16.5.2 值班不应该成为地狱 368
16.5.3 紧急、重大且需要付诸行动的警报 . 368
16.5.4 跟踪警报、工作时间外的呼叫 369
16.6 指标工具和服务 370
16.6.1 Prometheus 370
16.6.2 谷歌的 Operations Suite .373
16.6.3 AWS Cloudwatch 373
16.6.4 Azure Monitor .374
16.6.5 Datadog 374
16.6.6 New Relic 375
16.7 小结 375
后记 . 379
序 1
第一版序 .3
前言 5
第1 章 云革命 11
1.1 云的诞生12
1.1.1 购买时间 .13
1.1.2 基础设施即服务 13
1.2 开发运维拉开序幕 14
1.2.1 改善反馈循环 14
1.2.2 开发运维的含义 15
1.2.3 基础设施即代码 16
1.2.4 共同学习 .17
1.3 容器的到来 17
1.3.1 最先进的技术 17
1.3.2 箱子带来的启发 18
1.3.3 将软件放入容器中 .18
1.3.4 即插即用的应用程序.20
1.4 容器的编排 21
1.5 Kubernetes 21
1.5.1 从Borg 到Kubernetes 22
1.5.2 Kubernetes 成功的原因 22
1.5.3 Kubernetes 会消失吗? 24
1.5.4 Kubernetes 并非万能 .25
1.6 云原生 26
1.7 运维的未来 29
1.7.1 分布式开发运维 29
1.7.2 有些系统仍然是中心式 30
1.7.3 开发人员生产力工程.30
1.7.4 你就是未来 31
1.8 小结 .31
第2 章 Kubernetes 简介 33
2.1 运行第一个容器 33
2.1.1 安装Docker 桌面版 34
2.1.2 什么是Docker ? 35
2.1.3 运行容器镜像 35
2.2 演示应用程序 .36
2.2.1 查看源代码 36
2.2.2 Go 简介 37
2.2.3 演示应用程序的原理.38
2.3 建立容器38
2.3.1 了解Dockerfile 39
2.3.2 最低限度的容器镜像.39
2.3.3 运行Docker image build .40
2.3.4 命名镜像 .40
2.3.5 端口转发 .41
2.4 容器仓库42
2.4.1 镜像仓库的身份验证.42
2.4.2 命名和推送镜像 43
2.4.3 运行镜像 .43
2.5 Kubernetes 入门 .44
2.5.1 运行演示应用 44
2.5.2 如果容器无法启动 .45
2.6 Minikube 46
2.7 小结 .46
第3 章 获取Kubernetes 49
3.1 集群架构50
3.1.1 控制平面 .50
3.1.2 节点组件 .51
3.1.3 高可用性 .52
3.2 自托管Kubernetes 的成本 53
3.2.1 超出预期的工作量 .54
3.2.2 不仅仅是初始设置 .55
3.2.3 不能完全依赖工具 .55
3.2.4 Kubernetes the Hard Way 56
3.2.5 Kubernetes 很难 56
3.2.6 管理费用 .56
3.2.7 从托管服务开始 57
3.3 托管Kubernetes 服务 .58
3.3.1 Google Kubernetes Engine(GKE) .58
3.3.2 集群自动伸缩 58
3.3.3 Autopilot 58
3.3.4 亚马逊的Elastic Container Service for Kubernetes(EKS) 59
3.3.5 Azure Kubernetes Service(AKS) 60
3.3.6 IBM Cloud Kubernetes Service .60
3.3.7 DigitalOcean Kubernetes .60
3.4 Kubernetes 安装程序 60
3.4.1 kops 61
3.4.2 Kubespray 61
3.4.3 kubeadm 61
3.4.4 Rancher Kubernetes Engine(RKE) 62
3.4.5 Puppet Kubernetes 模块 62
3.5 买还是构建:我们的建议 62
3.5.1 运行更少软件 62
3.5.2 尽可能使用托管Kubernetes 63
3.5.3 如何应对提供商锁定呢? 63
3.5.4 裸金属与内部服务器.64
3.5.5 多云Kubernetes 集群 65
3.5.6 OpenShift 66
3.5.7 Anthos 66
3.5.8 根据需要使用标准的Kubernetes 自托管工具 66
3.6 无集群容器服务 67
3.6.1 AWS Fargate 67
3.6.2 Azure Container Instances(ACI) 67
3.6.3 谷歌Cloud Run 68
3.7 小结 68
第4 章 Kubernetes 对象 71
4.1 部署 .71
4.1.1 监督与调度 72
4.1.2 重启容器 .72
4.1.3 创建部署 .73
4.2 Pod 74
4.3 副本集 75
4.4 维持所需状态 .76
4.5 Kubernetes 调度器 77
4.6 YAML 格式的资源清单 .78
4.6.1 资源就是数据 79
4.6.2 部署清单 .79
4.6.3 使用kubectl apply 80
4.6.4 服务资源 .81
4.6.5 使用kubectl 查询集群84
4.6.6 资源的高级使用方式.85
4.7 Helm:Kubernetes 包管理器 85
4.7.1 安装Helm 86
4.7.2 安装Helm Chart 86
4.7.3 Chart、Repository 与Release 87
4.7.4 查看Helm Release .88
4.8 小结 .89
第5 章 资源管理 91
5.1 了解资源91
5.1.1 资源单位 .92
5.1.2 资源请求 .92
5.1.3 资源约束 .93
5.1.4 服务质量 .94
5.2 管理容器的生命周期 95
5.2.1 存活探针 .95
5.2.2 探针延迟及频率 96
5.2.3 其他类型的探针 96
5.2.4 就绪探针 .97
5.2.5 启动探针 .98
5.2.6 gRPC 探针 99
5.2.7 基于文件的就绪探针.99
5.2.8 minReadySeconds .100
5.2.9 Pod 中断预算 . 100
5.3 命名空间. 102
5.3.1 命名空间的使用 103
5.3.2 应该使用哪些命名空间? 103
5.3.3 服务地址 104
5.3.4 资源配额 105
5.3.5 默认资源请求和约束 107
5.4 优化集群的成本 . 108
5.4.1 Kubecost 108
5.4.2 优化部署 108
5.4.3 优化Pod 109
5.4.4 Pod 垂直自动伸缩 110
5.4.5 优化节点 110
5.4.6 优化存储 112
5.4.7 清理未使用的资源 113
5.4.8 检查备用容量 . 115
5.4.9 使用预留实例 . 116
5.4.10 抢占式(Spot)实例 116
5.4.11 保持工作负载平衡 119
5.5 小结 121
第6 章 集群运维 . 123
6.1 集群的规模与伸缩 . 123
6.1.1 容量规划 124
6.1.2 节点与实例 . 127
6.1.3 集群伸缩 129
6.2 一致性检查 131
6.2.1 CNCF 认证 132
6.2.2 Sonobuoy 一致性测试 134
6.2.3 Kubernetes 审计日志 135
6.3 混乱测试. 135
6.3.1 生产环境是无法复制的 . 136
6.3.2 Chaoskube 137
6.3.3 kube-monkey 137
6.3.4 PowerfulSeal 138
6.4 小结 138
第7 章 强大的Kubernetes 工具 141
7.1 掌握kubectl 141
7.1.1 Shell 别名 .141
7.1.2 使用缩写标志 . 142
7.1.3 缩写资源类型 . 143
7.1.4 自动补齐kubectl 命令 143
7.1.5 获取帮助 144
7.1.6 获取有关Kubernetes 资源的帮助 144
7.1.7 显示更详细的输出 145
7.1.8 使用JSON 数据和jq 145
7.1.9 监视对象 147
7.1.10 描述对象 147
7.2 处理资源. 147
7.2.1 命令式的kubectl 命令 147
7.2.2 何时不应该使用命令式的命令 148
7.2.3 生成资源清单 . 149
7.2.4 导出资源 150
7.2.5 对比资源 150
7.3 处理容器. 151
7.3.1 查看容器的日志 151
7.3.2 附加到容器 . 153
7.3.3 利用kubespy 监视Kubernetes 资源 153
7.3.4 转发容器端口 . 153
7.3.5 在容器上执行命令 154
7.3.6 用于故障排除的容器 155
7.3.7 BusyBox 命令. 156
7.3.8 将BusyBox 添加到容器 157
7.3.9 在容器上安装程序 158
7.4 上下文与命名空间 . 159
7.4.1 kubeconfig 文件 160
7.4.2 kubectx 与kubens. 160
7.4.3 kube-ps1 162
7.5 Kubernetes shell 与工具 162
7.5.1 kube-shell 162
7.5.2 Click 162
7.5.3 Kubed-sh 163
7.5.4 Stern 163
7.6 Kubernetes IDE 164
7.6.1 Lens . 164
7.6.2 VS Code 的Kubernetes 扩展 164
7.7 构建自己的Kubernetes 工具 165
7.8 小结 166
第8 章 运行容器 . 169
8.1 容器与Pod 169
8.1.1 什么是容器? . 170
8.1.2 Kubernetes 中的容器运行时 171
8.1.3 容器中有什么? 172
8.1.4 Pod 中有什么? . 172
8.2 容器清单. 173
8.2.1 镜像标识符 . 174
8.2.2 latest 标签 175
8.2.3 容器摘要 176
8.2.4 基础镜像标签 . 176
8.2.5 端口 . 177
8.2.6 资源请求和约束 177
8.2.7 镜像拉取策略 . 178
8.2.8 环境变量 178
8.3 容器安全. 179
8.3.1 以非root 用户身份运行容器 180
8.3.2 阻止Root 容器 181
8.3.3 设置只读文件系统 181
8.3.4 禁用权限升级 . 182
8.3.5 能力 . 182
8.3.6 Pod 安全上下文 . 184
8.3.7 Pod 服务账号 . 184
8.4 卷 185
8.4.1 emptyDir 卷 .185
8.4.2 持久卷 187
8.5 重启策略. 188
8.6 ImagePullSecret 188
8.7 初始化容器 189
8.8 小结 189
第9 章 管理Pod 191
9.1 标签 191
9.1.1 什么是标签? . 191
9.1.2 选择器 192
9.1.3 高级选择器 . 193
9.1.4 标签的其他用途 194
9.1.5 标签与注释 . 195
9.2 节点亲和性 196
9.2.1 硬亲和性 197
9.2.2 软亲和性 197
9.3 Pod 的亲和性与反亲和性 198
9.3.1 将Pod 调度到一起 199
9.3.2 分开Pod 200
9.3.3 软反亲和性 . 200
9.3.4 何时使用Pod 亲和性 . 201
9.4 污点与容忍 201
9.5 Pod 控制器 203
9.5.1 守护进程集 . 204
9.5.2 状态集 205
9.5.3 作业 . 206
9.5.4 定时作业 208
9.5.5 Pod 水平自动伸缩器 209
9.5.6 操作器与自定义资源定义(CRD) 211
9.6 Ingress 资源 212
9.6.1 Ingress 控制器 213
9.6.2 Ingress 规则 . 215
9.6.3 通过Ingress 终止TLS 216
9.7 服务网格. 217
9.7.1 Istio . 217
9.7.2 Linkerd 217
9.7.3 Consul Connect .217
9.7.4 NGINX 服务网格 .218
9.8 小结 218
第10 章 配置与Secret 221
10.1 ConfigMap 221
10.1.1 创建ConfigMap . 222
10.1.2 利用ConfigMap 设置环境变量 223
10.1.3 利用ConfigMap 设置整个环境 226
10.1.4 使用环境变量指定命令的参数 227
10.1.5 利用ConfigMap 创建配置文件 228
10.1.6 配置发生变化后更新Pod 230
10.2 Kubernetes Secret 231
10.2.1 利用Secret 设置环境变量 .231
10.2.2 将Secret 写入文件 232
10.2.3 读取Secrest 233
10.2.4 Secret 的访问权 235
10.2.5 静态加密 235
10.2.6 防止Secret 和ConfigMap 被修改 . 235
10.3 Secret 管理策略 236
10.3.1 在版本控制中加密机密 236
10.3.2 使用专业的机密管理工具 . 237
10.4 使用Sops 加密机密数据 . 238
10.4.1 使用Sops 加密文件 239
10.4.2 使用KMS 后端 241
10.5 Sealed Secrets 241
10.6 小结 242
第11 章 安全、备份与集群健康 243
11.1 访问控制与权限 243
11.1.1 按集群管理访问权限 243
11.1.2 基于角色的访问控制(RBAC) 244
11.1.3 角色 245
11.1.4 将角色绑定到用户 246
11.1.5 我需要哪些角色? 247
11.1.6 保护集群管理员的权限 247
11.1.7 应用程序与部署 .248
11.1.8 RBAC 故障排除 .248
11.2 集群的安全扫描 249
11.2.1 Gatekeeper/OPA 250
11.2.2 kube-bench 250
11.2.3 Kubescape 251
11.3 容器安全扫描 251
11.3.1 Clair 252
11.3.2 Aqua . 252
11.3.3 Anchore Engine 253
11.3.4 Synk .253
11.4 备份 254
11.4.1 Kubernetes 需要备份吗? 255
11.4.2 备份etcd 255
11.4.3 备份资源状态 256
11.4.4 备份集群状态 256
11.4.5 大小灾害 257
11.4.6 Velero 257
11.5 监视集群状态 261
11.5.1 Kubectl 261
11.5.2 CPU 和内存利用率 263
11.5.3 云提供商控制台 .264
11.5.4 Kubernetes 仪表板 . 264
11.5.5 Weave Scope .265
11.5.6 kube-ops-view .266
11.5.7 node-problem-detector .266
11.6 延伸阅读 266
11.7 小结 266
第12 章 部署Kubernetes 应用程序 269
12.1 使用Helm 构建清单 269
12.1.1 Helm Chart 包含什么? 270
12.1.2 Helm 模板 .271
12.1.3 插值变量 272
12.1.4 引用模板中的值 . 274
12.1.5 指定依赖项 274
12.2 部署Heml Chart 275
12.2.1 设置变量 275
12.2.2 在Helm Release 中指定值 276
12.2.3 使用Helm 更新应用程序 277
12.2.4 回滚到以前的版本 278
12.2.5 创建Helm Chart 库 278
12.2.6 使用Sops 管理Helm Chart 的机密数据 .279
12.3 使用Helmfile 管理多个Chart 281
12.3.1 Helmfile 中有什么? 282
12.3.2 Chart 元数据. 283
12.3.3 应用Helmfile 284
12.4 高级清单管理工具 285
12.4.1 kustomize 285
12.4.2 Tanka 287
12.4.3 Kapitan 288
12.4.4 kompose . 288
12.4.5 Ansible 289
12.4.6 kubeval 289
12.5 小结 290
第13 章 开发流程 293
13.1 开发工具 293
13.1.1 Skaffold 294
13.1.2 Telepresence .296
13.1.3 Waypoint 296
13.1.4 Knative 297
13.1.5 OpenFaaS 297
13.1.6 Crossplane . 297
13.2 部署策略 299
13.2.1 滚动更新 300
13.2.2 重建 300
13.2.3 maxSurge 和maxUnavailable 301
13.2.4 蓝绿部署 302
13.2.5 彩虹部署 303
13.2.6 金丝雀部署 303
13.3 使用Helm 处理迁移 304
13.3.1 Helm 的钩子 .304
13.3.2 处理失败的钩子 . 305
13.3.3 其他钩子 305
13.3.4 钩子链 . 306
13.4 小结 307
第14 章 Kubernetes 的持续部署 . 309
14.1 什么是持续部署? 309
14.2 CD 工具 310
14.3 托管CI/CD 工具 311
14.3.1 Azure 流水线 311
14.3.2 谷歌云构建 311
14.3.3 Codefresh 311
14.3.4 GitHub Actions 312
14.3.5 GitLab CI 312
14.4 自托管CI/CD 工具 . 312
14.4.1 Jenkins . 312
14.4.2 Drone 312
14.4.3 Tekton 313
14.4.4 Concourse 313
14.4.5 Spinnaker 313
14.4.6 Argo . 313
14.4.7 Keel 314
14.5 谷歌云构建的CD 流水线 314
14.5.1 设置谷歌云和GKE 314
14.5.2 分叉demo 代码库 .315
14.5.3 创建 Artifact Registry 容器存储库 315
14.5.4 配置云构建 316
14.5.5 构建测试容器 316
14.5.6 运行测试 317
14.5.7 构建应用程序容器 318
14.5.8 替换变量 318
14.5.9 Git SHA 标签 318
14.5.10 验证Kubernetes 清单 319
14.5.11 发布镜像 .319
14.5.12 创建第一个构建触发器 319
14.5.13 测试触发器 . 320
14.5.14 利用CI/CD 流水线部署 321
14.5.15 创建部署触发器 323
14.5.16 调整示例流水线 324
14.6 GitOps 324
14.7 小结 328
第15 章 可观察性与监控 . 329
15.1 什么是可观察性? 329
15.1.1 什么是监控? 329
15.1.2 黑盒监控 330
15.1.3 “正常”指什么? 331
15.1.4 日志 333
15.1.5 指标 335
15.1.6 跟踪 336
15.1.7 可观察性 337
15.2 可观察性流水线 339
15.3 Kubernetes 中的监控 .340
15.3.1 外部的黑盒检查 . 340
15.3.2 内部健康检查 342
15.4 小结 344
第16 章 Kubernetes 的指标 347
16.1 什么是指标? 347
16.1.1 时间序列数据 348
16.1.2 计数器和计量器 . 348
16.1.3 指标可以告诉我们什么? . 349
16.2 选择指标 349
16.2.1 服务:RED 模式 350
16.2.2 资源:USE 模式 351
16.2.3 业务指标 352
16.2.4 Kubernetes 指标 .353
16.3 分析指标 357
16.3.1 简单的平均值有什么问题? 358
16.3.2 均值、中位数和离群值 358
16.3.3 百分位数 359
16.3.4 将百分位数应用于指标数据 360
16.3.5 最坏的情况 361
16.3.6 比百分位数更好的方式 362
16.4 通过仪表板显示指标的图表 363
16.4.1 所有服务都使用相同的标准布局 363
16.4.2 利用主仪表板构建信息发射源 364
16.4.3 在仪表板上显示故障 365
16.5 根据指标发出警报 366
16.5.1 警报有什么问题? 367
16.5.2 值班不应该成为地狱 368
16.5.3 紧急、重大且需要付诸行动的警报 . 368
16.5.4 跟踪警报、工作时间外的呼叫 369
16.6 指标工具和服务 370
16.6.1 Prometheus 370
16.6.2 谷歌的 Operations Suite .373
16.6.3 AWS Cloudwatch 373
16.6.4 Azure Monitor .374
16.6.5 Datadog 374
16.6.6 New Relic 375
16.7 小结 375
后记 . 379
猜您喜欢