美文网首页
StatefulSet

StatefulSet

作者: 会倒立的香飘飘 | 来源:发表于2021-04-06 09:42 被阅读0次

    简介

    StatefulSet是为了解决有状态服务的问题设置的之中资源(Deployment,RepliacSet是为无状态服务设计的)
    但是这里可能有能说mysql是有状态服务吧,但是我使用的资源是deployment类型,mysql的data数据通过pv的凡事存储第三方文件系统中,能解决mysql数据存储的问题。
    是的,如果你的mysql是单节点使用deployment类型确实可以解决数据存储问题但是如果你的有状态服务是集群,节点之间有主备或者主从之分,但是每个节点分片存储的情况下deployment则不适合这种场景,因为deployment不是在保证pod的有序性,集群通常需要主节点先启动,从节点咋加入集群,StatefulSet则可以保证,其次deployment资源的pod内的pvc是共享存储的。而statefulset下的pod内的pvc不是共享存储的,每个pod拥有独立的存储空间,可以满足分片存储需求,实现分片存储的需求的前提是statefulset可以保证pod重新调度后哈时候能访问到相同的持久化数据
    一般使用与statefulset的常用服务:redis es mogodb 这些集群

    statefulset适用场景

    稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
    稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
    有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
    有序收缩,有序删除(即从N-1到0)

    statefulset由以下几部分组成:

    用于定义网络标志(DNS domain)的Headless Service
    用于创建PersistentVolumes的volumeClaimTemplates
    定义具体应用的StatefulSet

    创建StatefullSet

    创建statefulset需要自己准备好创建的pv

    [root@k8s-master ~]# cat statefulset.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp
      labels:
        app: myapp
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: myapp
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      serviceName: "myapp"
      replicas: 3
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          containers:
          - name: myapp
            image: ikubernetes/myapp:v1
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: www
              mountPath: /usr/share/myapp/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 2Gi
    
    
    查看sts
    [root@k8s-master ~]# kubectl get sts
    NAME   READY   AGE
    web    3/3     5m26s
    [root@k8s-master ~]# kubectl get pods 
    NAME    READY   STATUS    RESTARTS   AGE
    web-0   1/1     Running   0          5m38s
    web-1   1/1     Running   0          5m34s
    web-2   1/1     Running   0          5m32s
    [root@k8s-master ~]# kubectl get pvc 
    NAME        STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    www-web-0   Bound    pv002    2Gi        RWO,RWX                       5m49s
    www-web-1   Bound    pv001    2Gi        RWO,RWX                       5m45s
    www-web-2   Bound    pv004    2Gi        RWO,RWX                       5m43s
    [root@k8s-master ~]# kubectl get pv
    NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
    pv001   2Gi        RWO,RWX        Retain           Bound       default/www-web-1                           5m59s
    pv002   2Gi        RWO,RWX        Retain           Bound       default/www-web-0                           5m59s
    pv003   10Gi       RWO,RWX        Retain           Available                                               5m59s
    pv004   2Gi        RWO,RWX        Retain           Bound       default/www-web-2                           5m59s
    pv005   20Gi       RWO,RWX        Retain           Available                                               5m59s
    
    
    扩容
    [root@k8s-master ~]# kubectl scale statefulset web  --replicas=5
    

    查看

    [root@k8s-master ~]# kubectl get pods 
    NAME    READY   STATUS    RESTARTS   AGE
    web-0   1/1     Running   0          10m
    web-1   1/1     Running   0          10m
    web-2   1/1     Running   0          10m
    web-3   1/1     Running   0          11s
    web-4   1/1     Running   0          7s
    [root@k8s-master ~]# kubectl get pvc
    NAME        STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    www-web-0   Bound    pv002    2Gi        RWO,RWX                       12m
    www-web-1   Bound    pv001    2Gi        RWO,RWX                       12m
    www-web-2   Bound    pv004    2Gi        RWO,RWX                       12m
    www-web-3   Bound    pv003    10Gi       RWO,RWX                       99s
    www-web-4   Bound    pv005    20Gi       RWO,RWX                       95s
    
    
    缩容
    [root@k8s-master ~]# kubectl patch sts web -p '{"spec":{"replicas": 2}}'
    statefulset.apps/web patched
    [root@k8s-master ~]# kubectl get pods
    NAME    READY   STATUS    RESTARTS   AGE
    web-0   1/1     Running   0          30m
    web-1   1/1     Running   0          30m
    
    
    更新策略

    Kubernetes 1.7 版本的 StatefulSet 控制器支持自动更新。更新策略由 StatefulSet API Object 的spec.updateStrategy 字段决定。这个特性能够用来更新一个 StatefulSet 中的 Pod 的 container images,resource requests,以及 limits,labels 和 annotations。RollingUpdate滚动更新是 StatefulSets 默认策略。

    使用RollingUpdate中的partition进行分段更新

    你可以使用 RollingUpdate 更新策略的 partition 参数来分段更新一个 StatefulSet
    分段的更新将会使 StatefulSet 中的其余所有 Pod 保持当前版本的同时仅允许改变 StatefulSet 的 .spec.template

    默认partition是0

    [root@k8s-master ~]# kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":4}}}}'
    statefulset.apps/web patched
    
    

    使用set image 修改镜像也可以使用patch

    [root@k8s-master ~]# kubectl set image sts/web myapp=ikubernetes/myapp:v2
    statefulset.apps/web image updated
    

    查看镜像版本

    #控制器层
    [root@k8s-master ~]# kubectl get sts -o wide
    NAME   READY   AGE   CONTAINERS   IMAGES
    web    5/5     93m   myapp        ikubernetes/myapp:v2
    #pod层
    [root@k8s-master ~]# kubectl get pods web-4 -oyaml|grep image
               f:image: {}
               f:imagePullPolicy: {}
     - image: ikubernetes/myapp:v2
       imagePullPolicy: IfNotPresent
       image: ikubernetes/myapp:v2
       imageID: docker-pullable://ikubernetes/myapp@sha256:85a2b81a62f09a414ea33b74fb8aa686ed9b168294b26b4c819df0be0712d358
    
    #最后一个pod的镜像版本已经升级
    #前面的pod都还升级
    [root@k8s-master ~]# kubectl get pods web-3 -oyaml|grep image
               f:image: {}
               f:imagePullPolicy: {}
     - image: ikubernetes/myapp:v1
       imagePullPolicy: IfNotPresent
       image: ikubernetes/myapp:v1
       imageID: docker-pullable://ikubernetes/myapp@sha256:9c3dc30b5219788b2b8a4b065f548b922a34479577befb54b03330999d30d513
    
    

    升级余下的pod,只需要把刚刚的partition字段改回即可

    [root@k8s-master ~]# kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":0}}}}'
    
    

    查看所有pod的镜像版本

    [root@k8s-master ~]# for p in 0 1 2 3 4; do kubectl get po web-$p --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}'; echo; done
    ikubernetes/myapp:v2
    ikubernetes/myapp:v2
    ikubernetes/myapp:v2
    ikubernetes/myapp:v2
    ikubernetes/myapp:v2
    
    使用RollingUpdate策略更新

    默认statefulset就是RollingUpdate策略

     [root@k8s-master ~]# kubectl set image sts web myapp=ikubernetes/myapp:v2
    statefulset.apps/web image updated
    [root@k8s-master ~]# kubectl get sts -o wide
    NAME   READY   AGE    CONTAINERS   IMAGES
    web    5/5     117m   myapp        ikubernetes/myapp:v2
    查看镜像版本
    [root@k8s-master ~]# for p in 0 1 2 3 4; do kubectl get po web-$p --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}'; echo; done
    ikubernetes/myapp:v2
    ikubernetes/myapp:v2
    ikubernetes/myapp:v2
    ikubernetes/myapp:v2
    ikubernetes/myapp:v2
    

    相关文章

      网友评论

          本文标题:StatefulSet

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