有状态应用
为什么要有StatefulSet,使用deployment+pv可以不可以?
单单就存储数据而言使可以的。但是有状态应用还有更复杂的要求,
多个实例的依赖关系、启动顺序,必须主备关系
外界的客户端也可能要使用固定的网络标识来访问实例,而且这些信息还必须要保证在 Pod 重启后不变。
所以才有了StatefulSet
和 DaemonSet 类似,StatefulSet 也可以看做是 Deployment 的一个特例,它也不能直接用 kubectl create 创建样板文件,但它的对象描述和 Deployment 差不多,你同样可以把 Deployment 适当修改一下,就变成了 StatefulSet 对象。
特点
StatefulSet 所管理的 Pod 不再是随机的名字了,而是有了顺序编号,从 0 开始分别被命名
域名:Service 发现这些 Pod 不是一般的应用,而是有状态应用,需要有稳定的网络标识,所以就会为 Pod 再多创建出一个新的域名,格式是“Pod 名. 服务名. 名字空间.svc.cluster.local”。当然,这个域名也可以简写成“Pod 名. 服务名”。这样在 StatefulSet 里的这两个 Pod 都有了各自的域名,也就是稳定的网络标识
Service 自己会有一个域名,格式是“对象名. 名字空间”,每个 Pod 也会有一个域名,形式是“IP 地址. 名字空间”。但因为 IP 地址不稳定,所以 Pod 的域名并不实用,一般我们会使用稳定的 Service 域名。
域名必须通过Service对象才能实现
Headless Service:Service 原本的目的是负载均衡,应该由它在 Pod 前面来转发流量,但是对 StatefulSet 来说,这项功能反而是不必要的,因为 Pod 已经有了稳定的域名,外界访问服务就不应该再通过 Service 这一层了。所以,从安全和节约系统资源的角度考虑,我们可以在 Service 里添加一个字段 clusterIP: None ,告诉 Kubernetes 不必再为这个对象分配 IP 地址。