StatefulSet,有状态服务集合,管理所有有状态的服务,比如MySQL、Zookeeper、Hadoop等。
管理有状态服务
- 持久化存储
有状态的副本集都会用到持久化存储,对于分布式系统来讲,它的最大特点是数据是不一样的,各个节点不能使用同一存储卷,每个节点都要有自已的专用存储,所以,statefulset中的每个Pod都要自已的专有存储卷,且Pod 重新调度后还能访问到原来的持久化数据。statefulSet使用volumeClaimTemplate,为每个Pod生成不同的pvc,并绑定pv, 从而实现各pod有专用存储。删除Pod不会删除其pvc,手动删除pvc将自动释放pv。
- 唯一网络标志
作为pod的标识符,每一个Pod的名称在statefulset中是唯一的,要求必须有序 ,且pod重建后PodName 和 HostName保持不变。statefulset基于 Headless Service来实现 ,Headless Service没有 Cluster IP ,解析它的名称时返回该Headless Service对应的全部的Pod的Endpoint列表。
-
有序部署,有序扩展
Pod 名称是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依序进行。statefulset基于 init containers 来实现。
在kubernetes v1.7以后,允许通过
.spec.podManagementPolicy
修改Pod的排序策略- OrderedReady:默认设置,如果有多个Pod副本,它们会被顺序地创建(从0到N-1)并且,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态
- Parallel:如果有多个Pod副本,它们会被并行启动或终止,即在启动或终止另一个Pod之前不等待前一个Pod变为Running and Ready或完全终止。
-
有序收缩,有序删除
Pod 名称是有顺序的,在收缩的时候要依据定义的顺序依次依序进行。
StatefulSet中Pod 的 DNS 格式
StatefulSet 中每个 Pod 的 DNS 格式为 :
statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local
,其中
-
statefulSetName
为 StatefulSet 的名字 -
serviceName
为 Headless Service 的名字 -
0..N-1
为 Pod 所在的序号,从 0 开始到 N-1 -
namespace
为服务所在的 namespace,Headless Service 和 StatefulSet 必须在相同的 namespace -
.cluster.local
为 Cluster Domain
StatefulSet 中每个 Pod 的Hostname 格式为 :
statefulSetName-{0..N-1}
StatefulSet 中每个 Pod 的 PVC 格式为 :
根据volumeClaimTemplates,为每个Pod创建一个独立的pvc,pvc的命名格式为:volumeClaimTemplates.name-podName
Cluster Domain | Service (ns/name) | StatefulSet (ns/name) | StatefulSet Domain | Pod DNS | Pod Hostname | volumeClaimTemplates(ns/name) | PVC |
---|---|---|---|---|---|---|---|
cluster.local | default/nginx | default/web | nginx.default.svc.cluster.local | web-{0..N-1}.nginx.default.svc.cluster.local | web-{0..N-1} | default/www | www-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} | default/www | www-web-{0..N-1} |
部署示例
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
网友评论