1. ReplicaSet(复制集)
特点:
- 确保Pod副本数量:ReplicaSet负责确保用户定义的Pod副本数量在集群中始终维持不变。如果副本数量少于预期,ReplicaSet会创建新的Pod;如果副本数量多于预期,则会删除多余的Pod。
- 基于标签选择器:ReplicaSet通过标签选择器(Label Selector)来跟踪和管理具有特定标签的Pod。
- 模板创建:ReplicaSet使用一个Pod模板来创建新的Pod。当需要增加副本数量时,ReplicaSet会根据这个模板来创建新的Pod实例。
优点:
- 高可用性:通过确保Pod副本数量的稳定,ReplicaSet提高了应用的高可用性。
- 简化管理:用户只需定义Pod的副本数量和标签选择器,ReplicaSet即可自动管理Pod的创建和删除,简化了应用的管理过程。
2. Deployment(无状态应用管理)
特点:
- 基于ReplicaSet:Deployment是建立在ReplicaSet之上的高级抽象,用于管理无状态应用。
- 声明式配置:Deployment支持声明式配置,用户只需描述期望的状态,Deployment会自动将实际状态调整到期望状态。
- 滚动更新和回滚:Deployment支持滚动更新功能,可以在不中断服务的情况下更新Pod的镜像或其他配置。同时,Deployment还支持版本回滚,可以在出现问题时快速恢复到之前的稳定版本。
优点:
- 增强的可管理性:与ReplicaSet相比,Deployment提供了更多的管理功能,如滚动更新和回滚等。
- 提升用户体验:通过简化更新和回滚流程,Deployment提升了用户体验,使得应用的运维更加便捷。
3. DaemonSet(守护进程集)
特点:
- 确保每个节点运行一个Pod副本:DaemonSet确保集群中的每个节点都运行一个Pod的副本,通常用于运行守护进程类任务,如日志收集、监控等。
- 节点选择:DaemonSet支持通过节点选择器(Node Selector)来指定Pod运行的节点。
优点:
- 系统级任务的自动化:DaemonSet能够自动在集群的每个节点上运行必要的守护进程类任务,减轻了管理员的负担。
- 提升集群的运维能力:通过确保关键系统级任务的稳定运行,DaemonSet提升了集群的运维能力和可靠性。
4. StatefulSet(有状态应用管理)
特点:
- 管理有状态应用:StatefulSet用于管理有状态应用,它提供了稳定的网络标识、存储和启动顺序等特性。
- 持久化存储:StatefulSet中的Pod可以挂载持久化存储卷(如PV/PVC),确保数据在Pod重启或重新调度后不会丢失。
- 有序部署和扩展:StatefulSet支持Pod的有序部署和扩展,确保应用按照预定的顺序启动和扩展。
优点:
- 支持有状态应用:StatefulSet填补了Kubernetes在有状态应用管理方面的空白,使得Kubernetes能够支持更广泛的应用场景。
- 提升应用的稳定性和可靠性:通过提供稳定的网络标识和持久化存储等特性,StatefulSet提升了有状态应用的稳定性和可靠性。
无状态应用于有状态应用
(1)无状态服务
特点:
1、数据方面:无状态服务不会在本地存储持久化数据,多个实例可以共享相同的持久化数据
2、结果方面:多个服务实例对于同一个用户请求的响应结果是完全一致的
3、关系方面:这种多服务实例之间是没有依赖关系
4、影响方面:在 k8s 控制器中动态启停无状态服务的 pod 并不会对其它的 pod 产生影响
5、示例方面:nginx 实例,tomcat 实例,web 应用
6、资源方面:相关的 k8s 资源有:Replicaset、ReplicationController、Deployment
7、创建方式:Deployment 被设计用来管理无状态服务的 pod
每个 pod 完全一致,原因如下:
- 无状态服务内的多个 Pod 创建的顺序是没有顺序的
- 无状态服务内的多个 Pod 的名称是随机的
- pod 被重新启动调度后,它的名称与 IP 都会发生变化
- 无状态服务内的多个 Pod 背后是共享存储的
8、扩缩容方式:随机缩容
由于是无状态服务,所以这些控制器创建的 pod序号都是随机值。并且在缩容也是随机,并不会明确缩容某一个 pod。因为所有实例得到的返回值都是一样,所以缩容任何一个 pod 都可以。
无状态服务不会在本地存储持久化数据,多个服务实例对于同一个用户请求的响应结果是完全·致的。这种多服务实例之间是没有依赖关系,比如 web 应用,在 k8s 控制器中动态启停无状态服务的 pod 并不会对其它的 pod 产生影响。
Deployment 被设计用来管理无状态服务的 pod,每个 pod 完全一致无状态服务内的多个 Pod 创建的顺序是没有顺序的。
无状态服务内的多个 Pod 的名称是随机的,pod 被重新启动调度后,它的名称与 IP 都会发生变化
无状态服务内的多个 Pod 背后是共享存储的。
(2)有状态服务
特点:
1、数据方面:有状态服务需要在本地存储持久化数据,典型的应用是分布式数据库
2、结果方面:实例之间,请求结果可能存在不一致
3、关系方面:分布式节点实例之间有依赖的拓扑关系,比如主从关系
4、影响方面:如果 K8S 停止分布式集群中任一实例 pod,就可能会导致数据丢失或者集群的 crash
5、示例方面:mysq1 数据库、kafka、zookeeper、Redis 主从架构
6、资源方面:statefulset
7、创建方式:statefulset 管理
statefu1 管理有状态的应用,Pod 有如下特征:
唯一性:每个 Pod 会被分配一个唯一序号,
顺序性:Pod 启动,更新,销毁是按顺序进行。
稳定的网络标识:Pod 主机名,DNS 地址不会随着Pod 被重新调度而发生变化,稳定的持久化存储:Pod 被重新调度后,仍然能挂载原有的 PV,从而保证了数据的完整性和一致性
无状态服务和有状态服务的比较:
无状态服务
服务不依赖自身的状态,实例的状态数据可以维护在内存中。
任何一个请求都可以被任意一个实例处理。
不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点。
在一个封闭的系统中,只存在一个数据闭环。
通常存在于单体架构的集群中。
有状态服务
服务本身依赖或者存在局部的状态数据,这些数据需要自身持久化或者可以通过其他节点恢复。
一个请求只能被某个节点(或者同等状态下的节点)处理。
存储状态数据,实例的拓展需要整个系统参与状态的迁移。
在一个封闭的系统中,存在多个数据闭环,需要考虑这些闭环的数据一致性问题。
通常存在于分布式架构中。