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

 更新时间:2022年03月18日 17:07:31   作者:、重明  
这篇文章主要为大家介绍了通过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    <none>        443/TCP   7d21h
nginx        ClusterIP   None         <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     <none>           <none>
web-0     1/1     Running   0              11m     172.18.195.18    k8s-master03   <none>           <none>
web-1     1/1     Running   0              11m     172.25.92.78     k8s-master02   <none>           <none>
web-2     1/1     Running   0              5m9s    172.25.244.199   k8s-master01   <none>           <none>

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时同时删除Pod,默认为级联删除

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

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

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

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

相关文章

  • 双至强cpu 32g内存服务器 做了阵列1更换一个坏的硬盘后,没做阵列

    双至强cpu 32g内存服务器 做了阵列1更换一个坏的硬盘后,没做阵列

    更换掉坏硬盘后,系统重新认出primary后,原来的主盘即失效,如果此时再将更换掉的旧盘插入系统就会造成,混乱,导致进不入系统,拨掉也无用
    2013-06-06
  • 服务器压力测试概念及方法(TPS/并发量)

    服务器压力测试概念及方法(TPS/并发量)

    本文详细讲解了服务器压力测试概念及方法(TPS/并发量),对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • DELL R710服务器做RAID5磁盘阵列图文教程

    DELL R710服务器做RAID5磁盘阵列图文教程

    这篇文章主要介绍了DELL R710服务器做RAID5磁盘阵列图文教程,需要的朋友可以参考下
    2014-08-08
  • Win2003 Server DHCP服务器安装图解教程

    Win2003 Server DHCP服务器安装图解教程

    为了节省IP地址资源,IP地址采用了DHCP自动分配方式
    2012-10-10
  • 分享几款linux下常见的vps控制面板

    分享几款linux下常见的vps控制面板

    VPS主机控制面板主要是用来控制和管理VPS服务器的,一般来说如果想要将VPS主机共享出来给多个人使用的话,我们就会采用类似于Cpanel、Virtualmin等主机控制面板。如果VPS主机只是一个人使用的话部落建议还是不要使用主机控制面板,以免带来不必要的安全隐患
    2017-07-07
  • 教你一招一键搭建zerotier planet服务器脚本

    教你一招一键搭建zerotier planet服务器脚本

    ZeroTier 是一个加密的虚拟骨干网,它的客户端和服务端都是开源且免费的,对于一般的用户,可以用它做内网穿透,将处于不同内网中的主机组成虚拟局域网,这篇文章给大家介绍一键搭建zerotier planet服务器脚本的相关知识,感兴趣的朋友一起看看吧
    2023-12-12
  • 护卫神 主机管理系统使用说明篇 系统设置

    护卫神 主机管理系统使用说明篇 系统设置

    护卫神·主机管理系统支持在Windows Server 2003/2008/2012,含32位和64位,直接开设配置WEB站、FTP站,以及SQL Server和MySQL,是您开设和管理虚拟主机的绝好帮手,但是对于新用户可能在使用上有一些困难,因此请仔细阅读如下说明文档
    2015-01-01
  • 外贸网站屏蔽中国IP访问的多种方法

    外贸网站屏蔽中国IP访问的多种方法

    这篇文章主要介绍了外贸网站屏蔽中国IP访问的多种方法,本文通过nginx、iptables、javascript三种方法实现,需要的朋友可以参考下
    2014-12-12
  • 阿里云Centos7安装svn与配置讲解

    阿里云Centos7安装svn与配置讲解

    今天小编就为大家分享一篇关于阿里云Centos7安装svn与配置讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • linux和windows互传文件的实现方案

    linux和windows互传文件的实现方案

    Windows和Linux上的文件互传(互相拷贝)一般常见的主要分为三种:1.基于FTP的方式 2.基于HTTP的方式 3.基于SSH协议的方式.今天我们来探讨的是ssh协议的方式
    2018-04-04

最新评论