在 Kubernetes 中,更新应用程序时通常需要更新其运行时组件,例如容器映像。对于 Deployment 资源,可以使用 RollingUpdate 策略来控制更新的速率和失败的回滚。但是,对于 StatefulSet 资源,更新策略稍有不同,因为 StatefulSet 管理的 Pod 具有固定的网络标识符和存储卷。
概述
StatefulSet 资源的更新策略分为两种类型:
- RollingUpdate:与 Deployment 资源相同,按照一定的顺序逐个更新 Pod。
- OnDelete:只有当删除 StatefulSet 资源时,才会更新 Pod。
默认情况下,StatefulSet 使用 RollingUpdate 策略。可以通过 StatefulSet 的 spec.updateStrategy.type
字段来选择要使用的更新策略。可以将其设置为 RollingUpdate
或 OnDelete
,如下所示:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: example
spec:
selector:
matchLabels:
app: example
serviceName: example
replicas: 3
template:
metadata:
labels:
app: example
spec:
containers:
- name: app
image: example:latest
updateStrategy:
type: RollingUpdate # or OnDelete
如果选择 RollingUpdate 策略,则可以使用以下字段控制更新的速率和回滚的失败阈值:
spec.updateStrategy.rollingUpdate.partition
:控制一次更新中可以同时更新的 Pod 的最大数量。spec.updateStrategy.rollingUpdate.maxUnavailable
:在进行更新时,允许的不可用 Pod 的最大数量。例如,可以将其设置为50%
表示每次更新时只允许50%
的 Pod 不可用。spec.updateStrategy.rollingUpdate.maxSurge
:在进行更新时,允许超出期望 Pod 数量的最大数量。例如,可以将其设置为1
表示每次更新时允许多出一个 Pod。