第 1章 初识Kubernetes 001
1.1 Kubernetes的背景 001
1.1.1 编排器 001
1.1.2 容器化应用 002
1.1.3 云原生应用 002
1.1.4 微服务应用 003
1.2 Kubernetes的诞生 004
1.2.1 Kubernetes和Docker 004
1.2.2 Kubernetes与Docker Swarm的对比 006
1.2.3 Kubernetes和Borg:抵抗是徒劳的 006
1.2.4 Kubernetes—名字从何而来 007
1.3 云操作系统 007
1.3.1 云的规模 008
1.3.2 应用的调度 008
1.3.3 一个简单的模拟 009
1.4 本章小结 009
第 2章 Kubernetes操作概览 010
2.1 Kubernetes概览 011
2.1.1 作为集群的Kubernetes 011
2.1.2 作为编排器的Kubernetes 011
2.1.3 Kubernetes是如何工作的 012
2.2 控制平面与工作节点 013
2.2.1 控制平面 013
2.2.2 工作节点 017
2.3 Kubernetes DNS 018
2.4 Kubernetes应用打包 019
2.5 声明式模型与期望状态 020
声明式示例 021
2.6 Pod 021
2.6.1 Pod与容器 022
2.6.2 Pod深度剖析 023
2.6.3 调度单元 024
2.6.4 原子操作 024
2.6.5 Pod的生命周期 024
2.6.6 Pod的不变性 025
2.7 Deployment 025
2.8 Service与稳定的网络 025
2.9 本章小结 027
第3章 安装Kubernetes 028
3.1 在笔记本计算机上创建Kubernetes集群 028
3.1.1 Docker Desktop 029
3.1.2 通过K3d创建本地多节点Kubernetes集群 030
3.1.3 通过KinD创建本地多节点Kubernetes集群 032
3.2 在云上创建托管的Kubernetes集群 034
3.2.1 GKE 034
3.2.2 LKE 036
3.3 安装和使用kubectl 038
3.4 本章小结 040
第4章 Pod的使用 041
4.1 Pod原理 042
4.1.1 为什么是Pod 042
4.1.2 静态Pod与控制器 046
4.1.3 单容器和多容器Pod 046
4.1.4 Pod的部署 047
4.1.5 剖析Pod 047
4.1.6 Pod与共享网络 047
4.1.7 Pod网络 048
4.1.8 Pod的原子部署 049
4.1.9 Pod的生命周期 049
4.1.10 Pod的不变性 050
4.1.11 Pod和扩缩容 051
4.2 多容器Pod 051
4.2.1 边车多容器Pod 052
4.2.2 适配器多容器Pod 052
4.2.3 大使多容器Pod 052
4.2.4 初始化多容器Pod 053
4.2.5 Pod原理总结 053
4.3 Pod实战 053
4.3.1 Pod清单文件 054
4.3.2 清单文件:共情即代码 055
4.3.3 基于清单文件部署Pod 056
4.3.4 查看运行中的Pod 056
4.3.5 Pod的主机名 060
4.3.6 检查Pod的不变性 061
4.3.7 多容器Pod示例—初始化容器 061
4.3.8 多容器Pod示例—边车容器 063
4.4 Pod清理 065
4.5 本章小结 066
第5章 虚拟集群与命名空间 067
5.1 命名空间的使用案例 068
5.2 查看命名空间 069
5.3 创建和管理命名空间 070
配置kubectl以使用特定命名空间 071
5.4 部署到命名空间 072
5.5 清理 074
5.6 本章小结 074
第6章 Kubernetes Deployment 075
6.1 Deployment原理 076
6.1.1 Deployment和Pod 077
6.1.2 Deployment和ReplicaSet 077
6.1.3 自愈和扩缩容 078
6.1.4 围绕“状态”的管理 079
6.1.5 使用Deployment进行滚动更新 081
6.1.6 回滚 083
6.2 创建Deployment 084
6.3 查看Deployment 086
访问应用 088
6.4 进行扩缩容 090
6.5 进行滚动更新 091
暂停和恢复滚动更新 094
6.6 进行回滚 096
回滚和标签 098
6.7 清理 099
6.8 本章小结 100
第7章 Kubernetes Service 101
7.1 Service原理 102
7.1.1 标签和松耦合 103
7.1.2 Service和EndpointSlice 105
7.1.3 双栈网络(IPv4和IPv6) 106
7.1.4 从集群内部访问Service 106
7.1.5 从集群外部访问Service 107
7.1.6 Service原理总结 109
7.2 Service实战 109
7.2.1 双栈网络入门 109
7.2.2 命令式方法 113
7.2.3 声明式方法 115
7.2.4 LoadBalancer Service 118
7.3 清理 119
7.4 本章小结 119
第8章 Ingress 120
8.1 Ingress背景 121
8.2 Ingress架构 122
8.3 Ingress实战 123
8.3.1 安装NGINX Ingress controller 124
8.3.2 为多Ingress controller集群配置Ingress class 125
8.3.3 配置基于主机名和基于路径的路由 126
8.3.4 部署应用 127
8.3.5 创建Ingress对象 127
8.3.6 查看Ingress对象 130
8.3.7 配置DNS名称解析 131
8.3.8 测试Ingress 132
8.4 清理 133
8.5 本章小结 134
第9章 深挖服务发现 135
9.1 快速入门 136
9.2 服务注册 136
9.2.1 Service后端 138
9.2.2 服务注册小结 140
9.3 服务发现 140
9.3.1 使用集群DNS将名称解析为IP地址 141
9.3.2 网络“黑科技” 142
9.3.3 服务发现小结 143
9.4 服务发现和命名空间 144
服务发现示例 145
9.5 服务发现问题排查 150
9.6 本章小结 153
第 10章 Kubernetes存储 154
10.1 概述 155
10.2 存储提供商 157
10.3 容器存储接口 157
10.4 Kubernetes持久卷子系统 158
10.5 使用存储类进行动态置备 159
10.5.1 存储类YAML 160
10.5.2 多个存储类 161
10.5.3 部署和使用StorageClass对象 162
10.5.4 额外的卷配置 163
10.6 实战 165
10.6.1 使用现有的存储类 165
10.6.2 创建和使用新的存储类 169
10.7 清理 171
10.8 本章小结 171
第 11章 ConfigMap和
Secret 172
11.1 概述 173
11.1.1 小例子 173
11.1.2 解耦的世界 174
11.2 ConfigMap原理 175
11.2.1 ConfigMap如何工作 176
11.2.2 ConfigMap和Kubernetes原生应用 177
11.3 ConfigMap实战 178
11.3.1 命令式创建ConfigMap 178
11.3.2 查看ConfigMap 179
11.3.3 声明式创建ConfigMap 180
11.3.4 将ConfigMap数据注入Pod和容器 182
11.4 Secret实战 189
11.4.1 Kubernetes Secret是否安全? 189
11.4.2 创建Secret 190
11.4.3 在Pod中使用Secret 192
11.5 清理 193
11.6 本章小结 193
第 12章 StatefulSet 194
12.1 StatefulSet原理 195
12.1.1 StatefulSet Pod命名 196
12.1.2 有序创建和删除 196
12.1.3 删除StatefulSet 198
12.1.4 StatefulSet和卷 198
12.1.5 故障处理 199
12.1.6 网络ID和headless Service 199
12.2 StatefulSet实战 200
12.2.1 部署存储类 201
12.2.2 创建headless Service 202
12.2.3 部署StatefulSet 203
12.2.4 测试对等发现 206
12.2.5 扩缩容StatefulSet 208
12.2.6 执行滚动更新 210
12.2.7 测试Pod故障 210
12.2.8 删除StatefulSet 212
12.3 本章小结 212
第 13章 API安全和RBAC 213
13.1 API安全概览 213
13.2 身份认证 214
检查当前身份认证设置 215
13.3 鉴权 216
13.3.1 RBAC概览 217
13.3.2 用户和权限 218
13.3.3 深入探讨规则 219
13.3.4 集群级别的用户和权限 221
13.3.5 预创建的用户和权限 222
13.3.6 鉴权总结 225
13.4 准入控制 225
13.5 本章小结 226
第 14章 Kubernetes API 227
14.1 Kubernetes API概览 228
14.1.1 JSON序列化 228
14.1.2 API类比 229
14.2 API Server 231
14.2.1 关于REST和RESTful 233
14.2.2 关于CRUD 235
14.3 API 237
14.3.1 核心API组 238
14.3.2 命名API组 239
14.3.3 关于访问API的一些话 241
14.3.4 alpha版、beta版和稳定版 243
14.3.5 资源弃用 245
14.3.6 资源、对象和原语 245
14.3.7 扩展API 246
14.4 本章小结 250
第 15章 Kubernetes威胁建模 252
15.1 威胁建模 252
15.2 伪装 253
15.2.1 保护与API Server的通信 253
15.2.2 确保Pod通信安全 254
15.3 篡改 255
15.3.1 篡改Kubernetes组件 256
15.3.2 篡改运行在Kubernetes上的应用 257
15.4 抵赖 257
15.5 信息泄露 259
15.5.1 保护集群数据 260
15.5.2 保护Pod中的数据 260
15.6 拒绝服务 261
15.6.1 保护集群资源免受DoS攻击 261
15.6.2 保护API Server免受DoS攻击 262
15.6.3 保护集群存储免受DoS攻击 263
15.6.4 保护应用组件免受DoS攻击 263
15.7 权限提升 264
15.7.1 保护API Server 264
15.7.2 保护Pod 265
15.7.3 使用PSS和PSA实现容器安全性标准化 270
15.7.4 PSS 271
15.7.5 PSA 271
15.7.6 PSA示例 272
15.7.7 PSA的替代方案 276
15.7.8 走向更安全的Kubernetes 276
15.8 本章小结 277
第 16章 真实世界的Kubernetes安全 278
16.1 CI/CD管道 279
16.1.1 镜像库 279
16.1.2 使用已批准的基本镜像 280
16.1.3 非标准基本镜像 281
16.1.4 控制对镜像的访问 281
16.1.5 将镜像从非生产环境移动到生产环境 282
16.1.6 漏洞扫描 282
16.1.7 配置即代码 283
16.1.8 签名容器镜像 284
16.1.9 镜像发布工作流 284
16.2 基础设施和网络 285
16.2.1 集群隔离 285
16.2.2 节点隔离 287
16.2.3 运行时隔离 288
16.2.4 网络隔离 289
16.3 IAM 292
管理对集群节点的远程SSH访问 293
16.4 审计和安全监控 293
16.4.1 安全配置 294
16.4.2 容器和Pod生命周期事件 294
16.4.3 应用日志 295
16.4.4 用户执行的操作 295
16.4.5 管理日志数据 295
16.4.6 将现有应用迁移到Kubernetes 295
16.5 真实世界的例子 296
16.6 本章小结 297
术语表 298