关于StatefulSet
-
匹配Pod name(网络标识)的模式为:(statefulSet名称)-序号,比如上面个的示例:web-0,web-1,web-2
-
StatefulSet为每个Pod副本创建了一个DNS域名,这个域名的格式为: $(podname).(headless server
name),也就是意味着服务间通过Pod域名通信而非Pod IP,因为当Pod所在Node发生故障时,Pod会漂移到其它Node上,Pod IP会发生变化,但是Pod域名不会有变化
例如:
进入volume-test中,ping web-1.nginx(statefulSet的svc名字),能ping通.删除web-1后重新生成Pod web-1,进入volume-test中再次ping web-1.nginx仍能ping通.
-
StatefulSet使用Headless服务来控制Pod的域名,这个域名的FQDN为:(servicename).(namespace).svc.cluster.local,其中,"cluster.local"指的是集群的域名keyi.
使用dig -t -A nginx.default.svc.cluster.local @10.244.0.24(core-dns的IP)
获得core-dns的IP:
显示对应关系:
-
根据volumeClaimTemplates,为每个pod创建一个PVC,PVC的命名规则匹配模式:(volumeClaimTemplates.name)-比如上面的volumeMounts.name=www,Pod name=web-[0-2],因此创建出来的PVC是www-web0,www-web1,www-web2
-
删除Pod不会删除其PVC,手动删除PVC将会自动删除pv
StatefulSet的启停顺序
- 有序部署:部署StatefulSet时,如果有多个Pod副本,它们会被顺序的创建(从0-N-1)并且,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态.
- 有序删除:当Pod被删除时,它们被终止的顺序都是N-1到0
- 有序扩展:当Pod执行扩展操作时,与部署一样,他前面的Pod必须都处于Running和Ready状态.
StatefulSet使用场景
- 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC实现.
- 稳定的网络标识符,即Pod重新调度后其PodName和HostName不变.
- 有序部署,有序扩展,基于init Containers来实现.
- 有序收缩
删除PV和PVC
1.kubectl delete -f statefulset.yaml
2.kubectl delete pvc --all
3.进入节点(node1) 删除/nfs目录下的所有文件
pv即可用了.