statefulset区别于deployment有两个最重要的特性:有序性,固定性。
适用的场景
StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
稳定的、唯一的网络标识符
稳定的、持久的存储
有序的、优雅的部署和缩放
有序的、自动的滚动更新
限制
pod的持久化存储基于pvc和pv。
为保证数据安全,删除或者收缩statefulset并不会自动删除它关联的存储卷。
需要手动创建无头服务使pod的dns可解析。
删除 statefulset时,并不按照有序性执行,要求有序的话,可以在删除之前将 statefulset 缩放为 0。
默认pod管理策略(OrderedReady) 时使用滚动更新,有可能会有更新终止,需要人为修复的状况。
有序性:
每个pod都有一个序号
部署时和扩容时根据序号递增依次启动新pod
缩容时依次根据序号递减依次删除pod
固定标识
statefulset在创建pod的时候会为每个pod分配下面几个固定的标识。
固定网络标识
pod的名称和pod的主机名是根据statefulset的名称和当前pod的序号组成的:$(statefulset-name)-$(ordinal)。dns解析需要无头服务。
规则
Cluster Domain
Service (ns/name)
StatefulSet (ns/name)
StatefulSet Domain
Pod DNS
Pod Hostname
cluster.local
default/nginx
default/web
nginx.default.svc.cluster.local
web-{0..N-1}.nginx.default.svc.cluster.local
web-{0..N-1}
cluster.local
foo/nginx
foo/web
nginx.foo.svc.cluster.local
web-{0..N-1}.nginx.foo.svc.cluster.local
web-{0..N-1}
kube.local
foo/nginx
foo/web
nginx.foo.svc.kube.local
web-{0..N-1}.nginx.foo.svc.kube.local
web-{0..N-1}
固定存储
pvc名称规则:$(tpl-metadata.name)-$(podname)
pod标签
每个pod标签里会自动加一个 statefulset.kubernetes.io/pod-name 方便针对单个pod创建service。
pod管理策略
对于部署,扩缩容和更新时的并行度设置。
OrderedReady(依次)
Parallel(并行,只影响扩缩操作,对更新策略不生效)
更新策略
手动(需要手动删除pod)…
kubernetes基础 – 管理有状态服务
发布于