45 lines
2.7 KiB
Markdown
45 lines
2.7 KiB
Markdown
---
|
||
vssueId: 44
|
||
layout: LearningLayout
|
||
description: 本文描述了 Kubernetes StatefulSet 的部署和伸缩
|
||
---
|
||
|
||
# StatefulSet 的部署和伸缩
|
||
|
||
[返回 StatefulSet](./)
|
||
|
||
## 部署和伸缩 StatefulSet 时的执行顺序
|
||
|
||
* 在创建一个副本数为 N 的 StatefulSet 时,其 Pod 将被按 {0 ... N-1} 的顺序逐个创建
|
||
* 在删除一个副本数为 N 的 StatefulSet (或其中所有的 Pod)时,其 Pod 将按照相反的顺序(即 {N-1 ... 0})终止和删除
|
||
* 在对 StatefulSet 执行扩容(scale up)操作时,新增 Pod 所有的前序 Pod 必须处于 Running(运行)和 Ready(就绪)的状态
|
||
* 终止和删除 StatefulSet 中的某一个 Pod 时,该 Pod 所有的后序 Pod 必须全部已终止
|
||
|
||
StatefulSet 中 `pod.spec.terminationGracePeriodSeconds` 不能为 0。具体原因请参考 [force deleting StatefulSet Pods](https://kubernetes.io/docs/tasks/run-application/force-delete-stateful-set-pod/)
|
||
|
||
[创建 StatefulSet](./basics.html) 例子中的 nginx StatefulSet 被创建时:
|
||
* Pod web-0、web-1、web-2 将被按顺序部署
|
||
* web-0 处于 Running 和 Ready 状态之前,web-1 不会创建;web-1 处于 Running 和 Ready 状态之前,web-2 不会创建
|
||
* 如果 web-1 已处于 Running 和 Ready 的状态,web-2 尚未创建,此时 web-0 发生了故障,则在 web-0 成功重启并达到 Running 和 Ready 的状态之前,web-2 不会创建
|
||
* 如果用户对这个 StatefulSet 执行缩容(scale down)操作,将其副本数调整为 1,则:
|
||
* web-2 将被首先终止;在 web-2 已终止并删除之后,才开始终止 web-1
|
||
* 假设在 web-2 终止并删除之后,web-1 终止之前,此时 web-0 出现故障,则,在 web-0 重新回到 Running 和 Ready 的状态之前,kubernetes 将不会终止 web-1
|
||
|
||
## Pod 管理策略
|
||
|
||
在 Kubernetes 1.7 及其后续版本中,可以为 StatefulSet 设定 `.spec.podManagementPolicy` 字段<Badge text="Kuboard 暂不支持" type="warn"/>,以便您可以继续使用 StatefulSet 唯一 ID 的特性,但禁用其有序创建和销毁 Pod 的特性。该字段的取值如下:
|
||
|
||
* **OrderedReady**
|
||
|
||
OrderedReady 是 `.spec.podManagementPlicy` 的默认值。其对 Pod 的管理方式已经在 [部署和伸缩 StatefulSet 时的执行顺序](./scaling.html#部署和伸缩-statefulset-时的执行顺序) 详细描述
|
||
|
||
* **Parallel**
|
||
|
||
`.spec.podManagementPlicy` 的取值为 Parallel,则 StatefulSet Controller 将同时并行地创建或终止其所有的 Pod。此时 StatefulSet Controller 将不会逐个创建 Pod,等待 Pod 进入 Running 和 Ready 状态之后再创建下一个 Pod,也不会逐个终止 Pod。
|
||
|
||
::: tip
|
||
此选项只影响到伸缩(scale up/scale down)操作。更新操作不受影响。
|
||
:::
|
||
|
||
[返回 StatefulSet](./)
|