美文网首页
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