在Kubernetes中,Persistent Volumes (PV)
和 Persistent Volume Claims (PVC)
是用于存储持久化数据的关键资源。它们提供了一种将存储资源抽象化并独立于Pod生命周期之外的方法。以下是使用 PV 和 PVC 的基本步骤和示例配置。
Persistent Volumes (PV)
- 定义:PV 是集群中的一块网络存储资源。它是一个单独的资源对象,可以被多个用户共享,并且与 Pod 生命周期无关。
- 生命周期:PV 可以预先创建好,然后由管理员手动配置,或者通过 StorageClass 动态创建。
- 类型:支持多种后端存储类型,如 NFS、iSCSI、GCE Persistent Disks、AWS EBS 等。
Persistent Volume Claims (PVC)
- 定义:PVC 是用户对存储的一种请求。PVC 会绑定到一个合适的 PV 上,从而为应用程序提供存储空间。
- 生命周期:PVC 可以动态绑定到现有的 PV 或者触发新的 PV 创建(如果使用了 StorageClass)。
- 使用:一旦 PVC 绑定了 PV,就可以被 Pod 使用来挂载存储卷。
示例配置
1. 定义 Persistent Volume (PV)
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath: # 这里使用 hostPath 作为示例,实际生产环境中通常不会使用这种方式
path: /data/example-pv
在这个例子中,我们定义了一个名为 example-pv
的 PV,容量为 10GB,访问模式为 ReadWriteOnce
(即只能被单个节点挂载为读写)。这里使用了 hostPath
作为存储后端,但在生产环境中更常见的做法是使用外部存储系统,如 NFS、GCE PD 或 AWS EBS。
2. 定义 Persistent Volume Claim (PVC)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
在这个 PVC 配置中,我们请求了 10GB 的存储空间,并指定了相同的访问模式 ReadWriteOnce
。Kubernetes 会尝试找到一个匹配这些要求的 PV 并进行绑定。
3. 在 Pod 中使用 PVC
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: example-pvc
在这个 Pod 配置中,我们将之前定义的 PVC example-pvc
挂载到了容器的 /usr/share/nginx/html
路径下。
应用配置
-
创建 PV:
kubectl apply -f pv.yaml
-
创建 PVC:
kubectl apply -f pvc.yaml
-
创建 Pod:
kubectl apply -f pod.yaml
动态 Provisioning
如果你不想预先创建 PV,而是希望根据需要自动创建存储资源,可以使用 StorageClass
和动态 Provisioning。
定义 StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs # 根据你的云提供商选择适当的 provisioner
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
- debug
volumeBindingMode: Immediate
使用 StorageClass 创建 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dynamic-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard
resources:
requests:
storage: 10Gi
当这个 PVC 被创建时,Kubernetes 会根据 StorageClass
自动创建一个 PV 来满足需求。
注意事项
- 存储类:确保你使用的存储类在集群中已经存在并且正确配置。
- 回收策略:PV 的回收策略决定了当 PVC 被删除时 PV 的处理方式。常见的策略有
Retain
(保留)、Delete
(删除)等。 - 权限:确保 Kubernetes 集群有足够的权限来创建和管理底层存储资源。
通过上述步骤,你可以有效地在 Kubernetes 中管理和使用持久化存储,以确保数据的安全性和持久性。