




21
2.3.4小结 23
2.4创建应用镜像 24
2.4.1镜像内部机制 24
2.4.2什么是Dockerfile 26
2.4.3编写Dockerfile 27
2.4.4镜像构建工流程 29
2.4.5小结 30
2.5镜像仓库 31
2.5.1什么是DockerHub 31
2.5.2在DockerHub上挑选镜像 32
2.5.3DockerHub镜像的命名规则 34
2.5.4向DockerHub上传镜像 37
2.5.5离线环境使用DockerHub 38
2.5.6小结 38
2.6容器与外界的通信 39
2.6.1容器内外的文件拷贝 39
2.6.2共享宿主机的文件 40
2.6.3网络互联互通 41
2.6.4小结 44
2.7实战演练 44
2.7.1要点回顾 45
2.7.2私有镜像仓库 46
2.7.3WordPress网站 47
2.7.4小结 51
第3章Kubernetes实验环境搭建 52
3.1认识Kubernetes 52
3.1.1什么是容器编排 52
3.1.2什么是Kubernetes 53
3.1.3小结 54
3.2使用Minikube 54
3.2.1什么是Minikube 54
3.2.2安装Minikube 55
3.2.3运行Minikube 56
3.2.4小结 58
3.3使用kubeadm 59
3.3.1什么是kubeadm 59
3.3.2集群架构 60
3.3.3准备工作 61
3.3.4安装kubeadm 62
3.3.5安装控制面节点 63
3.3.6安装网络插件 65
3.3.7安装数据面节点 65
3.3.8安装操作台节点 66
3.3.9小结 66
第4章Kubernetes运行机制和基本API对象 67
4.1Kubernetes工作机制 67
4.1.1云时代的操作系统 67
4.1.2总体架构 68
4.1.3控制面 70
4.1.4数据面 70
4.1.5工作流程 71
4.1.6扩展 71
4.1.7小结 73
4.2工作语言YAML 73
4.2.1声明式与命令式 73
4.2.2什么是YAML 74
4.2.3什么是API对象 76
4.2.4用YAML描述API对象 78
4.2.5编写YAML的技巧 79
4.2.6小结 81
4.3核心概念Pod 81
4.3.1为什么要有Pod 82
4.3.2为什么Pod是核心概念 82
4.3.3用YAML描述Pod 83
4.3.4用kubectl操作Pod 85
4.3.5小结 87
4.4离线业务Job和CronJob 88
4.4.1为什么不直接使用Pod 88
4.4.2为什么要有Job和CronJob 89
4.4.3用YAML描述Job和CronJob 90
4.4.4用kubectl操作Job 91
4.4.5用kubectl操作CronJob 94
4.4.6小结 96
4.5配置信息ConfigMap和Secret 96
4.5.1什么是ConfigMap 97
4.5.2什么是Secret 98
4.5.3加载为环境变量 100
4.5.4加载为文件 103
4.5.5小结 106
4.6实战演练 106
4.6.1要点回顾 106
4.6.2搭建WordPress网站 108
4.6.3小结 113
第5章Kubernetes业务应用API对象 114
5.1永不宕机的Deployment 114
5.1.1为什么要有Deployment 114
5.1.2用YAML描述Deployment 115
5.1.3Deployment的关键字段 116
5.1.4用kubectl操作Deployment 118
5.1.5小结 120
5.2忠实可靠的看门狗DaemonSet 121
5.2.1为什么要有DaemonSet 121
5.2.2用YAML描述DaemonSet 122
5.2.3用kubectl操作DaemonSet 124
5.2.4污点和容忍度 124
5.2.5静态Pod 126
5.2.6小结 127
5.3微服务必需的Service 127
5.3.1为什么要有Service 127
5.3.2用YAML描述Service 128
5.3.3用kubectl操作Service 130
5.3.4以域名的方式访问Service 133
5.3.5在集群外暴露Service 135
5.3.6小结 136
5.4管理集群出入流量的Ingress 137
5.4.1为什么要有Ingress 137
5.4.2为什么要有IngressController 138
5.4.3为什么要有IngressClass 139
5.4.4用YAML描述Ingress和IngressClass 140
5.4.5用kubectl操作Ingress和IngressClass 142
5.4.6使用NginxIngressController 143
5.4.7使用KongIngressController 146
5.4.8扩展KongIngressController 150
5.4.9小结 153
5.5数据持久化PersistentVolume 154
5.5.1什么是PersistentVolume 155
5.5.2什么是PersistentVolumeClaim和StorageClass 155
5.5.3用YAML描述PersistentVolume 156
5.5.4用YAML描述PersistentVolumeClaim 158
5.5.5在Pod里使用PersistentVolume 158
5.5.6在Pod里使用静态网络存储 161
5.5.7在Pod里使用动态网络存储 164
5.5.8小结 167
5.6有状态的应用StatefulSet 168
5.6.1什么是有状态的应用 168
5.6.2用YAML描述StatefulSet 169
5.6.3用kubectl操作StatefulSet 170
5.6.4StatefulSet的数据持久化 173
5.6.5小结 175
5.7实战演练 176
5.7.1要点回顾 176
5.7.2使用Deployment搭建WordPress网站 178
5.7.3使用StatefulSet优化WordPress网站的设计 185
5.7.4小结 187
第6章Kubernetes运维、监控和管理 188
6.1应用滚动更新 188
6.1.1应用的版本更新 188
6.1.2应用版本更新的过程 190
6.1.3管理更新 193
6.1.4更新描述 195
6.1.5小结 196
6.2容器状态探针 197
6.2.1探针的种类 197
6.2.2使用探针 199
6.2.3小结 201
6.3容器资源配额管理 202
6.3.1申请资源配额 202
6.3.2处理策略 203
6.3.3小结 204
6.4集群资源配额管理 204
6.4.1什么是名字空间 204
6.4.2如何使用名字空间 205
6.4.3设置资源配额 206
6.4.4使用资源配额 208
6.4.5默认资源配额 210
6.4.6小结 212
6.5集群资源监控 212
6.5.1使用MetricsServer 212
6.5.2水平自动伸缩 214
6.5.3使用Prometheus 217
6.5.4小结 221
6.6集群网络插件 222
6.6.1网络模型 222
6.6.2什么是CNI 223
6.6.3CNI的工作原理 224
6.6.4使用Calico插件 227
6.6.5小结 229
6.7实战演练 230
6.7.1要点回顾 230
6.7.2部署Dashboard 231
6.7.3小结 237
第7章结束语 238
7.1学习经验分享 238
7.2学习方式建议 239
7.3临别感言 240
附录AKubernetes弃用Docker 241
A.1CRI 241
A.2Containerd 242
A.3正式弃用Docker 243
A.4Docker的未来 245
附录Bdocker-compose 246
B.1什么是docker-compose 246
B.2搭建私有镜像仓库 247
B.3搭建WordPress网站 250
B.4小结 253
附录CHarbor 254
C.1什么是Harbor 254
C.2安装Harbor 254
C.3使用Harbor 256
附录DNFS网络存储服务 258
D.1安装NFS服务端 258
D.2安装NFS客户端 259
D.3验证NFS存储 259
D.4安装NFSProvisioner 260