K8S中运行的服务可分为三类:无状态服务、普通有状态服务和有状态集群服务。接下来将逐一探讨K8S如何支持这三类服务的运行与管理。
1、 在Kubernetes中运行的服务可划分为三类:无状态服务、普通有状态服务和有状态集群服务。接下来将逐一介绍K8S如何支持和管理这三类服务的运行与部署。
2、 在Kubernetes中,无状态服务通过Replication Controller(RC)或更新的Replica Set来确保服务实例的指定数量。当某个Pod因故障意外终止时,RC会立即依据该Pod的模板创建一个新的实例进行替换。由于服务本身无状态,新创建的Pod与原Pod在功能和配置上完全一致,能够无缝承接原有任务。然而,Pod重建后其IP地址通常会发生变化,这给服务调用方带来了访问不稳定的问题。为解决这一问题,Kubernetes引入了Service机制。Service作为稳定的网络入口,可关联后端多个Pod实例,通过负载均衡对外提供统一且可靠的访问地址,从而实现服务的高可用性与动态伸缩能力。
3、 与无状态服务不同,普通有状态服务需保存运行状态。Kubernetes通过Volume及Persistent Volume构建的存储机制,为有状态服务提供稳定的数据持久化支持,确保状态在容器重启或迁移后依然保留,从而满足有状态应用的运行需求。
4、 有状态集群服务相较于普通有状态服务,增加了集群管理的复杂性。为应对这一挑战,Kubernetes设计了一套以Pet Set为核心的新机制,简化了此类服务的部署与运维。该方案利用Init Container完成集群初始化配置,通过Headless Service确保各成员间网络标识的稳定性,借助动态存储供给实现存储资源的灵活扩展,从而支持集群的弹性扩容。最终,Pet Set统一管理所有实例,保证每个成员拥有唯一的、持久的标识与存储,全面提升有状态集群在Kubernetes环境中的可控性与可靠性。
5、 运行有状态的集群服务需解决两大难题:状态存储与集群管理。首先关注状态存储问题。Kubernetes提供了一套基于Volume插件的存储机制,借助该机制,能够有效实现应用及服务运行过程中所需状态的持久化保存,保障数据不丢失。
6、 K8S存储体系由低到高可分为三层:基础卷、持久化卷和动态存储供给,逐层提升存储管理的灵活性与自动化水平。
7、 普通卷
8、 最基础的普通Volume为单节点类型,类似于Docker存储卷,采用Pod所在K8S节点的本地文件目录进行数据存储,仅限该节点访问使用。
9、 第二种类型为跨节点存储卷,它不依赖于特定的Kubernetes节点,而是独立存在,与节点解耦。存储集群与K8s集群各自独立运行,互不影响,形成两个分离的集群体系。
10、 在Kubernetes中,跨节点的存储卷应用广泛。当现有存储方案无法满足需求时,可自行开发Volume插件,只需实现Volume.go中定义的接口即可。作为存储设备厂商,若希望产品兼容运行在Kubernetes上的容器应用,开发专用的Volume插件是实现集成的有效途径。这种方式灵活扩展了系统的存储能力,便于与容器环境深度融合。
11、 它与普通卷有何不同?
12、 普通Volume与使用它的Pod之间存在静态绑定关系,需在Pod配置文件中同时定义所使用的Volume。Volume依附于Pod而存在,无法独立创建,也不作为单独的Kubernetes资源对象存在,其生命周期与Pod紧密关联。
13、 持久卷(PV)是Kubernetes中的一种资源对象,可独立创建。它并不直接与Pod关联,而是通过持久卷声明(PVC)实现动态绑定。在Pod的配置中指定PVC,系统会根据Pod的需求自动寻找并绑定符合条件的PV,从而实现存储的灵活分配与使用。这种方式实现了存储资源的解耦与动态管理,提升了存储使用的便捷性与效率。
14、 PV支持三种访问模式
15、 第一种为ReadWriteOnce,支持读写操作,但仅允许被一个Pod单独挂载使用。
16、 第二种为只读多挂载模式,允许多个Pod以只读方式同时挂载同一存储卷。
17、 第三种是ReadWriteMany,指该存储能够以读写模式被多个Pod同时挂载使用。并非所有存储类型都支持这种访问方式,尤其是共享访问,目前可用的实现较少,较为常见的是NFS。在PVC与PV进行绑定时,通常依据两个主要条件:存储容量大小和访问模式,二者需完全匹配才能成功绑定。
18、 前面提到PV与普通Volume的区别在于动态绑定,接下来我们具体了解这一过程的实现方式。
19、 PV的生命周期始于创建阶段,创建方式分为静态与动态两种。静态创建指由管理员预先手动建立多个PV,形成一个可用的PV资源池,供后续PVC进行绑定使用。动态创建则是通过Storage Class对象触发,当PVC提出存储需求时,存储系统根据其要求自动创建相应的PV,实现按需分配,提升资源管理的灵活性与效率。
20、 创建PV后其状态为Available,等待与PVC进行绑定。
21、 当PV与PVC绑定后,其状态变为已绑定,随后可被配置了对应PVC的Pod调用使用。
22、 Pod使用完毕后释放PV,PV状态随之变为Released。
23、 当PV的状态变为Released后,系统将依据预设的回收策略执行相应操作。目前共有三种策略:Retain、Delete和Recycle。采用Retain策略时,系统不会进行任何处理,原始数据将被保留,需由用户手动清理数据并删除PV。若设置为Delete策略,系统将自动删除该PV及其内部所有数据,资源将被彻底清除。而选择Recycle策略时,系统会先清空PV中的数据,随后将其状态重置为Available,使其重新可用于新的PVC绑定,实现资源的循环利用。不同策略适用于不同场景,用户可根据实际需求进行选择,以实现存储资源的有效管理与复用。
24、 在实际应用中,PV的创建与使用者往往不同。典型场景是:管理员预先建立PV资源池,开发人员在部署Pod时定义对应的PVC,其中声明所需的存储容量和访问方式,系统会自动从PV池中寻找匹配项,将最合适的PV与PVC绑定,供Pod使用,实现存储资源的动态分配与高效管理。
25、 在介绍PV生命周期时曾指出,PV的供给分为静态与动态两种。动态供给通过StorageClass实现,这是一种新兴的存储分配机制,能够按需自动创建存储资源,提升管理效率与灵活性。
26、 使用StorageClass的优势在于,不仅能由存储系统自动创建卷,减轻管理员负担,还能将不同类型的存储进行抽象封装,供PVC灵活选择。此前,PVC绑定PV仅依赖存储容量和访问模式两个条件,选择受限。引入StorageClass后,相当于新增了一个绑定维度,使存储分配更加精细和智能化,提升了资源匹配的灵活性与效率,更好地满足多样化的应用需求。
27、 例如,这里配置了两个StorageClass,均基于谷歌存储系统,但类型不同:一个采用普通磁盘,命名为slow;另一个采用SSD硬盘,命名为fast,用于满足不同性能需求的应用场景。
28、 在PVC配置中,除了设置大小和访问模式外,还通过注解指定存储类名为fast,从而确保该PVC绑定到SSD存储而非普通磁盘,满足对高性能存储的需求。
29、 至此,Kubernetes存储体系已全面介绍完毕。总体来看,主要有两类存储卷:普通Volume与持久化卷(Persistent Volume)。普通Volume在Pod定义时直接声明,生命周期与Pod绑定;而Persistent Volume则通过PersistentVolumeClaim进行动态绑定,实现存储与Pod的解耦。PV既可由管理员手动创建,也可借助StorageClass实现自动化动态供给,根据需求自动创建底层存储资源,提升管理效率与灵活性,满足不同应用场景下的持久化存储需求。
