简介
本教程将指导你了解 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。
持久卷供应
持久卷可以通过两种方式进行供应:
- 静态供应:集群管理员手动创建 PV,然后 Pod 可以使用 PVC 来声明这些 PV。
- 动态供应:当创建 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 来绑定到该声明。绑定过程如下:
- PVC 使用特定参数(大小、访问模式等)请求存储。
- Kubernetes 搜索与 PVC 要求匹配的 PV。
- 如果找到匹配的 PV,则将其绑定到 PVC。
- 如果未找到匹配的 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 规范中的 fsGroup 和 runAsUser 字段来完成。
总体而言,在 Kubernetes 中将持久卷挂载到容器提供了一种在单个 Pod 的生命周期之外持久保存数据的方法,使你的应用程序能够维护状态并访问所需的数据。
总结
在本教程中,你了解了 Kubernetes 持久卷、支持的不同类型的持久卷以及可用的访问模式。你还学习了如何供应和绑定持久卷声明,并将它们挂载到你的容器。通过理解和使用持久卷,你可以确保你的应用程序能够访问持久存储,而不管你的 Kubernetes 集群中的底层存储实现如何。


