--- 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` 字段,以便您可以继续使用 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](./)