跳转至主要内容

Kubernetes 持久卷声明说明

Table of Contents

分享该页面

Yifat Perry
Yifat Perry

什么是 Kubernetes 持久卷和持久卷声明?

Kubernetes 持久卷(PV) 是一个允许 pod 访问存储设备上的持久存储的对象,通过 Kubernetes StorageClass 进行定义。与本质上是瞬态的常规卷不同,PV 是持久的,支持有状态的应用程序用例。PV 是 Kubernetes 集群中的一个资源对象,即使在使用它的 pod 被销毁后,它仍然存在。

PV 必须通过持久卷声明(PVC)请求,这些是存储请求。PVC 本质上是在 pod 上挂载满足某些要求的 PV 的请求。PVC 不指定特定的 PV,而是指定 pod 所需的 StorageClass。管理员可以定义 StorageClasses 来指示存储设备的属性,例如性能、服务级别和后端策略。

Kubernetes 中 PVC 模式的一个主要优势是,它允许开发人员动态请求存储资源,而无需知道底层存储设备的实现。

相关内容:阅读我们的 Kubernetes StorageClass 指南

在本文中:

持久卷声明:静态与动态资源调配

要将 pod 绑定到 PV,pod 必须包含卷挂载和 PVC。这些声明允许用户在不知道底层存储设备详细信息的情况下将 PV 挂载在 pod 中。

将 PV 安装到 Pod 有两种选择:

  • 静态配置涉及管理员手动创建 PV 并定义与这些 PV 条件匹配的 StorageClass。当 Pod 使用指定 StorageClass 的 PVC 时,它可以访问这些静态 PV 之一。
  • 动态配置发生在没有与 PVC 匹配的静态 PV 时。在这种情况下,Kubernetes 集群根据 StorageClass 定义提供新的 PV。

相关内容:阅读我们的 Kubernetes 共享存储指南

创建 Persistent Volume Claim 并绑定到 Persistent Volume

本教程演示了 PV 和 PVC 的工作原理。它是 Kubernetes 文档中提供的完整教程 的摘要。

1.设置节点
使用单个节点设置 Kubernetes 集群,并确保 kubectl 命令行与控制平面有连接。在节点上创建一个目录,如下所示:

sudo mkdir /mnt/data

在目录中创建 index.html 文件。

2.创建持久卷
创建如下所示的 YAML 文件以定义 PV。

k8s pvc 1

运行此命令以在您的节点上创建 PV:

kubectl apply -f https://k8s.io/examples/pods/storage/pv-volume.yaml

3.创建永久卷声明并将其绑定到永久卷
创建需要 PV 的 PVC,但要符合以下条件以匹配您之前创建的 PV:

  • 3 GB 或以上的存储容量
  • 启用读/写访问
k8s pvc 2

运行以下命令以应用 PVC:

kubectl apply -f https://k8s.io/examples/pods/storage/pv-claim.yaml

当您创建持久卷声明时,Kubernetes 控制平面会找到正确的 PV。如果找到,它会将 PVC 绑定到 PV。

通过运行以下命令检查先前创建的 PV 的状态:

kubectl get pv task-pv-volume

如果绑定成功,输出应如下所示:

k8s pvc 3

4.创建一个 pod 并挂载持久卷声明
最后,创建一个使用 PVC 的 pod。使用 NGINX 映像运行 pod,在 pod 规范的相关部分中指定您事先创建的 PVC:

k8s pvc 4

使用 bash 命令在您的 pod 中安装 curl,然后运行此命令:

curl http://localhost/

输出应显示第 1 步中创建的 index.html 文件的内容。它应显示新 pod 可以通过 PVC 访问 PV 中的数据。

Kubernetes PVC 错误:常见原因和解决方案 [C]

Kubernetes PVC 使用起来可能很复杂,导致可能难以诊断和解决的错误。PVC 错误通常与三大类相关 - PV 的创建问题、PV 的配置问题以及 PV 或 PVC 规格的变化。

与 PVC 相关的最常见错误是 FailedAttachVolume、FailedMount 和 CrashLoopBackOff。

FailedAttachVolume 和 FailedMount 错误

这两个错误表示 Pod 无法挂载 PV。不同之处在于,当卷无法从上一个节点分离时会发生 FailedAttachVolume,当卷无法在所需路径上挂载时会发生 FailedMount。

导致这两个错误的可能原因很多,包括新节点故障、连接到新节点的磁盘太多、网络分区错误以及前一个节点上的存储设备故障。

诊断问题

要诊断 FailedAttachVolume 和 FailedMount 等问题的原因,请运行命令 describe pod 并搜索 Events 部分以查找指示错误的消息。消息还应提供有关原因的信息。

解决问题

Kubernetes 无法自动解决 FailedAttachVolume 和 FailedMount 错误,因此需要手动处理问题:

  • 如果错误的原因是 Failure to Detach- 使用存储设备的接口手动分离卷。
  • 如果错误为"无法连接或挂载"请检查是否存在网络分区问题或网络路径不正确。如果不是这样,请尝试让 Kubernetes 在另一个节点上调度 pod,或在新节点上调查并解决问题。

CrashLoopBackOff 错误由于 PersistentVolumeClaim 引起

CrashLoopBackOff 表示 pod 崩溃、重新启动并重复崩溃。在某些情况下,此错误是由损坏的 PersistentVolumeClaims 导致的。

诊断问题

要确定 CrashLoopBackOff 错误是否由 PVC 引起,请检查上一个装载 PV 的容器实例的日志,检查部署日志,并在必要时在容器上运行 shell 以确定其崩溃原因。

解决问题

如果 CrashLoopBackOff 是 PVC 问题的结果,请尝试以下步骤:

  1. 将部署扩展到 0 个实例以启用调试。
  2. 使用此查询获取失败 PVC 的标识符:
    kubectl get deployment -o jsonpath="{.spec.template.spec.volumes[*].persistentVolumeClaim.claimName}" failed-deployment 
    
  3. 创建用于调试的新 pod 并使用此命令运行 shell:
    exec -it volume-debugger sh
    
  4. 确定当前装载在 /datadirectory 中的卷,并修复导致 pod 崩溃的问题。
  5. 退出 shell,删除调试 pod,并将部署缩放回所需的副本数量。

使用 Cloud Volumes ONTAP 优化 Kubernetes 存储

NetApp Cloud Volumes ONTAP,领先的企业级存储管理解决方案,在 AWS、Azure 和 Google Cloud 上提供安全、经过验证的存储管理服务。Cloud Volumes ONTAP 容量可以扩展到数 PB,它支持各种用例,如文件服务、数据库、DevOps 或任何其他企业工作负载,具有强大的功能,包括高可用性、数据保护、存储效率、Kubernetes 集成等。

特别是,Cloud Volumes ONTAP 支持Kubernetes 持久卷配置和管理 容器化工作负载的要求。

详细了解 Cloud Volumes ONTAP 如何帮助解决这些 Kubernetes 工作负载与 Cloud Volumes ONTAP 案例研究中容器化应用程序的挑战。

Yifat Perry

Yifat Perry

查看 Yifat Perry 的所有文章
Kubernetes 持久卷声明说明 | NetApp