美文网首页
kubernetes资源对象之statefulset

kubernetes资源对象之statefulset

作者: 一舍 | 来源:发表于2020-04-23 10:37 被阅读0次

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

相关文章

网友评论

      本文标题:kubernetes资源对象之statefulset

      本文链接:https://www.haomeiwen.com/subject/rhdoihtx.html