在 Kubernetes 中,可以将应用程序分为有状态服务( Stateful Service )和无状态服务( Stateless Service ):
无状态服务是指不依赖于任何特定的状态或数据的服务。 每个请求都可以独立处理,不需要维持特定的会话状态。 无状态服务可以在集群中的任何节点上运行,因为它们不依赖于特定的状态或数据存储。 常见的无状态服务包括 Web 服务器、API 服务等。
有状态服务是指依赖于特定的状态或数据的服务。 服务的状态和数据需要持久化存储,并且需要与特定的 Pod 绑定。 每个 Pod 实例通常都有一个唯一的标识符,例如 Pod 名称或索引,用于维护其状态和数据。 部署有状态服务时,通常需要使用 StatefulSet 控制器,以确保 Pod 的唯一性和有序性。 常见的有状态服务包括数据库服务、消息队列服务等。
对于 WEB 服务器,不是也需要访问一样的存储卷吗比如静态资源需要存储?为什么说 WEB 可以是无状态服务?
意思是不是在不考虑返回的情况下,比如 WEB 服务器,对于每个独立的请求都可以返回值,只不过如果没有存储静态文件的话,返回的值可能不一样。但是对于数据库来说,每一个请求都需要数据存储,在没有数据存储的情况下就不能返回了,所以说他是有状态的?
1
dode 2023-08-06 19:56:41 +08:00
一定范围内的小页面还是静态的,k8s 复制几份,没有写入,分别提供服务,不需要读取同一个地方
|
2
DdDddDlush OP @dode 首先先谢谢解答。如果我用的是 NFS 存储卷,那写入的地方是一样的吧,那在存储卷丢失的情况下也无法访问了。这个是不是因为是我自己的存储架构问题,实际上最好的情况是你说的那样,静态文件也是分布存储的,所以 WEB 是定义为无状态?
|
3
DdDddDlush OP @dode 但如果是分布式的存储,他更应该是有状态的吧?
|
4
seers 2023-08-06 20:10:29 +08:00 via Android
你标题是无头服务,正文咋又是有状态了
|
5
amon 2023-08-06 20:15:40 +08:00 1
可以理解为 无状态服务是随意重启的,比如前后端服务,
有状态服务是固定 IP 和存储,比如数据库、MQ 、缓存这种。 Web 服务静态资源一般也是容器内操作,要么是放 OSS 这种上面,不需要有状态。 |
6
DdDddDlush OP @seers 无头服务对应有状态应用,有头服务对应无状态服务。因为到时候用起来还是要定义服务,而定义服务要区分一下是否有状态来选择用哪一种控制器,不过确实有点歧义。应该直接问有无状态服务的。
|
7
DdDddDlush OP @amon 感觉这个理解是不错的,已感谢!
|
8
DdDddDlush OP @amon 再请教一个问题,关于有状态应用。有状态应用使用分布式存储吧?分布式存储下,Pod A 与 Pod B 对应 PV1 和 PV2 ,那么这个时候如果套用数据库的话,要怎么理解?数据库的存储分布式的话,PV1 是否和 PV2 可以简单理解为是相等的(会有很多更复杂的状态我清楚,比如分部署存储来提高性能等,简单来说的话我是不是可以这么理解?)
困惑点在于:有状态应用使用分布式存储的情况下,每个 Pod 使用不同的 PV ,也分别存储不同的数据。既然是无头服务,使用 DNS 来访问 POD ,那访问的 PV 都不一样了,获取到的数据不同(漂移或者幻觉)要怎么理解? |
9
seers 2023-08-06 21:28:17 +08:00
@DdDddDlush 你的理解太浅显了,有头无头和有状态无状态不是必然联系的,无状态一样可以无头,只是说有状态不需要服务的 SLB ,所以 StatefulSets 需要 Headless Service
|
10
dode 2023-08-06 21:31:37 +08:00
@DdDddDlush 这些页面是存储在容器镜像中的,用 nfs 后端存储,这些实例也会复制多份副本的,
一个通用业务数据库服务只能启动一个,如果不同业务系统访问不同数据库,数据库数据就混乱了,也没有事物技术了。 多个数据库服务之间可能会按照协议,配置,有主从、复制机制,单个节点故障也有不影响业务的能力,但是一个数据库集群中这些服务是有一个主节点的,从节点可以做一些满足业务的读、分析请求,节点实例之间不是逻辑上相等的。 有状态的应用使用分布式存储,是用于提供计算实例自动化故障恢复、迁移,维护能力的,一般不是让应用共享数据的 特殊的业务有同时挂载一个 nfs 目录的需求,k8s 也支持这个参数 |
11
DdDddDlush OP @seers #9 接受你的指教哈,我是看最佳实践是要这样子比较好。现在就是想象和理解一下 StatefulSets 对应不同的 PV 是怎么样一个场景。
|
12
DdDddDlush OP @dode #10 我再虚心学习一下,想理解的比较透彻一点,估计还是要实际自己去跑跑业务,才知道具体情况是怎么样的,脑补还是不好。
|
13
rrfeng 2023-08-06 21:59:28 +08:00 via Android 3
headless 和 stateful 是两个维度的故事…
前者指怎么暴露服务方式 后者指服务本身的数据性质 |
14
cheng6563 2023-08-07 02:16:12 +08:00
另外,k8s 内的 headless service 指的是类似未进行负载均衡的网络端口。跟你实际跑的服务是两回事。
|
15
tairan2006 2023-08-07 09:14:35 +08:00
有状态应用并不一定使用分布式存储…事实上数据库由于性能考虑,一般使用 LocalPV 。
有状态和无状态的区别仅仅是 k8s 调度策略的不同,事实上你如果想的话,把 nginx 部署成 sts 做测试也行… |
16
xudaxian520bsz 2023-08-07 09:42:45 +08:00
Kubernetes (简称 K8s )是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。Headless Service 是 K8s 中的一种服务类型,它与 StatefulSet 配合使用时,可以为每个 Pod 提供唯一的网络标识符和稳定的网络地址。这种组合在以下几个场景下特别有用:
有状态应用:StatefulSet 用于管理有状态应用的部署和扩展,而 Headless Service 则为每个 Pod 提供唯一的网络标识符和稳定的网络地址。这样,在有状态应用中,每个 Pod 可以通过自己的网络标识符和网络地址来进行通信,而不会因为 Pod 的重新调度或扩展而发生变化。这对于需要保持持久连接或状态的应用非常重要,例如数据库或分布式存储系统。 数据库集群:在数据库集群中,每个数据库实例通常都需要具有唯一的标识符和网络地址,以便其他实例可以通过网络进行通信。使用 StatefulSet 和 Headless Service 结合,可以为每个数据库实例分配唯一的网络标识符和网络地址,并确保这些标识符和地址在 Pod 的重新调度或扩展时保持不变。这样可以简化数据库集群的管理和维护,并提供更高的可靠性和可用性。 分布式存储系统:类似于数据库集群,分布式存储系统也需要为每个存储实例分配唯一的标识符和网络地址。使用 StatefulSet 和 Headless Service 结合,可以为每个存储实例提供唯一的网络标识符和网络地址,并确保这些标识符和地址在 Pod 的重新调度或扩展时保持不变。这样可以简化分布式存储系统的管理和维护,并提供更高的可靠性和可用性。 总之,K8s 的 Headless Service 和 StatefulSet 的结合应用场景主要是针对有状态应用、数据库集群和分布式存储系统等需要唯一网络标识符和稳定网络地址的场景。通过为每个 Pod 提供唯一的标识符和地址,可以简化应用的管理和维护,并提供更高的可靠性和可用性。 |
17
chana71 2023-08-07 10:01:14 +08:00
mysql 和 kafka 这些本质都是 replication system, 要有一个主,主从之间要复制,我**理解**除了读写的数据还有一部分状态是用来支持这个 replication system. 之前 v 友推荐过一个课 可以 google 下 6.824
|
18
gabon 2023-08-07 10:06:10 +08:00 via iPhone
headless 和 stateful 没关系啊,看进来一脸懵逼
|
19
DdDddDlush OP @xudaxian520bsz 拒绝 AI 哈。
|
20
gotosre 2023-08-16 19:47:32 +08:00 via iPhone
造得一手好词,,,有无头是 svc 上的,访问行为的问题,,,有头,就有 cluster ip ,流量 rr ,无头,也能访问,配合 sts 的字段,能通过域名访问特定 pod
|
21
DdDddDlush OP |
22
gotosre 2023-08-22 20:42:35 +08:00 via iPhone
@DdDddDlush 有头服务???
|