云容器引擎 CCE-有状态负载(StatefulSet):有状态负载(StatefulSet)
有状态负载(StatefulSet)
Deployment控制器下的Pod都有个共同特点,那就是每个Pod除了名称和IP地址不同,其余完全相同。需要的时候,Deployment可以通过Pod模板创建新的Pod;不需要的时候,Deployment就可以删除任意一个Pod。
但是在某些场景下,这并不满足需求,比如有些分布式的场景,要求每个Pod都有自己单独的状态时,比如 分布式数据库 ,每个Pod要求有单独的存储,这时Deployment无法满足业务需求。
分布式有状态应用的特点主要是应用中每个部分的角色不同(即分工不同),比如数据库有主备、Pod之间有依赖,在Kubernetes中部署有状态应用对Pod有如下要求:
- Pod能够被别的Pod找到,要求Pod有固定的标识。
- 每个Pod有单独存储,Pod被删除恢复后,必须读取原来的数据,否则状态就会不一致。
Kubernetes提供了StatefulSet来解决这个问题,其具体如下:
- StatefulSet给每个Pod提供固定名称,Pod名称增加从0-N的固定后缀,Pod重新调度后Pod名称和HostName不变。
- StatefulSet通过Headless Service给每个Pod提供固定的访问 域名 。
- StatefulSet通过创建固定标识的PVC保证Pod重新调度后还是能访问到相同的持久化数据。