【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解

这篇具有很好参考价值的文章主要介绍了【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、StatefulSet理论知识

官方中文参考文档

1、StatefulSet Pod控制器特性

StatefulSet(简写sts)也是K8S集群中的一种Pod资源管理器,与deployment Pod控制器不同的是,StatefulSet用于管理无状态程序,特性如下:

  • 稳定的网络标识符:管理的Pod都拥有一个稳定的网络标识符。可以通过网络标识符进行访问。
  • 有序部署和扩展:StatefulSet会按照指定的顺序逐个部署Pod,每个Pod都有一个唯一的序号,这个序号在整个生命周期中都不会改变。在扩展时,也会按照指定的顺序逐个增加Pod。
  • 稳定的存储:每个Pod都用一个独立的持久卷存储,比如NFS。
  • 有状态服务:StatefulSet适用于有状态的服务,例如数据库、缓存等,这些服务需要稳定的网络标识符和持久化存储。

总之,StatefulSet提供了一种可靠的、有序的、有状态的服务部署和扩展方式,适用于需要稳定网络标识符和持久化存储的有状态服务。

2、什么是有状态服务和无状态服务?

无状态服务则是指不需要持久化存储和状态的服务,例如Web服务器、API服务器等。这些服务可以在任何节点上运行,因为它们不需要在不同节点之间共享数据,也不需要在节点故障时进行快速恢复。无状态服务可以通过水平扩展来提高性能和可用性。

有状态服务是指需要持久化存储并且需要保持状态的服务,例如数据库、缓存等。这些服务需要在不同的节点之间保持数据同步,并且需要在节点故障时能够快速恢复。

3、Deployment和StatefulSet区别

Deployment和StatefulSet是Kubernetes中常用的两种控制器,它们的主要区别如下:

  • Deployment是用于管理无状态应用的控制器,而StatefulSet则是用于管理有状态应用的控制器。

  • Deployment可以创建多个Pod副本,这些Pod副本之间没有任何顺序关系,可以随意调度和替换。而StatefulSet创建的Pod副本有固定的顺序,每个Pod副本都有唯一的标识符,可以保证有状态应用的数据持久性和稳定性。

  • Deployment可以进行滚动更新,即在更新过程中保持应用的可用性。而StatefulSet的更新过程需要手动控制,需要先删除旧的Pod副本,再创建新的Pod副本,因此更新过程中会有一定的停机时间。

  • Deployment可以使用RollingUpdate策略进行滚动更新,而StatefulSet则可以使用OnDelete和RollingUpdate两种策略进行更新。

总之,Deployment适用于管理无状态应用,而StatefulSet适用于管理有状态应用。如果应用需要保证数据的持久性和稳定性,建议使用StatefulSet。

二、案例:StatefulSet资源实战演示

1、创建WEB站点并验证StatefulSet特点

第一步:创建名为 sts-web-svc 的SVC ,用于创建statefulset资源时需要关联service,YAML如下:

cat sts-web-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: sts-web-svc
spec:
  selector:
    app: web-nginx
  ports:
  - port: 80
    targetPort: 80
  clusterIP: None     # 设置无IP地址

创建 svc 资源:

kubectl apply -f sts-web-svc.yaml

查看创建的 svc 资源,如下图可以看到创建的svc并没有分配IP地址:

kubectl get svc sts-web-svc

【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解,# 3-Kubernetes容器编排,kubernetes,docker,运维,statefulset,POD有状态管理器

第二步:创建statefulset资源

cat sts-web.yaml 
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-web
  namespace: default
spec:
  serviceName: sts-web-svc  # 关联SVC资源
  replicas: 2               # 副本数
  selector:
    matchLabels:            # 关联具有app=web-nginx标签的Pod
      app: web-nginx
  volumeClaimTemplates:        # 卷申请模板 
  - metadata:
      name: www                # 卷申请模板名称
    spec:
      accessModes: ["ReadWriteOnce"] # 访问模式
      storageClassName: nfs          # 指定供应商,前提是需要存在此供应商
      resources:
        requests:
          storage: 1Gi               # 存储大小1G
  template:
    metadata:
      labels:
        app: web-nginx
    spec:
      containers:
      - name: web-nginx
        image: nginx:1.18.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www             # 指定卷申请模板名称
          mountPath: /usr/share/nginx/html
        startupProbe:           # 启动探测
          tcpSocket:
            port: 80

执行 YAML :

kubectl apply -f sts-web.yaml

第三步:特点测试

1、Pod都有一个唯一的序号:如下图Pod名字有序

kubectl get pods -l app=web-nginx -o wide

【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解,# 3-Kubernetes容器编排,kubernetes,docker,运维,statefulset,POD有状态管理器

删除 sts-web-0,Pod后自动创建出来的Pod名称不会改变

kubectl delete pod sts-web-0

【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解,# 3-Kubernetes容器编排,kubernetes,docker,运维,statefulset,POD有状态管理器

2、Pod独立持久卷存储:查看PVC,自动生成两个PVC,相互隔离

kubectl get pvc -l app=web-nginx
ls /data/nfs_pro|grep default-www-sts-web-*

【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解,# 3-Kubernetes容器编排,kubernetes,docker,运维,statefulset,POD有状态管理器

3、稳定的网络标识符:我们使用busybox运行Pod,nslookup进行解析

kubectl run busybox --image docker.io/library/busybox:1.28 --rm -it busybox -- sh

【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解,# 3-Kubernetes容器编排,kubernetes,docker,运维,statefulset,POD有状态管理器

2、StatefulSet滚动更新

滚动更新使用 spec.updateStrategy 字段定义,目前statefulset支持两种更新策略如下:

  • RollingUpdate:滚动更新
  • OnDelete:不会自动更新,手动删除Pod后进行更新

下面演示滚动更新:

第一步:创建并执行statefulset资源

cat web-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 80
  clusterIP: None

创建statefulset,使用nginx:1.18 镜像

cat web.yaml 
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: default
spec:
  serviceName: web
  replicas: 5   
  selector:
    matchLabels:           
      app: web
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 0 # 最多不可用Pod,0表示2个Pod可用 
      partition: 2      # 只更新序号大于等于partition值的Pod
  volumeClaimTemplates:       
  - metadata:
      name: web               
    spec:
      accessModes: ["ReadWriteOnce"] 
      storageClassName: nfs          
      resources:
        requests:
          storage: 1Gi               
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx:1.18.0    # 使用1.18.0版本镜像
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: web           
          mountPath: /usr/share/nginx/html

执行YAML文件

kubectl apply -f web-svc.yaml
kubectl apply -f web.yaml

第二步:更新使用 nginx:latest 镜像

【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解,# 3-Kubernetes容器编排,kubernetes,docker,运维,statefulset,POD有状态管理器

重新YAML 一下:

kubectl apply -f web.yaml

验证:由于我们partition: 2 所以Pod不会全部更新,只会更新序号大于2的Pod,包括2

【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解,# 3-Kubernetes容器编排,kubernetes,docker,运维,statefulset,POD有状态管理器文章来源地址https://www.toymoban.com/news/detail-546466.html

三、总结

  • statefulset管理的Pod名称是有序的,删除指定Pod后自动创建的Pod名称不会改变。
  • statefulset创建时必须指定server名称,如果server没有IP地址,则会对server进行DNS解析,找到对应的Pod域名。
  • statefulset具有volumeclaimtemplate卷管理模板,创建出来的Pod都具有独立卷,相互没有影响。
  • statefulset创建出来的Pod,拥有独立域名,我们在指定访问Pod资源时,可以使用域名指定,IP会发生改变,但是域名不会(域名组成:Pod名称svc名称.svc名称空间.svc.cluster.local)

到了这里,关于【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Kubernetes资源篇】Replicaset控制器入门实战详解

    官方中文参考文档: ReplicaSet是k8s中一种资源对象,简写 rs , 用于管理Pod副本数量和健康状态,在 spec.replicas 字段中可以定义Pod副本数量,ReplicaSet会始终保持Pod在指定数量 ,当发现Pod数量大于副本数量时,会移除多出的Pod,当发现Pod小于副本数量会自动创建Pod,使其始终维

    2024年02月09日
    浏览(43)
  • 学习笔记二十七:K8S控制器Statefulset入门到企业实战应用

    用于管理有状态应用程序的部署。与无状态应用程序不同,有状态应用程序在运行时通常要求稳定的网络标识和持久性存储。 有状态服务:StatefulSet是有状态的集合,管理有状态的服务,它所管理的Pod的名称不能随意变化。数据持久化的目录也是不一样,每一个Pod都有自己独

    2024年02月06日
    浏览(50)
  • 【kubernetes系列】kubernetes之计算资源管理

    在 Kubernetes 中,Node 提供资源,而 Pod 使用资源。其中资源分为计算(CPU、Memory、GPU)、存储(Disk、SSD)、网络(Network Bandwidth、IP、Ports)。这些资源提供了应用运行的基础,正确理解这些资源以及集群调度如何使用这些资源,对于大规模的 Kubernetes 集群来说至关重要,不仅

    2024年02月17日
    浏览(43)
  • Kubernetes StatefulSet之volumeClaimTemplates

    在 Kubernetes 中,StatefulSet 是用于管理有状态应用的控制器对象。它确保每个 Pod 都有唯一的标识符和稳定的网络标识,并按照顺序进行部署和终止。StatefulSet 还提供了一种方便的方式来管理这些有状态应用所需的持久化存储。 volumeClaimTemplates 是 StatefulSet 中的一个字段,它用于

    2024年02月15日
    浏览(51)
  • kubernetes Ingress资源管理

    k8s 对外服务之 Ingress //Ingress 简介 service的作用体现在两个方面,对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制;对集群外部,他类似负载均衡器,可以在集群内外部对pod进行访问。 在Kubernetes中,Pod的IP地址和service的

    2024年02月16日
    浏览(66)
  • 【云原生】Kubernetes工作负载-StatefulSet

    StatefulSet 是用来管理有状态应用的工作负载 API 对象 StatefulSet 用来管理某 Pod 集合的部署和扩缩, 并为这些 Pod 提供持久存储和持久标识符 和 Deployment 类似, StatefulSet 管理基于相同容器规约的一组 Pod。但和 Deployment 不同的是, StatefulSet 为它们的每个 Pod 维护了一个有粘性的

    2024年02月15日
    浏览(36)
  • 如何调整 Kubernetes StatefulSet 卷的大小

    Kubernetes StatefulSet用于在集群内部署有状态应用程序。StatefulSet 中的每个 Pod 都可以访问即使在重新调度后仍坚持使用的本地持久卷。这使得 Pod 能够维护与其集合中的邻居不同的单独状态。 不幸的是,这些卷有一个很大的限制:Kubernetes 没有提供从 StatefulSet 对象调整它们大小

    2024年02月07日
    浏览(75)
  • 基于 Kubernetes 部署 Zookeeper(StatefulSet方式)

    随着云原生化流行的大趋势,我们的基础组件也需要逐渐上Kubernetes了。Apache Zookeeper作为目前最流行的分布式协调组件,在我们的微服务架构中负责扮演注册中心的角色。 在Kubernetes中运行Zookeeper集群是很有意义的,可以利用其原生的弹性扩缩容、高可用特性。 先说下使用的

    2024年02月08日
    浏览(37)
  • Kubernetes·陈述式&声明式资源管理

    目录 k8s陈述资源管理方法的说明 陈述式资源管理方法 声明式资源管理方法 GUI式资源管理方法 kubectl命令行工具 的说明 查看版本信息 查看资源对象简写 查看集群信息 配置kubectl自动补全 node节点查看日志  k8s基本信息查看 查看 master 节点状态 查看命名空间 查看default命名空

    2024年02月06日
    浏览(33)
  • 【云原生 | Kubernetes 系列】项目实战 一文吃透 Docker Compose 文件转换成 Kubernetes 资源

    Kompose 是什么?它是个转换工具,可将 compose(即 Docker Compose)所组装的所有内容 转换成容器编排器(Kubernetes 或 OpenShift)可识别的形式。 其实有很多种方式安装 Kompose。这里只讲解如何从最新的 GitHub 发布页面下载二进制文件。 首先需要把 Docker Compose 带到 Kubernetes。 只需要

    2023年04月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包