Kubernetes(k8s)-StatefulSet介绍

一文读懂StatefulSet以及实践攻略 本文详细介绍Kubernetes中的StatefulSet概念和实际应用。文章通过比喻区分了有状态和无状态应用,并对比了StatefulSet与Deployment的不同之处。此外,还展示了StatefulSet的具体工作机制及其适用场景,包括数据库、分布式系统等。通过部署Redis集群的实际案例,演示了如何创建和管理StatefulSet,创建Headless Service、扩缩容及滚动更新等操作。通过本文,读者可以全面掌握StatefulSet的使用技巧,有效管理有状态应用。 阅读详情

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

前面讲的无论是deployment还是DaemonSet,而且deployment还是通过控制ReplicaSets来实现,而DaemonSet比并没有采用额外的控制器,他们总体都还算是无状态的,但是实际上有些业务里面是有数据的,并且里面还有标识符来标识该pod,比如数据库mysql,中间件zookeeper等,今天我们再一如另外一个控制器:StatefulSet,简称sts。

StatefulSet 是 Kubernetes 中专门用于管理有状态应用的工作负载 API 对象。与 Deployment 和 DaemonSet 不同,StatefulSet 提供了额外的功能来确保应用程序的状态和持久性,特别适用于需要稳定身份、持久存储以及有序部署的应用程序。

核心特性

稳定的网络标识:每个 Pod 都有一个唯一的、基于 DNS 的网络标识符(如 web-0.nginx.default.svc.cluster.local),即使 Pod 重启或重新调度,其标识符也不会改变。这对于需要相互之间进行通信的有状态应用非常重要。

有序且稳定的部署和扩展:StatefulSet 确保 Pod 按照顺序创建,并且在删除时也按照顺序进行。例如,在扩展时会先创建 web-0,然后是 web-1,以此类推;而在缩容时则相反。这有助于简化备份、恢复等操作。

持久存储:StatefulSet 支持为每个 Pod 分配独立的持久卷声明(PersistentVolumeClaim, PVC)。即使 Pod 被删除并重新创建,其数据仍然保留,并且新 Pod 会挂载到相同的持久卷上。这意味着每个 Pod 都有自己的持久存储,不会与其他 Pod 共享。

自动化的更新策略:提供了滚动更新和回滚的能力,但相比 Deployment 更加保守,默认情况下不会同时更新所有 Pod,以减少对服务的影响。您可以配置 Partition 来控制哪些 Pod 参与更新,哪些保持不变。

稳定的身份:每个 Pod 在 StatefulSet 中都有一个稳定的身份,包括名称和主机名,这使得它们在网络中可以被可靠地识别和访问。Pod 名称遵循格式 <statefulset-name>-<ordinal>,其中 ordinal 是从 0 开始的整数。

头等公民的服务发现:Kubernetes 为 StatefulSet 创建的每个 Pod 自动生成 Headless Service(无头服务),允许客户端通过 DNS 查询找到这些 Pod。您还可以为 StatefulSet 配置常规的 ClusterIP 类型服务,以便外部访问。

升级策略

支持多种更新策略,如 RollingUpdate(默认)和 OnDelete。RollingUpdate 会在后台逐步替换旧版本的 Pod,而 OnDelete 则只会在手动删除 Pod 后创建新的 Pod。

案例

由于这里我们还没有讲解服务(service)和pv&pvc,所以我们这里的案例是不涉及pvc和svc,只涉及sts的pod名字和标识符。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-statefulset
spec:
  serviceName: "nonexistent" # 必须指定 serviceName,但可以指向不存在的服务
  replicas: 3 # 运行三个副本
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 192.168.31.43:5000/nginx:latest
        ports:
        - containerPort: 80
          name: web

图片

如果是deployment,pod的名字是deployment名字-rs名字-随机字符,而sts的名字则是statefulset名字-固定编号(0,1,2,3)。

真实的sts,比如一个zk集群,集群之间的访问地址是不能改变的,所以这里的svc就会涉及到无头服务,常规的服务是一个服务对应后端多个pod,而这个无头无法则是一个服务对应一个后端固定pod,一个sts会产生多个服务地址,当然这里我们还讲解,所以这里只作为一个提示。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

kubernetes(k8s):使用statefulset部署mysql主从集群 官网地址 文章目录1. statefullset部署mysql主从集群的原理(1)从以下的 YAML 配置文件创建 ConfigMap(2)从以下 YAML 配置文件创建服务(3)最后,从以下 YAML 配置文件创建 StatefulSet pod 1. statefullset部署mysql主从集群的原理 运行一个有状态的应用程序 mysql-0是master mysql-1和mysql-2是两个备份 当mysql写的时候,找headless service中的mysql-0.mysql;当mysql读的 阅读详情

相关推荐

[Kubernetes]5. k8s集群StatefulSet详解,以及数据持久化(SC PV PVC)

k8s集群StatefulSet详解,以及数据持久化(SC PV PVC),借助腾讯云容器服务实现数据持久化操作,借助本地磁盘实现数据持久化操作

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 1837

五、K8S-StatefulSet(STS有状态服务)

RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的,而StatefulSet是管理所有有状态的服务,比如MySQL、MongoDB集群等。StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识(hostname),还必须要用到共享存储。

爱吃西红柿的博客 1732

深入k8skubernetesStatefulSet控制器及源码分析

然后我们可以启动一个一次性的pod用 nslookup 命令,解析一下 Pod 对应的 Headless Service:$ kubectl run -i --tty --image busybox:1.28.4 dns-test --restart=Never --rm /bin/sh$ nslookup web-0.nginxServer: 10.68.0.2Address 1: 10.68.0.2 kube-dns.kube-system.svc.cluster.localName:

2401_84046677的博客 993

k8s实践(13)--有状态服务StatefulSet详解

最近项目搭建基于StatefulSet创建常驻pod的GPU虚机平台,项目接近尾声,在此顺便做了个总结,温故而知新,而不是走马观花,浅尝辄止懂些概念。 一、k8s集群的服务分类 在K8S运行的服务,从简单到复杂可以分成三类:无状态服务、普通有状态服务和有状态集群服务。下面分别来看K8S是如何运行这三类服务的。 1、无状态服务(Stateless Service): 1)定义:是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。 2)随意扩容和缩

黄规速博客:学如逆水行舟,不进则退 9284

k8sStatefulSet详解

本篇是基于k8s-v1.15.0版本。 1、介绍 RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态的集合,管理所有有状态的服务,比如MySQL、MongoDB集群等。 StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识

最美dee时光的博客 6万+

Kubernetes 笔记(13)— 有状态的应用 StatefulSet、实现 StatefulSet 的数据持久化

有状态应用 statefulset 的定义、使用和数据持久化

wohu1104的专栏 3577

kubernetes/k8s概念】k8s statefulset 部署 zookeeper

参考: https://kubernetes.io/docs/tutorials/stateful-application/zookeeper/

zhonglinzhang 7696

K8SKubernetes-StatefulSet

selector:app: nginxmetadata:name: webspec:selector:app: nginxtemplate:metadata:labels:app: nginxspec:name: web然后我们创建这个service和statefulsetStatefulSet给它所管理的所有的Pod的名字进行了编号,编号规则是:-;并且这些编号都是从0开始累加,与StatefulSet的每个Pod实例一一对应;这些Pod的创建也是严格按照编号顺序进行的。

2401_84048161的博客 890

K8SKubernetes 中的 Deployment、DaemonSet、StatefulSet

本文对比分析了Kubernetes中三种核心控制器:Deployment、DaemonSet和StatefulSet。Deployment适用于无状态应用,支持滚动升级和自动scale;DaemonSet确保每个节点运行一个Pod,适合日志采集等系统级任务;StatefulSet为有状态应用提供稳定ID、网络标识和持久化存储。文章从定义场景、工作机制、优缺点、源码逻辑和运维建议五个维度展开对比,并总结三者适用场景及常见误区。其中,Deployment最简单灵活,DaemonSet适合节点级服务,Statef

NeoLshu的博客 1774

kubernetes(k8s) 配置nfs动态卷实现StatefulSet的持久化存储

概述 我们知道,平时kubernetes在部署无状态服务的时候,并不需要太多考虑持久化存储的事情,直接通过volume挂载网络存储,比如常见的nfs就能实现文件共享存储。 但是如果在有状态服务中,你就会需要很多的问题,比如:当你部署一些集群服务的时候: 1. 不可以用共享存储,因为每个服务的数据都不能相同。 2. 不可以直接用node的本地路径进行挂载,因为pod的随机性,...

夏冬丶王阳旭 5421

K8SKubernetes 中有状态的资源对象——StatefulSet

现在基本上很多服务中的应用都是有状态的,比如MySQL数据库、Redis等,因为其中的数据在不断地变化,所以这些应用每个时刻都处于一个不同的状态。或者一个系统中存在多个不同的应用,这些应用存在一定的依赖关系。例如一个博客服务,该服务中包含了Redis缓存和MySQL数据库,我们在启动时需要先启动 MySQL数据库,Redis缓存,再去启动博客应用。Kubernetes 未这种存在状态的应用专门设计了一种资源对象,就是 `StatefulSet`。

Transient_的博客 1507

K8s】专题四(4):Kubernetes 控制器之 StatefulSet

Kubernetes 专题 - 控制器之 StatefulSet

运维、实施交付领域知识交流 1733

(k8s)kubernetes中的StatefulSet

StatefulSet 是用来管理有状态应用的工作负载 API 对象。StatefulSet 用来管理某 Pod 集合的部署和扩缩, 并为这些 Pod 提供持久存储和持久标识符。Kubernetes StatefulSet是一种用于运行有状态应用的控制器。StatefulSet是一个有序的、可标识的Pod组,并且每个Pod都有一个独特的标识符。这使得StatefulSet能够管理有状态应用程序,例如数据库或队列服务,这些应用程序需要稳定的网络标识符或持久性存储,并且需要有序的、逐个更新的部署方式。

Richardlygo的博客 940

K8SKubernetes-StatefulSet(1)

由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档还有更多面试复习笔记分享如下《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!" />由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档[外链图片转存中…(img-nScK6ZP5-1713397895549)]还有更多面试复习笔记分享如下。

2401_84048034的博客 853

kubernetesk8sStatefulSet 和 Deployment 区别及选择方式

访问方式: Compare Deployment & StatefulSet 类型 特性 Deployment StatefulSet 是否暴露到外网 可以 一般不 请求面向的对象 serviceName 指定pod的域名 灵活性 只能通过service/serviceIp访问到k8...

nickDaDa的博客 3万+

K8SKubernetes-StatefulSet(2)

各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!避免影响阅读体验,下面我就大概概括了整理了[外链图片转存中…(img-74z02NE6-1713529628000)][外链图片转存中…(img-CKUYwZwD-1713529628001)][外链图片转存中…(img-NMux9Y6q-1713529628002)]

2301_81749759的博客 897

k8sstatefulset方式部署zookeeper集群

k8sstatefulset方式部署zookeeper集群 参考 k8s官网zookeeper集群的部署,数据挂着方式改成通过本地方式创建的pv; https://kubernetes.io/docs/tutorials/stateful-application/zookeeper/ 1、zookeeper镜像 镜像使用 k8s.gcr.io/kubernetes-zookeeper:1....

jacklife的博客 9988
上一篇: Kubernetes(k8s)-DaemonSet介绍
下一篇: Kubernetes(k8s)-ConfigMap介绍
dessler
博客等级 码龄20年 3056粉丝 434原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值