简单说来,StatefulSet其实就是一种升级版的Deployment,大体工作原理如下
1.为每个Pod名字按顺序编号,按顺序启动
# kubectl get po -o wide -l app=nginx
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
web-0 1/1 Running 0 21s 10.244.0.44 vm-0-8-ubuntu <none>
web-1 1/1 Running 0 14s 10.244.0.45 vm-0-8-ubuntu <none>
删除重建的Pod会使用之前的一模一样的名字
2.通过HeadlessService为Pod编号,在DNS服务器中生成带有编号的DNS记录,从而可以达到通过Pod名字定位到相应的服务
pod-name>.<svc-name>.<namespace>.svc.cluster.local
实现了网络标识的稳定
3.为每个Pod绑定名称对应的PVC,规则如下
<PVC名字>-<StatefulSet名称>-<编号>
在Pod重建的时候会重新绑定上之前的PVC,因为PV和PVC不会被删除,数据还在,所以Statefulset的存储状态是稳定的
总的来说,StatefulSet实现了:1.保证网络标识的稳定 2.保证存储状态的稳定。适合用来部署有状态的应用,而Deloyment认为所有的Pod都是完全一样的,更适合用来操作无状态的应用