欢迎来到站长天空!

其它服务器

当前位置: 主页 > 服务器 > 其它服务器

通过StatefulSet部署有状态服务应用实现方式

时间:2025-12-20 10:30:03|栏目:其它服务器|点击:

目录
  • 先总结后详解:
  • StatefulSet的基本概念:
  • 示例:定义一个StatefulSet资源
  • StatefulSet的扩容与缩容
    • StatefulSet扩容:
    • StatefulSet缩容:
  • StatefulSet更新策略
    • StatefulSet灰度发布
      • StatefulSet的级联删除和非级联删除

        先总结后详解:

        • 具有固定的网络标识,如主机名、域名等
        • 支持持久化存储
        • 可以按顺序部署和扩展
        • 可以按顺序终止和删除
        • 滚动升级也是按照一定顺序

        StatefulSet的基本概念:

        StatefulSet主要用于管理有状态的应用程序的工作负载的API对象。比如生产中的Elastic Search集群、MongoDB集群、Kafka集群、Reids集群、Zookeeper集群等。。。

        与Deployment相似的是,StatefulSet也同样管理着基本相同容器规范的Pod。不同的是,StatefulSet为每个Pod维护了一个粘性标识。

        这些Pod是根据相同的规范创建的,但是不可互换,每个Pod都有一个持久的标识符,在重新调度时也会保留,一般格式为StatefulSetName-Number。

        比如定义一个Redis-Sentinel的StatefulSet,指定三个副本,就会依次创建名为Redis-Sentinel-0、Redis-Sentinel-1、Redis-Sentinel-2的三个副本。而StatefulSet的Pod的Service一般使用Headless Service(无头服务)进行通信。

        Headless的格式为一般为:

        statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local
        
        • statefulSetName:StatefulSet的名称
        • {0…N-1}:名称后面的序号
        • serviceName:Headless Service的名称
        • namespace:服务所在的命名空间
        • cluster.local:Cluster Daemon(集群域)

        StatefulSet用于有以下一条或多条需求的应用程序:

        • 需要稳定的独一无二的网络标识符
        • 需要持久化数据
        • 需要有序的、优雅的部署和扩展
        • 需要有序的自动滚动更新

        如果都不需要,那应该使用Deployment部署。

        示例:定义一个StatefulSet资源

        创建一个nginx的StatefulSet作为示范:这个yaml启动两个副本,使用nginx镜像,注意service一定要存在。

        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:1.18.0
                ports:
                - containerPort: 80
                  name: web
        

        使用kubectl创建一下:可以看到service和statefulset副本都创建了

        [root@k8s-master01 ~]# kubectl create -f nginx-sts.yaml 
        service/nginx created
        statefulset.apps/web created
        

        查看Pod:可以看到副本的名称是按序号从0开始的

        [root@k8s-master01 ~]# kubectl get pod
        NAME      READY   STATUS    RESTARTS       AGE
        busybox   1/1     Running   17 (50m ago)   7d18h
        web-0     1/1     Running   0              74s
        web-1     1/1     Running   0              73s
        

        查看service:可以看到nginx的service是没有CLUSTER-IP的

        [root@k8s-master01 ~]# kubectl get svc
        NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
        kubernetes   ClusterIP   10.96.0.1            443/TCP   7d21h
        nginx        ClusterIP   None                 80/TCP    2m43s
        

        扩容副本:可以看到与deployment不同的是,新生成的Pod名称序号是有规律的

        [root@k8s-master01 ~]# kubectl scale --replicas=3 sts web 
        statefulset.apps/web scaled
        [root@k8s-master01 ~]# kubectl get pod
        NAME      READY   STATUS              RESTARTS       AGE
        busybox   1/1     Running             17 (55m ago)   7d18h
        web-0     1/1     Running             0              6m30s
        web-1     1/1     Running             0              6m29s
        web-2     0/1     ContainerCreating   0              28s
        

        测试访问一下是否可以通信:可以看到网络是通的,IP直接解析到172.18.195.18上,也就是Pod的IP而不用通过一层service代理。

        [root@k8s-master01 ~]# kubectl exec -ti busybox -- sh
        / # nslookup web-0.nginx
        Server:    10.96.0.10
        Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
        Name:      web-0.nginx
        Address 1: 172.18.195.18 web-0.nginx.default.svc.cluster.local
        / # ping web-0.nginx
        PING web-0.nginx (172.18.195.18): 56 data bytes
        64 bytes from 172.18.195.18: seq=0 ttl=62 time=1.020 ms
        64 bytes from 172.18.195.18: seq=1 ttl=62 time=0.860 ms
        [root@k8s-master01 ~]# kubectl get pod -o wide 
        NAME      READY   STATUS    RESTARTS       AGE     IP               NODE           NOMINATED NODE   READINESS GATES
        busybox   1/1     Running   18 (28s ago)   7d18h   172.27.14.193    k8s-node02                
        web-0     1/1     Running   0              11m     172.18.195.18    k8s-master03              
        web-1     1/1     Running   0              11m     172.25.92.78     k8s-master02              
        web-2     1/1     Running   0              5m9s    172.25.244.199   k8s-master01              
        

        StatefulSet的扩容与缩容

        StatefulSet扩容:

        扩容的时候会按照序号顺序依次创建,比如我有上图的三个web副本,我想扩容到五个,那么就会先创建web-3副本,只要web-3副本创建成功后才会创建web-4;如果web-3出现故障无法创建,那么后续任务将一直等待web-3的创建直到成功。

        StatefulSet缩容:

        缩容的时候与扩容相反,会从最后一个开始删除,按照web-4、web-3这样的顺序依次删除。

        StatefulSet更新策略

        支持两种更新策略:

        RollingUpdate:默认的更新策略为滚动更新,是从最后一个副本开始更新,成功后才会进行下一个副本,更新方式为先删除再创建。

        OnDelete:当把策略改为这个时,我们就需要先手动删除要更新的副本,才会触发副本的更新策略。

        StatefulSet灰度发布

        利用更新策略中的Partition参数进行简单的灰度发布。

        通过StatefulSet部署有状态服务应用实现方式

        StatefulSet的级联删除和非级联删除

        级联删除:删除StatefulSet时同时删除Pod,默认为级联删除

        [root@k8s-master01 ~]# kubectl delete sts web
        

        非级联删除:删除StatefulSet时不会删除Pod,注意此时再删除Pod的话就不会再重建了

        [root@k8s-master01 ~]# kubectl delete sts web --cascade=false
        

        以上就是通过StatefulSet部署有状态服务应用实现方式的详细内容,更多关于StatefulSet部署有状态服务的资料请关注其它相关文章!

        上一篇:基于docker 部署canvas-lms的详细步骤

        栏    目:其它服务器

        下一篇:Kubernetes特别属性的标签Label的强大作用

        本文标题:通过StatefulSet部署有状态服务应用实现方式

        本文地址:https://zz.feitang.co/server/32182.html

        广告投放 | 联系我们 | 版权申明

        申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

        如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

        联系QQ:257218569 | 邮箱:257218569@qq.com

        Copyright © 2018-2025 站长天空 版权所有 Powered by EyouCms冀ICP备14023439号