随着容器技术的发展, Kubernetes 成为了容器编排的主流平台。在 Kubernetes 中,Pod 是最小的调度单元,并且它们通常需要持久化存储来存储数据。因此,Kubernetes 提供了多种存储选项,其中 PV 和 PVC 是其中两个重要的组件。
什么是 PV 和 PVC?
PV(Persistent Volume)是由管理员创建的持久化存储卷,可以在整个 Kubernetes 集群中的 Pod 中使用。PV 可以是各种类型的存储介质,如 NFS、HostPath、GCEPersistentDisk 和 AWS EBS 等。管理员可以通过 Kubernetes API 或 YAML 文件来创建 PV。
PVC(Persistent Volume Claim)是一个声明,用于请求 PV。它提供了 Pod 所需的存储资源和属性。PVC 在其请求的大小和访问模式上指定了需要的存储资源。PVC 与 PV 是一对多的关系,因为多个 PVC 可以请求同一个 PV。PVC 通常由应用程序开发者创建,以请求所需的存储。
简而言之,PV 提供了实际的存储卷,PVC 是程序员请求 PV 的一个声明。
PV 和 PVC 的类型
静态 PV 和 PVC
静态 PV 和 PVC 是最常见的类型。管理员通过 Kubernetes API 或 YAML 文件创建静态 PV,开发者通过 Kubernetes API 或 YAML 文件来创建静态 PVC。管理员将 PV 分配给 PVC,然后将 PVC 分配给需要进行持久化存储的 Pod。
例如,创建一个静态 PV:
apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: storageClassName: mysql-pv capacity: storage: 2Gi accessModes: - ReadWriteOnce hostPath: path: /data/mysql
创建一个静态 PVC:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: storageClassName: mysql-pv accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
静态 PVC 通常需要显式分配给 Pod。
动态 PV 和 PVC
动态 PV 和 PVC 更高效、更灵活。当动态 PVC 被创建时,Kubernetes 控制器会尝试为其分配一个 PV。管理员要在 Kubernetes 中使用动态 PV 和 PVC,需要先安装支持动态存储卷的插件,例如 Ceph 和 NFS 等。
例如,使用 Ceph 存储后端来创建动态 PVC:
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: ceph-dynamic provisioner: ceph.com/rbd parameters: monitors: "10.0.0.1:6789" pool: kube adminId: admin adminSecretName: ceph-admin-secret adminSecretNamespace: default --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ceph-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: ceph-dynamic
使用动态 PVC, Pod 按需获取其所需的存储资源。
总结
Kubernetes 提供了多种存储选项,其中 PV 和 PVC 是最主要的两个。PV 提供实际的存储资源,PVC 是请求该存储资源的声明。Kubernetes 中有静态 PV 和 PVC 和动态 PV 和 PVC。静态 PV 和 PVC 是最常见的类型,动态 PV 和 PVC 更高效且更灵活。
示例代码
完整代码可在下面找到:
apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: storageClassName: mysql-pv capacity: storage: 2Gi accessModes: - ReadWriteOnce hostPath: path: /data/mysql --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: storageClassName: mysql-pv accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: ceph-dynamic provisioner: ceph.com/rbd parameters: monitors: "10.0.0.1:6789" pool: kube adminId: admin adminSecretName: ceph-admin-secret adminSecretNamespace: default --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ceph-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: ceph-dynamic
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a3c731add4f0e0ffbf0266