关于StatefulSet
1.StatefulSet 为每个 Pod 副本创建了一个 DNS 域名,这个域名的格式为:
1 | $(podname).(headless servername) |
也就意味着服务间是通过Pod域名来通信而非 Pod IP,因为当Pod所在Node发生故障时,Pod会被飘移到其它 Node 上,Pod IP 会发生变化,但是 Pod 域名不会有变化。
2.缩容一个statefulset会最先删除最高索引值的实例(要把一个statefulset从两个实例扩容到三个实例,那么新实例的索引值就会是2,现有实例使用索引值为0和1)。
3.像statefulset创建pod一样,statefulset也需要创建持久卷声明。所以一个statefulset可以拥有一个或多个卷声明模板,这些持久卷声明会在创建pod前创建出来,绑定到一个pod实例上。
![[title]](/2021/06/15/%E5%85%B3%E4%BA%8EStatefulSet/pv.png)
statefulset缩容时只会删除pod。不会删除持久卷声明(当一个声明被删除后,与之绑定的持久卷就会被回收和删除)
![[title]](/2021/06/15/%E5%85%B3%E4%BA%8EStatefulSet/delete_pvc.png)
在部署一个statefulset之前,需要创建一个用于在有状态的pod之间提供网络标识的headless Service。clusterIP为none,标记了它是一个headless Service
![[title]](/2021/06/15/%E5%85%B3%E4%BA%8EStatefulSet/headless.png)
statefulset会在第一个pod就绪后才创建第二个pod副本,因为状态明确的集群应用对同时有两个集群成员启动引起的竞争情况是非常敏感的。所以依次启动每个成员是比较安全可靠的,特定的有状态应用集群在两个或多个集群成员同事启动所引起的竞态条件是非常敏感的,所以在每个成员完全启动后再启动剩下的会更加安全。
![[title]](/2021/06/15/%E5%85%B3%E4%BA%8EStatefulSet/%E9%87%8D%E6%96%B0%E8%B0%83%E5%BA%A6.png)