StatefulSet 理解


核心要点

要 StatefulSet 控制器,需要一个无头服务clusterIP: None,可以为有状态服务提供 4 个特性

  1. 稳定的网络标识
  2. 稳定的持久化存储
  3. 有序的扩容,Pod 副本数量将从 0 ~ N-1 有序部署,第 i 个 Pod 要想部署成功,比如要前 i-1 个 Pod 处于 Running 的状态
  4. 有序的缩容,Pod 副本数量将从 N-1 ~ 0 有序缩容,第 i 个 Pod 要想被回收,必须要等到从 i+1 到 N-1 的 Pod 都被回收

有序的扩缩容

sts-ordered-pod

所有 StatefulSet 控制器创建的 Pod 都会按照序号从小到大扩容和从大到小缩容,如果过程中,之前创建或回收的 Pod 失败,则不会继续进行相应的扩容或缩容,必须要等到那个有问题的 Pod 状态为 Running 或者成功回收

稳定的网络标识

sts-stable-domain

因为 Pod 的名称 ${podname}-{N} 是固定的,所以集群内部的 dns 插件,可以为这些 pod 提供稳定的域名解析,即使 Pod 回收后的重建,如:

  1. web-0.nginx.default.svc.cluster.local
  2. web-0.nginx

稳定的网络存储

sts-stable-volume

也是因为 Pod 名称固定,所以对于 PVC 绑定的 PV,如果因为 Pod 删除后重建,还能够自动关联相同名称的 Pod

其他要点

  1. spec.updateStrategy.rollingUpdate.maxUnavailable [1.24 alpha](default 1)该字段用来控制更新期间最大不可用的 Pod 数量,默认为 1,可以是具体数字,可以是百分数10%,但是不能为 0
  2. spec.minReadySeconds(单位:s,default: 0)最短就绪时间,可以根据自己的应用适当设置,否则也有可能会导致 Pod 无限等待,因为还有*Probe和容器启动“hook”等手段检测 Container 是否就绪
  3. 如果 Pod 模版配置无法进入Running状态或Ready状态,需要管理员强制删除的时候,安全的做法是先将replicas=0副本数设置为 0,然后在执行强制删除,等到修复完毕 Pod 模版的时候,在更新replica