如何供应和绑定 Kubernetes 持久卷声明

KubernetesBeginner
立即练习

简介

本教程将指导你了解 Kubernetes 持久卷、供应和绑定持久卷声明,以及将它们挂载到容器的过程。Kubernetes 持久卷提供了一种抽象底层存储实现的方法,使你的应用程序能够使用持久存储,而无需了解该存储是如何供应和管理的细节。

理解 Kubernetes 持久卷

Kubernetes 持久卷(PV)是一种为在 Kubernetes 集群中运行的应用程序提供持久存储的方式。PV 从底层存储实现中抽象出来,使你的应用程序能够使用存储,而无需了解该存储是如何供应和管理的细节。

PV 是一种 Kubernetes 资源,就像 Pod、服务和部署一样。它们代表集群中的一块存储,例如本地磁盘、NFS 共享或云存储卷。PV 具有独立于任何使用该存储的单个 Pod 的生命周期。

持久卷类型

Kubernetes 支持多种类型的持久卷,包括:

  • 本地(Local):由运行 Pod 的节点上的目录支持的卷。这对于需要快速、低延迟存储的应用程序很有用,但它的缺点是与特定节点绑定。
  • 网络文件系统(NFS):一种可由多个 Pod 访问的网络附加存储卷。
  • 亚马逊弹性块存储(AWS EBS):由 Amazon Elastic Block Store(EBS)卷支持的卷。
  • Azure 磁盘(Azure Disk):由 Azure 磁盘支持的卷。
  • 谷歌云平台持久磁盘(GCP PersistentDisk):由 Google Compute Engine 持久磁盘支持的卷。

持久卷类型的选择取决于你的应用程序的需求,例如性能、耐用性和可用性要求。

持久卷访问模式

持久卷可以通过不同的方式访问,称为“访问模式”。可用的访问模式有:

  • 读写一次(ReadWriteOnce,RWO):该卷可以由单个节点以读写方式挂载。
  • 只读多节点(ReadOnlyMany,ROX):该卷可以由多个节点以只读方式挂载。
  • 读写多节点(ReadWriteMany,RWX):该卷可以由多个节点以读写方式挂载。

持久卷的访问模式决定了 Pod 如何使用它。

持久卷示例

这是 Kubernetes 清单中持久卷定义的一个示例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/my-pv

此持久卷由运行 Pod 的节点上的一个目录支持。它的容量为 5 吉字节,并且可以由单个节点以读写模式访问。

供应和绑定持久卷声明

持久卷声明(PVC)是 Pod 在 Kubernetes 集群中请求存储的方式。PVC 指定了应用程序所需存储的大小、访问模式和其他参数。然后,Kubernetes 控制平面会找到一个合适的持久卷(PV)来绑定到该 PVC。

持久卷供应

持久卷可以通过两种方式进行供应:

  1. 静态供应:集群管理员手动创建 PV,然后 Pod 可以使用 PVC 来声明这些 PV。
  2. 动态供应:当创建 PVC 时,Kubernetes 可以使用存储类自动创建 PV。存储类指定要供应的存储类型和其他参数。

这是一个存储类定义的示例:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  fstype: ext4
  encrypted: "true"

此存储类供应具有 pd-standard 类型、ext4 文件系统且启用了加密的 Google Compute Engine 持久磁盘。

持久卷绑定

当 Pod 创建一个 PVC 时,Kubernetes 会找到一个合适的 PV 来绑定到该声明。绑定过程如下:

  1. PVC 使用特定参数(大小、访问模式等)请求存储。
  2. Kubernetes 搜索与 PVC 要求匹配的 PV。
  3. 如果找到匹配的 PV,则将其绑定到 PVC。
  4. 如果未找到匹配的 PV,并且启用了动态供应,则会创建一个新的 PV 并将其绑定到 PVC。

这是一个持久卷声明的示例:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

此 PVC 请求一个 5 吉字节的卷,该卷可以由单个节点以读写模式访问。

将持久卷挂载到容器

一旦持久卷声明(PVC)绑定到了持久卷(PV),接下来的步骤就是将存储挂载到 Pod 中的容器上。这是通过 Pod 规范中的 volumeMounts 字段来完成的。

在 Pod 中挂载卷

这是一个将 PVC 挂载到容器的 Pod 示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: my-container
      image: my-app:v1
      volumeMounts:
        - name: my-storage
          mountPath: /data
  volumes:
    - name: my-storage
      persistentVolumeClaim:
        claimName: my-pvc

在此示例中,Pod 有一个单独的容器,它将来自 my-pvc PVC 的存储挂载到容器内的 /data 目录。

Pod 规范的 volumes 部分定义了可以挂载的卷源,在这种情况下是一个持久卷声明。容器规范中的 volumeMounts 部分告诉 Kubernetes 在容器内何处挂载该卷。

卷生命周期

持久卷具有独立于使用它们的 Pod 的生命周期。当 Pod 被删除时,底层的 PV 不会自动删除。这使得即使 Pod 被重新创建或重新调度到不同的节点,数据也能持久保存。

但是,当 PVC 被删除时,根据在 PV 上设置的回收策略,关联的 PV 可以被自动删除、保留或回收利用。

卷权限

默认情况下,Kubernetes 以与底层存储相同的权限挂载卷。在某些情况下,你可能需要在挂载的卷上设置特定的权限,例如可以访问数据的用户或组。这可以通过 Pod 规范中的 fsGrouprunAsUser 字段来完成。

总体而言,在 Kubernetes 中将持久卷挂载到容器提供了一种在单个 Pod 的生命周期之外持久保存数据的方法,使你的应用程序能够维护状态并访问所需的数据。

总结

在本教程中,你了解了 Kubernetes 持久卷、支持的不同类型的持久卷以及可用的访问模式。你还学习了如何供应和绑定持久卷声明,并将它们挂载到你的容器。通过理解和使用持久卷,你可以确保你的应用程序能够访问持久存储,而不管你的 Kubernetes 集群中的底层存储实现如何。