再也不为底层发愁:用“租房模型”秒懂 Kubernetes 的 PV 与 PVC

如果你刚接触 Kubernetes,在搞定了 Pod 和 Deployment 后,往往会一头撞死在“持久化存储”的墙上。

在传统的单机时代,我们要存数据,直接把宿主机的目录挂载(Volume 映射)进容器就行了。但在 K8s 这种到处漂移的分布式集群里,如果 Pod 挂了,被重新调度到另一台机器上,它原本写在本地硬盘上的数据就全丢了。

为了解决这个问题,K8s 引入了网络存储(如 NFS、Ceph、阿里云云盘等)。但是,如果让写业务代码的程序员去关心底层挂载的是 Ceph 还是阿里云盘,还要写一堆复杂的连接配置,这就太反人类了。

于是,K8s 架构师们大笔一挥,发明了两个伟大的抽象概念:PVPVC

今天,我们不扯枯燥的官方文档,直接用“租房模型”让你秒懂这套机制。

🏠 角色一:PV (PersistentVolume) —— 待出租的房子

PV 就是集群里的真实存储资源。 在我们的故事里,你可以把集群的运维管理员想象成“房东”或“开发商”。 房东手里有一大块地(比如一个 1TB 的网络存储集群),他把这些地划分成了一个个不同规格的房子(PV),并在 K8s 里登记:

  • 1号房 (PV-1):50平米(容量 50Gi),精装修,只能单人入住(访问模式:ReadWriteOnce)。
  • 2号房 (PV-2):200平米(容量 200Gi),毛坯房,可以多人合租(访问模式:ReadWriteMany)。

记住:PV 包含了所有关于底层的技术细节(比如 NFS 的 IP 地址在哪),它是真正干活的物理资源。

📝 角色二:PVC (PersistentVolumeClaim) —— 租房需求单

PVC 就是开发者对存储的申请声明。

现在轮到开发人员(租客)出场了。开发人员不需要知道房子是怎么盖的,也不关心房东是谁。他只需要写一张“租房需求单”(PVC)交给系统:

“K8s 管家你好,我的程序(Pod)现在需要一块盘,要求:容量至少 100Gi,支持多人同时读写(ReadWriteMany)。请尽快给我安排!”

在这个阶段,PVC 里绝对不会出现任何底层存储的配置信息,它只描述“我要什么”。

🤝 核心动作:Binding(签合同匹配)

当 K8s 收到开发者的 PVC 需求单后,系统内部的控制器(相当于房产中介)就会立刻拿着单子去 PV 资源池里匹配。

中介的匹配逻辑很简单:

  1. 容量够不够? (要 100Gi,50Gi 的 PV-1 直接淘汰)。
  2. 模式对不对? (要多人合租,满足条件的只有 PV-2)。

一旦找到合适的 PV(比如 PV-2),中介就会把这个 PVC 和 PV 绑定(Bound)在一起。相当于租客和这套房子签了独家合同。

最后,开发人员只需要在自己的 Pod 配置里写上一句:“我要住进这个 PVC 里”。Pod 启动时,K8s 就会自动把背后的 PV-2 挂载给容器。


🚀 终极进化:StorageClass (全自动的房地产中介)

讲到这里,你可能会发现一个 Bug: 如果每次开发提需求(创建 PVC),都需要运维提前去手动建房子(创建 PV),这在有着成千上万个应用的大厂里,运维岂不是要累死?

为了解决这个痛点,K8s 引入了 StorageClass(存储类)

StorageClass 就像是一个高度自动化的房地产公司中介系统。有了它之后,运维再也不用手动建 PV 了。

现在的流程变成了这样:

  1. 运维配置好一个 StorageClass(比如对接了阿里云盘 API 的程序)。
  2. 开发提交 PVC(要求 500Gi 空间,指定使用这个 StorageClass)。
  3. StorageClass 收到 PVC 后,直接调用阿里云的 API,自动去买一块 500Gi 的云盘,并自动生成一个 PV 与之绑定!

这就实现了真正的“按需分配,动态供应(Dynamic Provisioning)”。


💡 核心总结 (Takeaways)

为什么要搞这么复杂的架构?核心目的只有一个:解耦。

  1. 运维只管底层:配置好 NFS、Ceph 或者 StorageClass,保证“房源”充足。
  2. 开发只管业务:提交 PVC,按需索取,根本不需要懂存储是怎么搭建的。
  3. 跨云无缝迁移:你的应用的 YAML 文件里只有 PVC。当你把应用从阿里云迁移到腾讯云时,哪怕底层的存储技术全变了,你的 YAML 代码一行都不用改!只要新集群里有匹配的 PV 资源,应用瞬间就能跑起来。
这就是 Kubernetes 架构的艺术:通过增加一层抽象,来屏蔽下层所有的脏活累活。 下次再写持久化存储的 YAML 时,先分清你是“房东”还是“租客”,思路瞬间就清晰了!

阅读更多

Service 到底把流量发给了谁?解密 K8s 隐藏的功臣:Endpoint

在 Kubernetes 的日常操作中,你一定遇到过这样令人抓狂的场景: 你部署了一个 Nginx 的 Pod,状态是 Running;你又为它创建了一个 Service,IP 也分配了。一切看起来都很完美,但是当你用 curl 去访问这个 Service 时,得到的却是无尽的等待(Timeout)或者连接拒绝(Connection Refused)。 “我的 Pod 活得好好的,Service 也建了,流量到底死在哪个环节了?” 今天,我们就来揭开 K8s 网络中这个最容易被忽视的隐藏功臣——Endpoint 的神秘面纱。弄懂了它,你将掌握 K8s 内部网络排错的终极密码。 ☎️ 通俗类比:客服热线与接线员 在传统的认知里,很多人以为 K8s 的网络拓扑是这样的: 外部流量 ->

By GFrank

K8s 零信任实战:如何用 NetworkPolicy 拦截集群内的“非法访问”?

在很多人的潜意识里,Kubernetes 内部是一个绝对安全的“乌托邦”:只要把服务部署到了集群里,不暴露 NodePort 或者 Ingress,外部黑客就打不进来,内部服务也是绝对安全的。 但现实往往很骨感。Kubernetes 的默认网络模型是“扁平且全开放”的。 这意味着什么?这意味着如果你的集群里运行着一个电商系统和一个内部财务系统,只要它们在同一个集群网络下,电商系统里的任意一个微服务,都可以畅通无阻地 ping 通财务系统里的核心数据库!一旦某个边缘微服务存在漏洞被拿下,攻击者就能以此为跳板,在集群内部横向移动(Lateral Movement)。 今天,我们就来实战演练一把:如何打破这种“全连通”的默认状态,用 NetworkPolicy(网络策略) 给核心服务穿上防弹衣。 🔪 场景重现:合法的 API 与非法的“黑客” 假设我们在 auth-space 命名空间下,运行着一个极其重要的数据库服务 mysql(带有标签 db=mysql)

By GFrank
鄂ICP备2026019394号-1