1、卷和持久卷的区别
1.1 两个不同的概念
一个K8S卷(Volume)是在Pod中用于存储数据的一种抽象概念。它不同于容器内部的文件系统,而是存在于Pod的生命周期内,并且可以被多个容器共享。K8S卷可以是空白的,也可以包含预定义的数据,例如配置文件、数据库文件等等。当Pod被删除时,K8S卷会随之被销毁。
相比之下,持久卷(Persistent Volume, PV)是Kubernetes上一种持久化存储资源的概念,在Pod中使用它们可以将数据持久化存储,即使Pod被删除后再次创建,这些数据仍然可以被访问到。持久卷可以独立于Pod创建和销毁,并且可以被多个Pod共享。持久卷与底层存储资源解耦,因此可以将应用程序与存储隔离开来。
因此,K8S卷和持久卷的主要区别在于它们在Pod的生命周期内是否保留数据。K8S卷只能在Pod的生命周期内使用,而持久卷则可以在多个Pod之间共享,并且可以在Pod销毁后继续存在。
1.2 用方法和功能上的不同
对于K8S卷,可以通过volumes字段在Pod中声明和使用它们。K8S卷不需要提前创建,而是在Pod创建时动态创建。K8S卷有多种类型可供选择,例如emptyDir、configMap、secret等。其中,emptyDir类型的卷只存在于Pod的生命周期内,configMap和secret类型的卷可以从配置文件或密钥中读取数据。
相比之下,持久卷需要提前在集群中创建,并且需要为其分配存储资源。可以通过PersistentVolumeClaim(PVC)来声明并使用持久卷。PVC是一个抽象概念,用于请求特定大小和访问模式的持久卷。一个PVC可以请求多个PV,但是一个PV只能被一个PVC所声明使用。持久卷可以与云存储、NFS、本地磁盘等不同类型的存储后端集成。
因此,K8S卷和持久卷都有自己的使用场景和优点。一般来说,如果你需要在Pod的生命周期内共享数据或者在容器之间传递数据,那么K8S卷是一个很好的选择;如果需要将数据持久化存储并跨多个Pod之间共享,在这种情况下,持久卷可能更适合。
2、进入主题:什么是PV和PVC?
PersistentVolume(PV)是 Kubernetes 集群中一块独立于 Pod 的持久化存储卷。它可以由集群管理员手动创建,并且在创建后就可以供 Pod 使用。PV 可以使用各种后端存储技术实现,例如本地存储、网络附加存储、云存储等。PV 与 Pod 的关系是一对多的,一个 PV 可以被多个 Pod 使用。
PersistentVolumeClaim(PVC)是 Kubernetes 集群中的一个资源对象,它用于声明需要使用 PersistentVolume 的 Pod。PVC 定义了 Pod 对 PV 的需求,例如大小、访问模式、存储类别等。当一个 PVC 被创建后,Kubernetes 会将其与满足其需求的 PV 进行绑定,使得 Pod 可以使用该 PV。一个 PVC 只能绑定一个 PV,但是一个 PV 可以被多个 PVC 绑定。
在实际应用中,通常先创建 PV,然后再根据需要创建 PVC。PV 和 PVC 的配置是分离的,这样可以让管理员更好地控制存储资源的分配。具体地说,管理员可以预先定义多个 PV,然后根据需求创建 PVC 并将其绑定到已有的 PV 上。这种方式可以有效地利用存储资源,并且提高了存储的可靠性和安全性。
总之,PV 和 PVC 是 Kubernetes 中非常重要的存储资源,它们为 Pod 提供了持久化存储能力,并且支持各种不同的存储后端技术。通过合理的配置和运用,PV 和 PVC 可以提高应用程序的可靠性、可扩展性和灵活性。
3、静态制备和动态制备(Provisioning)
静态制备:集群管理员创建若干 PV 卷。这些卷对象带有真实存储的细节信息, 并且对集群用户可用(可见)。PV 卷对象存在于 Kubernetes API 中,可供用户消费(使用)
动态制备:当管理员没有为 PVC 创建可用的 PV 时,Kubernetes 可以根据 StorageClass 定义,自动创建一个新的 PV 并将其与 PVC 匹配。
有了一个新的概念StorageClass,动态卷制备的实现基于 storage.k8s.io API 组中的 StorageClass API 对象。
4、什么是StorageClass
StorageClass 是一组定义了如何创建和管理 PV 的参数。例如,StorageClass 可以指定存储类型、访问模式等信息。因此,当 PVC 没有指定 StorageClass 时,Kubernetes 将使用默认的 StorageClass 进行动态 Provisioning。
为了启用动态 Provisioning,需要在 API Server 上启用 DefaultStorageClass 准入控制器。DefaultStorageClass 准入控制器允许您设置默认的 StorageClass,以便 PVC 在没有指定 StorageClass 的情况下,自动使用默认的 StorageClass 进行动态 Provisioning。您可以通过添加 DefaultStorageClass 选项来启用该准入控制器,并使用 kubectl 命令设置默认的 StorageClass。
总之,StorageClass 和 DefaultStorageClass 准入控制器是 Kubernetes 动态制备的关键组件,它们可以帮助您自动创建 PV,并为您的应用程序提供可靠的存储资源。
假设您需要在 Kubernetes 集群中部署一个应用程序,并且该应用程序需要使用 MySQL 数据库进行持久化存储。您可以使用 Kubernetes 存储的动态供应来自动创建和管理 MySQL 数据库所需的持久卷。
5、动态制备demo
需要创建一个存储类来定义 MySQL 数据库使用的存储后端。例如,如果您想使用 Amazon EBS 卷作为存储后端,则可以创建以下存储类定义:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-sc
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
上面的 YAML 文件中,provisioner 字段指定了使用 Amazon EBS 官方提供的 provisioner 来创建卷。parameters 字段指定了创建的 EBS 卷类型为 gp2(通用性能 SSD),并将回收策略设置为 Retain(保留 PV 和数据,手动删除)。
接下来,您需要创建一个 PVC 来声明 MySQL 数据库需要使用多少存储资源。例如:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: ebs-sc
上面的 YAML 文件中,storageClassName 字段指定了我们之前创建的存储类。resources.requests.storage 字段指定了 MySQL 数据库需要使用 10GB 存储资源。
最后可以在 Kubernetes 中部署 MySQL 应用程序,并将其与上述 PVC 绑定。这样,在需要动态地创建新的 PV 时,Kubernetes 就会根据存储类自动创建并绑定到该 PVC 上,从而提供 MySQL 数据库所需的持久卷。
StorageClass是一种动态供应PersistentVolume的方式,但在使用StorageClass之前,必须先创建PV。因此,正确的顺序是先创建PV,然后创建PVC,并将其绑定到Pod上。如果没有可用的PV,则可以使用StorageClass来动态创建PV以匹配PVC的需求。
如果一切顺利,Kubernetes 应该会自动创建一个 PV,并将其绑定到我们的 mysql-pvc 上。您可以使用以下命令检查这些资源是否已成功创建:
kubectl get pv,pvc
此命令将返回所有 PV 和 PVC 的列表