StatefulSet 理解
核心要点
要 StatefulSet 控制器,需要一个无头服务clusterIP: None
,可以为有状态服务提供 4 个特性
- 稳定的网络标识
- 稳定的持久化存储
- 有序的扩容,Pod 副本数量将从 0 ~ N-1 有序部署,第 i 个 Pod 要想部署成功,比如要前 i-1 个 Pod 处于 Running 的状态
- 有序的缩容,Pod 副本数量将从 N-1 ~ 0 有序缩容,第 i 个 Pod 要想被回收,必须要等到从 i+1 到 N-1 的 Pod 都被回收
有序的扩缩容
所有 StatefulSet 控制器创建的 Pod 都会按照序号从小到大扩容和从大到小缩容,如果过程中,之前创建或回收的 Pod 失败,则不会继续进行相应的扩容或缩容,必须要等到那个有问题的 Pod 状态为 Running 或者成功回收
稳定的网络标识
因为 Pod 的名称 ${podname}-{N} 是固定的,所以集群内部的 dns 插件,可以为这些 pod 提供稳定的域名解析,即使 Pod 回收后的重建,如:
web-0.nginx.default.svc.cluster.local
web-0.nginx
稳定的网络存储
也是因为 Pod 名称固定,所以对于 PVC 绑定的 PV,如果因为 Pod 删除后重建,还能够自动关联相同名称的 Pod
其他要点
spec.updateStrategy.rollingUpdate.maxUnavailable
[1.24 alpha](default 1)该字段用来控制更新期间最大不可用的 Pod 数量,默认为 1,可以是具体数字,可以是百分数10%
,但是不能为 0spec.minReadySeconds
(单位:s,default: 0)最短就绪时间,可以根据自己的应用适当设置,否则也有可能会导致 Pod 无限等待,因为还有*Probe
和容器启动“hook”等手段检测 Container 是否就绪- 如果 Pod 模版配置无法进入
Running
状态或Ready
状态,需要管理员强制删除的时候,安全的做法是先将replicas=0
副本数设置为 0,然后在执行强制删除,等到修复完毕 Pod 模版的时候,在更新replica