pod-6

核心要点:pv的accessModes字段和pvc的accessModes不匹配,他们是子集关系。题目给出的pv是once而实际应用的pvc则是many,这肯定是不符合要求的。

PVC 的 accessModes 必须是 PV 的 accessModes 的子集
例如:
PV 有 ReadWriteOnce 和 ReadOnlyMany
PVC 可以请求 ReadWriteOnce 或 ReadOnlyMany
但如果 PVC 请求 ReadWriteMany(而 PV 不支持),则会绑定失败。
StorageClass 的干预
如果 PVC 未指定 accessModes,某些 StorageClass 可能会提供默认值,但显式声明是最佳实践。

还有个知识点就是sc自动在pod的节点创建对应的pv目录,cka中用到的则是一个叫local-path的开源sc会自动在pod所在节点自动创建。使用以下命令即可。

#拉取一个开源的sc部署,实现自动创建目录
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.24/deploy/local-path-storage.yaml

在pvc的资源清单里指定就行。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: local-path  # 使用这个 SC
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

如果只是想让 Kubernetes 自动管理存储(比如自动创建目录、绑定 PV/PVC),直接安装一个现成的 CSI Driver 或 Provisioner 就行,不需要自己从头写代码。


📌 一句话总结

“Provisioner” 或 “CSI Driver” 就是现成的工具,安装后就能让 Kubernetes 自动管理存储(比如自动创建目录、动态分配 PV)。


🚀 3 种现成方案(按推荐顺序)

1️⃣ 直接使用 local-path(最简单,适合测试)

适用场景:单节点存储、CKA 考试、快速测试
特点

  • 自动在 Pod 所在节点创建目录(如 /opt/local-path-provisioner/pvc-xxx
  • 仅支持 ReadWriteOnce(不能多节点共享)
  • 删除 PVC 后数据会被清理(reclaimPolicy: Delete

安装方式

kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.24/deploy/local-path-storage.yaml

使用方式

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: local-path  # 使用这个 SC
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

2️⃣ 使用开源 CSI Driver(生产推荐)

适用场景:多节点共享存储、生产环境
推荐工具

工具 存储类型 特点
NFS Subdir External Provisioner NFS 自动在 NFS 服务器上创建子目录
TopoLVM 本地 LVM 动态管理本地磁盘
OpenEBS 本地/分布式 支持多副本、快照

示例(NFS Provisioner)

helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  --set nfs.server=192.168.1.100 \
  --set nfs.path=/mnt/nfs_share

生成的 StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-sc
provisioner: cluster.local/nfs-provisioner
parameters:
  archiveOnDelete: "false"

3️⃣ 云厂商的 CSI Driver(AWS/GCP/Azure)

适用场景:云环境(EBS、Azure Disk、Google Persistent Disk)
特点

  • 全托管,无需维护存储服务器
  • 自动扩容、快照、加密

示例(AWS EBS)

kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"

PVC 示例

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-pvc
spec:
  storageClassName: ebs-sc  # AWS EBS 的 StorageClass
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

🔧 如何选择?

场景 推荐方案
CKA 考试 / 本地测试 local-path
本地集群 + 共享存储 NFS Provisioner
云环境(AWS/GCP/Azure) 云厂商 CSI Driver
生产级本地存储 TopoLVM / OpenEBS

  1. “Provisioner” 就是现成的工具,安装后 Kubernetes 就能自动管理存储(动态创建 PV/目录)。
  2. 大多数情况不需要自己写代码,直接用开源方案(如 local-path、NFS Provisioner、云厂商 CSI)。
  3. 生产环境建议用 CSI Driver(如 AWS EBS CSI、TopoLVM),功能更完整。
posted on 2025-06-13 19:01  Leo-Yide  阅读(23)  评论(0)    收藏  举报