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.ioAPI 组中的StorageClassAPI 目标。

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 的列表