Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

26|StatefulSet:怎么管理有状态的应用?

你好,我是 Chrono。
在中级篇里,我们学习了 Deployment 和 DaemonSet 两种 API 对象,它们是在 Kubernetes 集群里部署应用的重要工具,不过它们也有一个缺点,只能管理“无状态应用”(Stateless Application),不能管理“有状态应用”(Stateful Application)。
“有状态应用”的处理比较复杂,要考虑的事情很多,但是这些问题我们其实可以通过组合之前学过的 Deployment、Service、PersistentVolume 等对象来解决。
今天我们就来研究一下什么是“有状态应用”,然后看看 Kubernetes 为什么会设计一个新对象——StatefulSet 来专门管理“有状态应用”。

什么是有状态的应用

我们先从 PersistentVolume 谈起,它为 Kubernetes 带来了持久化存储的功能,能够让应用把数据存放在本地或者远程的磁盘上。
那么你有没有想过,持久化存储,对应用来说,究竟意味着什么呢?
有了持久化存储,应用就可以把一些运行时的关键数据落盘,相当于有了一份“保险”,如果 Pod 发生意外崩溃,也只不过像是按下了暂停键,等重启后挂载 Volume,再加载原数据就能够满血复活,恢复之前的“状态”继续运行。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kubernetes中的StatefulSet是专门用于管理有状态应用的API对象。它通过为Pod分配顺序编号和稳定的网络标识,解决了有状态应用的启动顺序、依赖关系和网络标识等问题。与Deployment相比,StatefulSet在管理有状态应用方面更加全面和长远。结合StorageClass、PersistentVolume和NFS的知识,可以为StatefulSet加上数据持久化功能,实现对“有状态应用”的管理。StatefulSet对象的“volumeClaimTemplates”字段可以直接定义PVC,让Pod实现数据持久化存储。文章还介绍了如何创建带持久化功能的“有状态应用”,并验证了持久化存储的有效性。总结了StatefulSet的YAML描述、Service对象的使用、访问方式以及数据持久化存储的实现方法。最后留下两个思考题,引发读者思考和讨论。 Kubernetes中的StatefulSet是专门用于管理有状态应用的API对象。它通过为Pod分配顺序编号和稳定的网络标识,解决了有状态应用的启动顺序、依赖关系和网络标识等问题。与Deployment相比,StatefulSet在管理有状态应用方面更加全面和长远。结合StorageClass、PersistentVolume和NFS的知识,可以为StatefulSet加上数据持久化功能,实现对“有状态应用”的管理。StatefulSet对象的“volumeClaimTemplates”字段可以直接定义PVC,让Pod实现数据持久化存储。文章还介绍了如何创建带持久化功能的“有状态应用”,并验证了持久化存储的有效性。总结了StatefulSet的YAML描述、Service对象的使用、访问方式以及数据持久化存储的实现方法。最后留下两个思考题,引发读者思考和讨论。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 入门实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(25)

  • 最新
  • 精选
  • YueShi
    好奇redis的主从,哨兵,cluster都是怎么在sts上实现的,打算抽个时间深入的学习一下。 btw,越学习越能理解到 老师讲的“云原生”的概念了

    作者回复: Redis的主从部署直接用StatefulSet来实现还是很麻烦的,这个可能用operator来做会比较简单。

    2022-08-22归属地:北京
    9
  • Lorry
    Pod负责服务,Job负责调度, Daemon/Deployment负责无状态部署,StatefulSet负责状态部署, Service负责四层访问(负载均衡、IP分配、域名访问),Ingress负责应用层(7层)访问(路由规则), PVC/PV负责可靠性存储。 K8s提供的解决方案基本就是代表了微服务部署的最佳实践了。

    作者回复: great.

    2023-02-01归属地:北京
    2
    7
  • 摊牌
    老师,既然statefulSet对象管理的pod可以直接通过域名指定来访问,那可不可以 不给statefulSet对象创建service

    作者回复: 不行,域名必须通过Service对象才能实现,可以自己试试没有Service对象会怎么样。

    2022-09-01归属地:上海
    3
    6
  • Bachue Zhou
    我感觉 statefulset 起到的作用相比于普通的 systemd 差不多,特别是对于数据库这种真正有状态的服务而言,实例运行的节点通常是固定的,因为对硬件的要求要比普通的节点高很多,且在生产环境不可能用任何基于网络的文件系统来存储数据库文件。由于节点固定,所以 ip 也就固定,没必要非用域名来访问,而且现在有些服务本来也实现了服务发现,客户端连接集群的任意实例都可以获取完整集群节点的 ip 就可以直连,改用域名反而不太直接,statefulset 也不能让主从配置或是sharding配置变得更方便。

    作者回复: StatefulSet的功能还是比较弱的,直接用还不是很方便,所以后来才出了operator等等,但StatefulSet无疑是基础。

    2022-11-18归属地:北京
    5
  • 摊牌
    有了 StatefulSet 提供的固定名字和启动顺序,应用还需要怎么做才能实现主从等依赖关系呢? 答:我理解是采用StatefulSet对象管理多个(2n+1)有状态pod的情形下,应该在有状态应用中基于pod的固定名字进行实例通信交互,比如redis集群中节点之间通过Gossip协议进行广播自身的状态信息,从而完成实例之间依赖关系,保证集群的可用性

    作者回复: good

    2022-09-01归属地:上海
    4
  • dao
    作业: 1. 这个应该具体应用具体设置吧。比如 Redis ,需要给 主、从 实例加载不同的 conf 。以我目前的 kube 知识我不知道如何给不同的副本使用不同的配置文件。我只能使用临时命令实现主从 kubectl exec -it redis-pv-sts-1 -- redis-cli replicaof redis-pv-sts-0.redis-svc 6379 。 2. 若不使用“volumeClaimTemplates”内嵌定义 PVC,那么可能的后果就是,多个副本挂载同一个网络存储设备,这可能会导致数据丢失。

    作者回复: 1. 用StatefulSet实现主从还是比较麻烦的,可以根据hostname,在镜像里编写脚本来启动不同的逻辑。 2.正确。

    2022-09-16归属地:北京
    3
  • 陈斯佳
    老师 能讲解一下什么是operator吗?

    作者回复: operator比较复杂,可能在我们这个课里不会细讲了。

    2022-12-14归属地:上海
    2
  • 老师 求您个事 ,讲讲helm吧,迫切想学

    作者回复: 我对helm了解不是太深,简单讲讲倒是可以,但可能只是大概的介绍,有时间会写一篇。

    2022-12-09归属地:上海
    4
    2
  • rubys_
    在我的虚拟机上 ping redis-sts-1.redis-svc 失败,一种解决方案是,kubectl get pod -o wide -n kube-system 找到 coredns 的 pod,然后删除那两个 pod,比如 kubectl delete pod coredns-65c54cc984-qlkt9 -n kube-system。等待 k8s 重新创建 coredns 的 pod 就可以 ping 了

    作者回复: 有的时候coredns会有错误,可以删除重启,或者用rollout restart。

    2022-10-25归属地:上海
    2
  • 小宝
    “访问 StatefulSet 应该使用每个 Pod 的单独域名,形式是“Pod 名. 服务名”,不应该使用 Service 的负载均衡功能。” 请教老师,通常会在StatefulSet上创建一个Headless Service吧,作为pod的负载均衡。

    作者回复: good

    2022-08-23归属地:北京
    2
收起评论
显示
设置
留言
25
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部