@@ -19,7 +19,8 @@ This tutorial provides an introduction to managing applications with
19
19
demonstrates how to create, delete, scale, and update the Pods of StatefulSets.
20
20
-->
21
21
22
- 本教程介绍如何了使用 [ StatefulSets] ( /zh/docs/concepts/abstractions/controllers/statefulsets/ ) 来管理应用。演示了如何创建、删除、扩容/缩容和更新 StatefulSets 的 Pods。
22
+ 本教程介绍如何了使用 [ StatefulSets] ( /zh/docs/concepts/workloads/controllers/statefulset/ ) 来管理应用。
23
+ 演示了如何创建、删除、扩容/缩容和更新 StatefulSets 的 Pods。
23
24
24
25
25
26
@@ -71,7 +72,8 @@ After this tutorial, you will be familiar with the following.
71
72
* How to update a StatefulSet's Pods
72
73
-->
73
74
74
- StatefulSets 旨在与有状态的应用及分布式系统一起使用。然而在 Kubernetes 上管理有状态应用和分布式系统是一个宽泛而复杂的话题。为了演示 StatefulSet 的基本特性,并且不使前后的主题混淆,你将会使用 StatefulSet 部署一个简单的 web 应用。
75
+ StatefulSets 旨在与有状态的应用及分布式系统一起使用。然而在 Kubernetes 上管理有状态应用和分布式系统是一个宽泛而复杂的话题。
76
+ 为了演示 StatefulSet 的基本特性,并且不使前后的主题混淆,你将会使用 StatefulSet 部署一个简单的 web 应用。
75
77
76
78
在阅读本教程后,你将熟悉以下内容:
77
79
@@ -86,10 +88,21 @@ StatefulSets 旨在与有状态的应用及分布式系统一起使用。然而
86
88
87
89
<!-- lessoncontent -->
88
90
91
+ <!--
92
+ ## Creating a StatefulSet
93
+
94
+ Begin by creating a StatefulSet using the example below. It is similar to the
95
+ example presented in the
96
+ [StatefulSets](/docs/concepts/workloads/controllers/statefulset/) concept.
97
+ It creates a [headless Service](/docs/concepts/services-networking/service/#headless-services),
98
+ `nginx`, to publish the IP addresses of Pods in the StatefulSet, `web`.
99
+ -->
100
+
89
101
## 创建 StatefulSet
90
102
91
103
92
- 作为开始,使用如下示例创建一个 StatefulSet。它和 [ StatefulSets] ( /zh/docs/concepts/abstractions/controllers/statefulsets/ ) 概念中的示例相似。它创建了一个 [ Headless Service] ( /zh/docs/user-guide/services/#headless-services ) ` nginx ` 用来发布 StatefulSet ` web ` 中的 Pod 的 IP 地址。
104
+ 作为开始,使用如下示例创建一个 StatefulSet。它和 [ StatefulSets] ( /zh/docs/concepts/workloads/controllers/statefulset/ ) 概念中的示例相似。
105
+ 它创建了一个 [ Headless Service] ( /zh/docs/concepts/services-networking/service/#headless-services ) ` nginx ` 用来发布 StatefulSet ` web ` 中的 Pod 的 IP 地址。
93
106
94
107
{{< codenew file="application/web/web.yaml" >}}
95
108
@@ -104,7 +117,7 @@ of the StatefulSet's Pods.
104
117
下载上面的例子并保存为文件 ` web.yaml ` 。
105
118
106
119
107
- 你需要使用两个终端窗口。在第一个终端中,使用 [ ` kubectl get ` ] (/zh/docs/user-guide/kubectl/{{< param "version" >}}/#get) 来查看 StatefulSet 的 Pods 的创建情况。
120
+ 你需要使用两个终端窗口。 在第一个终端中,使用 [ ` kubectl get ` ] (/zh/docs/user-guide/kubectl/{{< param "version" >}}/#get) 来查看 StatefulSet 的 Pods 的创建情况。
108
121
109
122
``` shell
110
123
kubectl get pods -w -l app=nginx
@@ -132,7 +145,8 @@ The command above creates two Pods, each running an
132
145
`web` StatefulSet to verify that they were created successfully.
133
146
-->
134
147
135
- 上面的命令创建了两个 Pod,每个都运行了一个 [ NGINX] ( https://www.nginx.com ) web 服务器。获取 ` nginx ` Service 和 ` web ` StatefulSet 来验证是否成功的创建了它们。
148
+ 上面的命令创建了两个 Pod,每个都运行了一个 [ NGINX] ( https://www.nginx.com ) web 服务器。
149
+ 获取 ` nginx ` Service 和 ` web ` StatefulSet 来验证是否成功的创建了它们。
136
150
137
151
``` shell
138
152
kubectl get service nginx
@@ -166,7 +180,8 @@ look like the example below.
166
180
### 顺序创建 Pod
167
181
168
182
169
- 对于一个拥有 N 个副本的 StatefulSet,Pod 被部署时是按照 {0 …… N-1} 的序号顺序创建的。在第一个终端中使用 ` kubectl get ` 检查输出。这个输出最终将看起来像下面的样子。
183
+ 对于一个拥有 N 个副本的 StatefulSet,Pod 被部署时是按照 {0 …… N-1} 的序号顺序创建的。
184
+ 在第一个终端中使用 ` kubectl get ` 检查输出。这个输出最终将看起来像下面的样子。
170
185
171
186
``` shell
172
187
kubectl get pods -w -l app=nginx
@@ -235,7 +250,11 @@ Each Pod has a stable hostname based on its ordinal index. Use
235
250
`hostname` command in each Pod.
236
251
-->
237
252
238
- 如同 [ StatefulSets] ( /zh/docs/concepts/abstractions/controllers/statefulsets/ ) 概念中所提到的,StatefulSet 中的 Pod 拥有一个具有黏性的、独一无二的身份标志。这个标志基于 StatefulSet 控制器分配给每个 Pod 的唯一顺序索引。Pod 的名称的形式为` <statefulset name>-<ordinal index> ` 。` web ` StatefulSet 拥有两个副本,所以它创建了两个 Pod:` web-0 ` 和` web-1 ` 。
253
+ 如同 [ StatefulSets] ( /zh/docs/concepts/workloads/controllers/statefulset/ ) 概念中所提到的,
254
+ StatefulSet 中的 Pod 拥有一个具有黏性的、独一无二的身份标志。
255
+ 这个标志基于 StatefulSet 控制器分配给每个 Pod 的唯一顺序索引。
256
+ Pod 的名称的形式为` <statefulset name>-<ordinal index> ` 。
257
+ ` web ` StatefulSet 拥有两个副本,所以它创建了两个 Pod:` web-0 ` 和` web-1 ` 。
239
258
240
259
### 使用稳定的网络身份标识
241
260
@@ -256,7 +275,9 @@ Using `nslookup` on the Pods' hostnames, you can examine their in-cluster DNS
256
275
addresses.
257
276
-->
258
277
259
- 使用 [ ` kubectl run ` ] ( /zh/docs/reference/generated/kubectl/kubectl-commands/#run ) 运行一个提供 ` nslookup ` 命令的容器,该命令来自于 ` dnsutils ` 包。通过对 Pod 的主机名执行 ` nslookup ` ,你可以检查他们在集群内部的 DNS 地址。
278
+ 使用 [ ` kubectl run ` ] ( /zh/docs/reference/generated/kubectl/kubectl-commands/#run )
279
+ 运行一个提供 ` nslookup ` 命令的容器,该命令来自于 ` dnsutils ` 包。
280
+ 通过对 Pod 的主机名执行 ` nslookup ` ,你可以检查他们在集群内部的 DNS 地址。
260
281
261
282
``` shell
262
283
kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm
@@ -296,7 +317,8 @@ contain the Pods' IP addresses.
296
317
In one terminal, watch the StatefulSet's Pods.
297
318
-->
298
319
299
- headless service 的 CNAME 指向 SRV 记录(记录每个 Running 和 Ready 状态的 Pod)。SRV 记录指向一个包含 Pod IP 地址的记录表项。
320
+ headless service 的 CNAME 指向 SRV 记录(记录每个 Running 和 Ready 状态的 Pod)。
321
+ SRV 记录指向一个包含 Pod IP 地址的记录表项。
300
322
301
323
在一个终端中查看 StatefulSet 的 Pod。
302
324
@@ -409,10 +431,12 @@ application will be able to discover the Pods' addresses when they transition
409
431
to Running and Ready.
410
432
-->
411
433
412
- Pod 的序号、主机名、SRV 条目和记录名称没有改变,但和 Pod 相关联的 IP 地址可能发生了改变。在本教程中使用的集群中它们就改变了。这就是为什么不要在其他应用中使用 StatefulSet 中的 Pod 的 IP 地址进行连接,这点很重要。
434
+ Pod 的序号、主机名、SRV 条目和记录名称没有改变,但和 Pod 相关联的 IP 地址可能发生了改变。
435
+ 在本教程中使用的集群中它们就改变了。这就是为什么不要在其他应用中使用 StatefulSet 中的 Pod 的 IP 地址进行连接,这点很重要。
413
436
414
437
415
- 如果你需要查找并连接一个 StatefulSet 的活动成员,你应该查询 Headless Service 的 CNAME。和 CNAME 相关联的 SRV 记录只会包含 StatefulSet 中处于 Running 和 Ready 状态的 Pod。
438
+ 如果你需要查找并连接一个 StatefulSet 的活动成员,你应该查询 Headless Service 的 CNAME。
439
+ 和 CNAME 相关联的 SRV 记录只会包含 StatefulSet 中处于 Running 和 Ready 状态的 Pod。
416
440
417
441
418
442
如果你的应用已经实现了用于测试 liveness 和 readiness 的连接逻辑,你可以使用 Pod 的 SRV 记录(` web-0.nginx.default.svc.cluster.local ` ,
@@ -459,7 +483,8 @@ webservers serve the hostnames.
459
483
StatefulSet 控制器创建了两个 PersistentVolumeClaims,绑定到两个 [ PersistentVolumes] ( /zh/docs/concepts/storage/volumes/ ) 。由于本教程使用的集群配置为动态提供 PersistentVolume,所有的 PersistentVolume 都是自动创建和绑定的。
460
484
461
485
462
- NGINX web 服务器默认会加载位于 ` /usr/share/nginx/html/index.html ` 的 index 文件。StatefulSets ` spec ` 中的 ` volumeMounts ` 字段保证了 ` /usr/share/nginx/html ` 文件夹由一个 PersistentVolume 支持。
486
+ NGINX web 服务器默认会加载位于 ` /usr/share/nginx/html/index.html ` 的 index 文件。
487
+ StatefulSets ` spec ` 中的 ` volumeMounts ` 字段保证了 ` /usr/share/nginx/html ` 文件夹由一个 PersistentVolume 支持。
463
488
464
489
465
490
将 Pod 的主机名写入它们的` index.html ` 文件并验证 NGINX web 服务器使用该主机名提供服务。
@@ -572,12 +597,15 @@ This is accomplished by updating the `replicas` field. You can use either
572
597
In one terminal window, watch the Pods in the StatefulSet.
573
598
-->
574
599
575
- 虽然 ` web-0 ` 和 ` web-1 ` 被重新调度了,但它们仍然继续监听各自的主机名,因为和它们的 PersistentVolumeClaim 相关联的 PersistentVolume 被重新挂载到了各自的 ` volumeMount ` 上。不管 ` web-0 ` 和 ` web-1 ` 被调度到了哪个节点上,它们的 PersistentVolumes 将会被挂载到合适的挂载点上。
600
+ 虽然 ` web-0 ` 和 ` web-1 ` 被重新调度了,但它们仍然继续监听各自的主机名,因为和它们的 PersistentVolumeClaim 相关联的 PersistentVolume 被重新挂载到了各自的 ` volumeMount ` 上。
601
+ 不管 ` web-0 ` 和 ` web-1 ` 被调度到了哪个节点上,它们的 PersistentVolumes 将会被挂载到合适的挂载点上。
576
602
577
603
578
604
## 扩容/缩容 StatefulSet
579
605
580
- 扩容/缩容 StatefulSet 指增加或减少它的副本数。这通过更新 ` replicas ` 字段完成。你可以使用[ ` kubectl scale ` ] (/zh/docs/user-guide/kubectl/{{< param "version" >}}/#scale) 或者[ ` kubectl patch ` ] (/zh/docs/user-guide/kubectl/{{< param "version" >}}/#patch)来扩容/缩容一个 StatefulSet。
606
+ 扩容/缩容 StatefulSet 指增加或减少它的副本数。这通过更新 ` replicas ` 字段完成。
607
+ 你可以使用[ ` kubectl scale ` ] (/zh/docs/user-guide/kubectl/{{< param "version" >}}/#scale)
608
+ 或者[ ` kubectl patch ` ] (/zh/docs/user-guide/kubectl/{{< param "version" >}}/#patch)来扩容/缩容一个 StatefulSet。
581
609
582
610
583
611
### 扩容
@@ -642,7 +670,8 @@ subsequent Pod.
642
670
In one terminal, watch the StatefulSet's Pods.
643
671
-->
644
672
645
- StatefulSet 控制器扩展了副本的数量。如同[ 创建 StatefulSet] ( #顺序创建pod ) 所述,StatefulSet 按序号索引顺序的创建每个 Pod,并且会等待前一个 Pod 变为 Running 和 Ready 才会启动下一个 Pod。
673
+ StatefulSet 控制器扩展了副本的数量。
674
+ 如同[ 创建 StatefulSet] ( #顺序创建pod ) 所述,StatefulSet 按序号索引顺序的创建每个 Pod,并且会等待前一个 Pod 变为 Running 和 Ready 才会启动下一个 Pod。
646
675
647
676
### 缩容
648
677
@@ -738,13 +767,17 @@ StatefulSet. There are two valid update strategies, `RollingUpdate` and
738
767
`RollingUpdate` update strategy is the default for StatefulSets.
739
768
-->
740
769
741
- 五个 PersistentVolumeClaims 和五个 PersistentVolumes 仍然存在。查看 Pod 的 [ 稳定存储] ( #stable-storage ) ,我们发现当删除 StatefulSet 的 Pod 时,挂载到 StatefulSet 的 Pod 的 PersistentVolumes 不会被删除。当这种删除行为是由 StatefulSet 缩容引起时也是一样的。
770
+ 五个 PersistentVolumeClaims 和五个 PersistentVolumes 仍然存在。
771
+ 查看 Pod 的 [ 稳定存储] ( #stable-storage ) ,我们发现当删除 StatefulSet 的 Pod 时,挂载到 StatefulSet 的 Pod 的 PersistentVolumes 不会被删除。
772
+ 当这种删除行为是由 StatefulSet 缩容引起时也是一样的。
742
773
743
774
744
775
## 更新 StatefulSet
745
776
746
777
747
- Kubernetes 1.7 版本的 StatefulSet 控制器支持自动更新。更新策略由 StatefulSet API Object 的` spec.updateStrategy ` 字段决定。这个特性能够用来更新一个 StatefulSet 中的 Pod 的 container images,resource requests,以及 limits,labels 和 annotations。` RollingUpdate ` 滚动更新是 StatefulSets 默认策略。
778
+ Kubernetes 1.7 版本的 StatefulSet 控制器支持自动更新。
779
+ 更新策略由 StatefulSet API Object 的` spec.updateStrategy ` 字段决定。这个特性能够用来更新一个 StatefulSet 中的 Pod 的 container images,resource requests,以及 limits,labels 和 annotations。
780
+ ` RollingUpdate ` 滚动更新是 StatefulSets 默认策略。
748
781
749
782
750
783
<!--
@@ -845,7 +878,10 @@ in the presence of intermittent failures.
845
878
Get the Pods to view their container images.
846
879
-->
847
880
848
- StatefulSet 里的 Pod 采用和序号相反的顺序更新。在更新下一个 Pod 前,StatefulSet 控制器终止每个 Pod 并等待它们变成 Running 和 Ready。请注意,虽然在顺序后继者变成 Running 和 Ready 之前 StatefulSet 控制器不会更新下一个 Pod,但它仍然会重建任何在更新过程中发生故障的 Pod,使用的是它们当前的版本。已经接收到更新请求的 Pod 将会被恢复为更新的版本,没有收到请求的 Pod 则会被恢复为之前的版本。像这样,控制器尝试继续使应用保持健康并在出现间歇性故障时保持更新的一致性。
881
+ StatefulSet 里的 Pod 采用和序号相反的顺序更新。在更新下一个 Pod 前,StatefulSet 控制器终止每个 Pod 并等待它们变成 Running 和 Ready。
882
+ 请注意,虽然在顺序后继者变成 Running 和 Ready 之前 StatefulSet 控制器不会更新下一个 Pod,但它仍然会重建任何在更新过程中发生故障的 Pod,使用的是它们当前的版本。
883
+ 已经接收到更新请求的 Pod 将会被恢复为更新的版本,没有收到请求的 Pod 则会被恢复为之前的版本。
884
+ 像这样,控制器尝试继续使应用保持健康并在出现间歇性故障时保持更新的一致性。
849
885
850
886
获取 Pod 来查看他们的容器镜像。
851
887
@@ -882,7 +918,8 @@ StatefulSet 中的所有 Pod 现在都在运行之前的容器镜像。
882
918
883
919
#### 分段更新
884
920
885
- 你可以使用 ` RollingUpdate ` 更新策略的 ` partition ` 参数来分段更新一个 StatefulSet。分段的更新将会使 StatefulSet 中的其余所有 Pod 保持当前版本的同时仅允许改变 StatefulSet 的 ` .spec.template ` 。
921
+ 你可以使用 ` RollingUpdate ` 更新策略的 ` partition ` 参数来分段更新一个 StatefulSet。
922
+ 分段的更新将会使 StatefulSet 中的其余所有 Pod 保持当前版本的同时仅允许改变 StatefulSet 的 ` .spec.template ` 。
886
923
887
924
888
925
Patch ` web ` StatefulSet 来对 ` updateStrategy ` 字段添加一个分区。
@@ -963,7 +1000,8 @@ you specified [above](#staging-an-update).
963
1000
Patch the StatefulSet to decrement the partition.
964
1001
-->
965
1002
966
- 请注意,虽然更新策略是 ` RollingUpdate ` ,StatefulSet 控制器还是会使用原始的容器恢复 Pod。这是因为 Pod 的序号比 ` updateStrategy ` 指定的 ` partition ` 更小。
1003
+ 请注意,虽然更新策略是 ` RollingUpdate ` ,StatefulSet 控制器还是会使用原始的容器恢复 Pod。
1004
+ 这是因为 Pod 的序号比 ` updateStrategy ` 指定的 ` partition ` 更小。
967
1005
968
1006
969
1007
#### 灰度发布
@@ -1089,12 +1127,14 @@ update.
1089
1127
The partition is currently set to `2`. Set the partition to `0`.
1090
1128
-->
1091
1129
1092
- ` web-1 ` 被按照原来的配置恢复,因为 Pod 的序号小于分区。当指定了分区时,如果更新了 StatefulSet 的 ` .spec.template ` ,则所有序号大于或等于分区的 Pod 都将被更新。如果一个序号小于分区的 Pod 被删除或者终止,它将被按照原来的配置恢复。
1130
+ ` web-1 ` 被按照原来的配置恢复,因为 Pod 的序号小于分区。当指定了分区时,如果更新了 StatefulSet 的 ` .spec.template ` ,则所有序号大于或等于分区的 Pod 都将被更新。
1131
+ 如果一个序号小于分区的 Pod 被删除或者终止,它将被按照原来的配置恢复。
1093
1132
1094
1133
1095
1134
#### 分阶段的发布
1096
1135
1097
- 你可以使用类似[ 灰度发布] ( #灰度发布 ) 的方法执行一次分阶段的发布(例如一次线性的、等比的或者指数形式的发布)。要执行一次分阶段的发布,你需要设置 ` partition ` 为希望控制器暂停更新的序号。
1136
+ 你可以使用类似[ 灰度发布] ( #灰度发布 ) 的方法执行一次分阶段的发布(例如一次线性的、等比的或者指数形式的发布)。
1137
+ 要执行一次分阶段的发布,你需要设置 ` partition ` 为希望控制器暂停更新的序号。
1098
1138
1099
1139
1100
1140
分区当前为` 2 ` 。请将分区设置为` 0 ` 。
@@ -1179,7 +1219,8 @@ In one terminal window, watch the Pods in the StatefulSet.
1179
1219
1180
1220
### On Delete 策略
1181
1221
1182
- ` OnDelete ` 更新策略实现了传统(1.7 之前)行为,它也是默认的更新策略。当你选择这个更新策略并修改 StatefulSet 的 ` .spec.template ` 字段时,StatefulSet 控制器将不会自动的更新 Pod。
1222
+ ` OnDelete ` 更新策略实现了传统(1.7 之前)行为,它也是默认的更新策略。
1223
+ 当你选择这个更新策略并修改 StatefulSet 的 ` .spec.template ` 字段时,StatefulSet 控制器将不会自动的更新 Pod。
1183
1224
1184
1225
## 删除 StatefulSet
1185
1226
@@ -1203,7 +1244,8 @@ command. This parameter tells Kubernetes to only delete the StatefulSet, and to
1203
1244
not delete any of its Pods.
1204
1245
-->
1205
1246
1206
- 使用 [ ` kubectl delete ` ] ( /zh/docs/reference/generated/kubectl/kubectl-commands/#delete ) 删除 StatefulSet。请确保提供了 ` --cascade=false ` 参数给命令。这个参数告诉 Kubernetes 只删除 StatefulSet 而不要删除它的任何 Pod。
1247
+ 使用 [ ` kubectl delete ` ] ( /zh/docs/reference/generated/kubectl/kubectl-commands/#delete ) 删除 StatefulSet。
1248
+ 请确保提供了 ` --cascade=false ` 参数给命令。这个参数告诉 Kubernetes 只删除 StatefulSet 而不要删除它的任何 Pod。
1207
1249
1208
1250
``` shell
1209
1251
kubectl delete statefulset web --cascade=false
@@ -1358,7 +1400,9 @@ PersistentVolume was remounted.
1358
1400
In one terminal window, watch the Pods in the StatefulSet.
1359
1401
-->
1360
1402
1361
- 尽管你同时删除了 StatefulSet 和 ` web-0 ` Pod,但它仍然使用最初写入 ` index.html ` 文件的主机名进行服务。这是因为 StatefulSet 永远不会删除和一个 Pod 相关联的 PersistentVolumes。当你重建这个 StatefulSet 并且重新启动了 ` web-0 ` 时,它原本的 PersistentVolume 会被重新挂载。
1403
+ 尽管你同时删除了 StatefulSet 和 ` web-0 ` Pod,但它仍然使用最初写入 ` index.html ` 文件的主机名进行服务。
1404
+ 这是因为 StatefulSet 永远不会删除和一个 Pod 相关联的 PersistentVolumes。
1405
+ 当你重建这个 StatefulSet 并且重新启动了 ` web-0 ` 时,它原本的 PersistentVolume 会被重新挂载。
1362
1406
1363
1407
1364
1408
### 级联删除
@@ -1422,7 +1466,8 @@ it will not delete the Headless Service associated with the StatefulSet. You
1422
1466
must delete the `nginx` Service manually.
1423
1467
-->
1424
1468
1425
- 如同你在[ 缩容] ( #ordered-pod-termination ) 一节看到的,Pod 按照和他们序号索引相反的顺序每次终止一个。在终止一个 Pod 前,StatefulSet 控制器会等待 Pod 后继者被完全终止。
1469
+ 如同你在[ 缩容] ( #ordered-pod-termination ) 一节看到的,Pod 按照和他们序号索引相反的顺序每次终止一个。
1470
+ 在终止一个 Pod 前,StatefulSet 控制器会等待 Pod 后继者被完全终止。
1426
1471
1427
1472
1428
1473
请注意,虽然级联删除会删除 StatefulSet 和它的 Pod,但它并不会删除和 StatefulSet 关联的 Headless Service。你必须手动删除` nginx ` Service。
@@ -1522,6 +1567,7 @@ Pod. This option only affects the behavior for scaling operations. Updates are n
1522
1567
## Pod 管理策略
1523
1568
1524
1569
1570
+
1525
1571
对于某些分布式系统来说,StatefulSet 的顺序性保证是不必要和/或者不应该的。
1526
1572
这些系统仅仅要求唯一性和身份标志。为了解决这个问题,在 Kubernetes 1.7 中
1527
1573
我们针对 StatefulSet API 对象引入了 ` .spec.podManagementPolicy ` 。
0 commit comments