共计 922 个字符,预计需要花费 3 分钟才能阅读完成。
一、statefulset 介绍
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 域名不会有变化
删除 web-0 后查看:
- StatefulSet 使用 Headless 服务来控制 Pod 的域名,这个域名的 FQDN 为:(service name).(namespace).svc.cluster.local,其中,“cluster.local”指的是集群的域名
根据 volumeClaimTemplates,为每个 Pod 创建一个 pvc,pvc 的命名规则匹配模式:(volumeClaimTemplates.name)-(pod_name),比如上面的 volumeMounts.name=www,Podname=web-[0-2],因此创建出来的 PVC 是 www-web-0、www-web-1、www-web-2
删除 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 来实现。
有序收缩。