26|StatefulSet:怎么管理有状态的应用?
什么是有状态的应用
- 深入了解
- 翻译
- 解释
- 总结
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 - LorryPod负责服务,Job负责调度, Daemon/Deployment负责无状态部署,StatefulSet负责状态部署, Service负责四层访问(负载均衡、IP分配、域名访问),Ingress负责应用层(7层)访问(路由规则), PVC/PV负责可靠性存储。 K8s提供的解决方案基本就是代表了微服务部署的最佳实践了。
作者回复: great.
2023-02-01归属地:北京27 - 摊牌老师,既然statefulSet对象管理的pod可以直接通过域名指定来访问,那可不可以 不给statefulSet对象创建service
作者回复: 不行,域名必须通过Service对象才能实现,可以自己试试没有Service对象会怎么样。
2022-09-01归属地:上海36 - 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归属地:上海42 - 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