循序渐进PersistentVolumes与PersistentVolumeClaim

文章目录

  • 静态配置(Static Provisioning):
    • Persistent volume(PV)
      • Local 示例:
      • NFS 示例:
      • 检查pv
      • PV 的常见状态说明
      • Persistent volume claim(PVC)
        • 1. local PVC示例:
        • 2.NFS PVC示例:
        • 3. 检查PVC:
    • 挂载静态供应卷
      • 验证静态供应卷挂载:
        • 1. 查看 Deployment 和 Pod 状态
        • 2. 进入容器内部验证挂载目录
  • 动态供应(Dynamic Provisioning)
    • StorageClasses:
      • 使用 Helm 安装 NFS 动态存储卷插件
        • 1. 添加存储库
        • 2. 安装命令(请替换你的 NFS IP 和共享路径):
        • 3. 检查stogrageclass
        • 4 . storageclass参收说明:
    • 创建 PVC(动态)
    • 检查PVC:
    • 动态挂载 PVC 到已部署 Pod
      • 添加 Volume
      • 添加 VolumeMount 到容器
      • 验证挂载

静态配置(Static Provisioning):

由集群管理员预先创建 PersistentVolume(PV),这些 PV 携带实际存储的详细信息,可供集群用户使用。

Persistent volume(PV)

PersistentVolume(PV)是集群中的一种存储资源,可由管理员预先配置,或通过 StorageClass 实现动态配置。
Kubernetes 原生支持多种 PersistentVolume(PV)类型,叫做 volume plugins。它们允许你指定不同的底层存储方式,例如本地目录、NFS、云存储等。
实际开发/部署中最常见的内建类型:

类型适用场景说明
local本地快速测试或特殊需求需要设置 nodeAffinity
nfs简单共享存储,手动配置即可静态配置,适合小规模共享
hostPath单节点开发环境使用不推荐用于生产
iscsi企业 SAN 接入配置复杂

Local 示例:

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:name: mnt-pv
spec:accessModes:- ReadWriteManycapacity:storage: 100MivolumeMode: Filesystemlocal:fsType: ext4path: /mntnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8sw01.lab.compersistentVolumeReclaimPolicy: Retain
EOF

检查 persistent Volumes:

NFS 示例:

cat << EOF | kubectl -f -
apiVersion: v1
kind: PersistentVolume
metadata:name: static-nfs-pv
spec:accessModes:- ReadWriteManycapacity:storage: 100MivolumeMode: Filesystemnfs:server: 172.20.32.247path: /data/static-pvpersistentVolumeReclaimPolicy: Retain
EOF

检查pv

kubectl get pv mnt-pv static-nfs-pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
mnt-pv          100Mi      RWX            Retain           Available                          <unset>                          41m

kubectl get pv 输出中的 STATUS 列显示 PersistentVolume (PV) 当前的状态。上面输出显示 Available ,是 PV 的一种状态,表示它当前没有被绑定(Bound)给任何 PersistentVolumeClaim (PVC)。

PV 的常见状态说明

状态说明
AvailablePV 目前未被任何 PVC 绑定,可以被新的 PVC 申请使用。
BoundPV 已经绑定到某个 PVC,正在被使用中。
ReleasedPV 原先被绑定的 PVC 已被删除,但 PV 还未被回收或重新配置,可能还保留旧数据。
FailedPV 遇到错误或回收失败,可能无法正常使用。

Persistent volume claim(PVC)

为已声明的 PV 申请绑定:

1. local PVC示例:
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mnt-pvcnamespace: kubeuser
spec:accessModes:- ReadWriteManyresources:requests:storage: 100MivolumeMode: FilesystemvolumeName: mnt-pv
EOF
2.NFS PVC示例:
cat << EOF | kubectl  apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: static-nfs-pvcnamespace: kubeuser
spec:accessModes:- ReadWriteManyresources:requests:storage: 100MivolumeMode: FilesystemvolumeName: static-nfs-pv
EOF
3. 检查PVC:
kubectl get pvc mnt-pvc static-nfs-pvc -n kubeuser
NAME             STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
mnt-pvc          Bound    mnt-pv          100Mi      RWX                           <unset>                 6m49s
static-nfs-pvc   Bound    static-nfs-pv   100Mi      RWX                           <unset>                 30s

挂载静态供应卷

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentnamespace: kubeuserlabels:app: nginx
spec:replicas: 1  # 启动一个副本selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latest  # 使用官方 Nginx 镜像ports:- containerPort: 80volumeMounts:- mountPath: /mnt/mnt-pvcname: mnt-pvc- mountPath: /mnt/static-nfs-pvcname: static-nfs-pvcvolumes:- name: mnt-pvcpersistentVolumeClaim:claimName: mnt-pvc- name: static-nfs-pvcpersistentVolumeClaim:claimName: static-nfs-pvc
EOF

验证静态供应卷挂载:

在成功部署 Nginx 应用并绑定静态 NFS 卷后,我们可以通过以下步骤来验证卷是否已经正确挂载到容器中。

1. 查看 Deployment 和 Pod 状态

首先确认 nginx-deployment 已经成功运行,并且副本状态正常:

kubectl get deploy nginx-deployment -n kubeuser -o wide

输出结果类似如下,表示 Deployment 的 Pod 已就绪并运行中:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES         SELECTOR
nginx-deployment   1/1     1            1           4m4s   nginx        nginx:latest   app=nginx

接着查看 Pod 的具体名称和状态:

root@k8sm01:/home/kubeadmin/yaml/deployments# kubectl get pod -n kubeuser

输出显示:

NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-f975675bc-ldgnk   1/1     Running   0          6m48s
2. 进入容器内部验证挂载目录

使用 kubectl exec 命令进入 Pod 的容器内部:

kubectl exec -it nginx-deployment-f975675bc-ldgnk -n kubeuser -- bash

进入容器后,可以查看主机名以确认所处环境:

hostname
nginx-deployment-f975675bc-ldgnk

接着检查挂载目录内容,例如挂载在 /mnt 下的子目录:

ls -lh /mnt/
total 8.0K
drwxr-xr-x 2 root root 4.0K Apr 23  2024 mnt-pvc
drwxr-xr-x 2 root root 4.0K May 27 15:14 static-nfs-pvc

这说明 PVC 已被正确挂载进 Pod 的指定路径中,Pod 可以直接读写对应的 NFS 共享目录,实现持久化存储。

动态供应(Dynamic Provisioning)

当没有任何静态 PersistentVolume 匹配某个 PersistentVolumeClaim 时,集群可能会尝试为该 PVC 进行动态分配。
此过程基于 StorageClass 进行。要在 Kubernetes 集群中实现 动态存储卷动态供给(Dynamic Provisioning),必须安装一个 StorageClass 和一个 支持动态创建 Volume 的 Provisioner。

StorageClasses:

在 GCP、AWS、Azure 或其他云平台上部署 Kubernetes 集群时,系统会预设创建一个默认的 StorageClass,该 StorageClass 使用标准类型的持久性磁盘。
运行 kubectl get storageclass 返回"No resources found"

kubectl get storageclass
No resources found

默认 Kubernetes 并不会自动安装这些,所以需要自己配置。

使用 Helm 安装 NFS 动态存储卷插件

有关helm的安装与使用,请参考这篇文章循序渐进掌握Helm

1. 添加存储库
helm repo add stable https://charts.helm.sh/stable
helm repo update
2. 安装命令(请替换你的 NFS IP 和共享路径):
helm install nfs-client nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \--namespace default \--set nfs.server=172.20.32.247 \--set nfs.path=/data/dynamic-pv \--set storageClass.defaultClass=true \--set storageClass.name=nfs-client
3. 检查stogrageclass

运行 kubectl get storageclass:

 kubectl get storageclass

应该能看到:

NAME                   PROVISIONER                                                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client (default)   cluster.local/nfs-client-nfs-subdir-external-provisioner   Delete          Immediate           true                   6m59s

storageclass yaml内容:

kubectl get storageclass  -o yaml
apiVersion: v1
items:
- allowVolumeExpansion: trueapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:annotations:meta.helm.sh/release-name: nfs-clientmeta.helm.sh/release-namespace: defaultstorageclass.kubernetes.io/is-default-class: "true"creationTimestamp: "2025-05-28T14:48:18Z"labels:app: nfs-subdir-external-provisionerapp.kubernetes.io/managed-by: Helmchart: nfs-subdir-external-provisioner-4.0.18heritage: Helmrelease: nfs-clientname: nfs-clientresourceVersion: "1018780"uid: 5912911f-4993-4965-8e75-ba79fe2dca25parameters:archiveOnDelete: "true"provisioner: cluster.local/nfs-client-nfs-subdir-external-provisionerreclaimPolicy: DeletevolumeBindingMode: Immediate
4 . storageclass参收说明:
  • Provisioner(供给器):
    StorageClass 中包含一个 provisioner,用于指定创建 PV 时所使用的存储插件(volume plugin)。

  • Reclaim Policy(回收策略):
    该策略决定当 PVC 被删除后,PV 应该如何处理。可以设置为:
    Delete**:自动删除相关存储资源。
    Retain**:保留数据,需要手动清理。
    默认值为 Delete。

  • Volume Binding Mode(卷绑定模式):
    volumeBindingMode 字段用于控制卷绑定(volume binding)和动态供给(dynamic provisioning)发生的时机。
    Immediate(默认):立即分配卷。

  • Access Modes(访问模式):
    PersistentVolume 支持以下访问模式:
    ReadWriteOnce:卷可被单个节点以读写方式挂载。
    ReadOnlyMany:卷可被多个节点以只读方式挂载。
    ReadWriteMany:卷可被多个节点以读写方式挂载

创建 PVC(动态)

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: dynamic-nfs-pvcnamespace: kubeuser
spec:storageClassName: nfs-clientaccessModes:- ReadWriteManyresources:requests:storage: 100MivolumeMode: Filesystem
EOF

检查PVC:

可以看到刚刚创建的dynamic-nfs-pvc ,已经绑定storageclass:nfs-client,但status仍为pending状态,如果绑定成功,PVC 状态将变为 Bound,并关联到系统自动创建的 PV。

 kubectl get pvc -n kubeuser
NAME              STATUS    VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
dynamic-nfs-pvc   Pending                                             nfs-client     <unset>                 3m6s
mnt-pvc           Bound     mnt-pv          100Mi      RWX                           <unset>                 23h
static-nfs-pvc    Bound     static-nfs-pv   100Mi      RWX                           <unset>                 23h

使用kubectl describe查看,将显示此pvc的细节信息

 kubectl describe pvc dynamic-nfs-pvc -n kubeuser

输出显示仍然等待绑定

Events:Type    Reason                Age                  From                         Message----    ------                ----                 ----                         -------Normal  ExternalProvisioning  110s (x42 over 11m)  persistentvolume-controller  Waiting for a volume to be created either by the external provisioner 'cluster.local/nfs-client-nfs-subdir-external-provisioner' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.

动态挂载 PVC 到已部署 Pod

由于在静态供应(Static Provisioning)中已经部署了示例deployment,我们将继续使用这个deployment,并通过 kubectl patch 命令对已有 Deployment 添加动态 PVC:

 kubectl patch deployment nginx-deployment -n kubeuser -p '{"spec":{"template":{"spec":{"volumes":[{"name":"dynamic-nfs-pvc","persistentVolumeClaim":{"claimName":"dynamic-nfs-pvc"}}]}}}}'
deployment.apps/nginx-deployment patched

添加 Volume

 kubectl patch deployment nginx-deployment -n kubeuser -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx","volumeMounts":[{"mountPath":"/mnt/dynamic-nfs-pvc","name":"dynamic-nfs-pvc"}]}]}}}}'

添加 VolumeMount 到容器

 kubectl get pvc -n kubeuser
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
dynamic-nfs-pvc   Bound    pvc-5179e3bb-831b-45f7-b0a0-96911e6b2b21   100Mi      RWX            nfs-client     <unset>                 22h
mnt-pvc           Bound    mnt-pv                                     100Mi      RWX                           <unset>                 45h
static-nfs-pvc    Bound    static-nfs-pv                              100Mi      RWX                           <unset>                 45h

验证挂载

 get pvc dynamic-nfs-pvc -n kubeuser
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
dynamic-nfs-pvc   Bound    pvc-5179e3bb-831b-45f7-b0a0-96911e6b2b21   100Mi      RWX            nfs-client     <unset>                 23h

进入容器内部

 kubectl exec -it nginx-deployment-64699f648c-jlrl2 -n kubeuser -- bash

确认已经进入容器内部

hostname
nginx-deployment-64699f648c-jlrl2

输出目录中应包含:

 ls -lh /mnt
total 12K
drwxrwxrwx 2 root root 4.0K May 28 15:21 dynamic-nfs-pvc
drwxr-xr-x 2 root root 4.0K Apr 23  2024 mnt-pvc
drwxr-xr-x 2 root root 4.0K May 27 15:14 static-nfs-pvc

说明所有三种 PVC(local、static NFS、dynamic NFS)已成功挂载,Pod 可读写使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【连接器专题】SD卡座规格书审查需要审哪些方面?

在审查SD卡座规格书时,我们需要考虑哪些方面? 首先在拿到一份SD卡座的详细规格书时,一般供应商给到的规格书中包括了一些基础信息、产品图纸信息、技术参数信息,同时有些供应商会给出产品可靠性测试报告。因此我们会从这几个要素去看规格书。 基础信息 基础信息一般会给变更…

投稿 IEEE Transactions on Knowledge and Data Engineering 注意事项

投稿 IEEE Transactions on Knowledge and Data Engineering 注意事项 要IEEE overleaf 模板私信,我直接给我自己论文,便于编辑 已经投稿完成了,有一些小坑 准备工作 注册IEEE账户:若没有IEEE账户,需前往IEEE官网注册。注册成功后,可用于登录投稿系统。现在新的系统,…

JS入门——三种输入方式

JS入门——三种输入方式 一、方式一&#xff1a;直接在警告框弹出(window可以省略) <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script><!-- 方式一直接在警告框弹…

WordPress免费网站模板下载

大背景图免费wordpress建站模板 这个wordpress模板设计以简约和专业为主题&#xff0c;旨在为用户提供清晰、直观的浏览体验。以下是对其风格、布局和设计理念的详细介绍&#xff1a; 风格 简约现代&#xff1a;整体设计采用简约风格&#xff0c;使用了大量的白色和灰色调&am…

AUTOSAR CP全新系统化培训上线!从底层到应用,三步阶梯,五大学习维度构建完整知识体系

AUTOSAR组织 AUTOSAR官方全新推出「AUTOSAR CP全栈赋能计划」&#xff0c;从架构全景到模块细节&#xff0c;自底向上、由浅入深&#xff0c;覆盖MCAL至SWC全层级&#xff0c;融合通信、诊断、安全等六大核心Feature&#xff0c;带您穿透复杂理论&#xff0c;直击AUTOSAR开发本…

Java网络编程与Socket安全权限详解

Socket安全权限控制 Java通过java.net.SocketPermission类实现对网络套接字访问的细粒度控制。该权限管理机制通常在Java策略文件中配置,其标准授权语法格式如下: grant {permission java.net.SocketPermission"target", "actions"; };目标主机与端口规…

基于本地化大模型的智能编程助手全栈实践:从模型部署到IDE深度集成学习心得

近年来&#xff0c;随着ChatGPT、Copilot等AI编程工具的爆发式增长&#xff0c;开发者生产力获得了前所未有的提升。然而&#xff0c;云服务的延迟、隐私顾虑及API调用成本促使我探索一种更自主可控的方案&#xff1a;基于开源大模型构建本地化智能编程助手。本文将分享我构建本…

视频监控汇聚平台EasyCVR安防小知识:如何通过视频融合平台解决信息孤岛问题?

一、项目背景与需求分析​ 随着数字化技术发展与网络带宽升级&#xff0c;视频技术应用场景不断拓展&#xff0c;视频监控、记录仪等多样化产品构建起庞大体系。但这些独立系统彼此割裂&#xff0c;形成信息孤岛。 在系统集成项目中&#xff0c;视频系统深度融合已成必然趋势…

如何在 Windows 和 Mac 上擦拭和清洁希捷外置硬盘

希捷外置硬盘广泛用于存储目的&#xff0c;但有时您可能出于多种目的需要擦除或清洁希捷外置硬盘&#xff0c;例如转售、重复使用、捐赠等。为了释放硬盘上的存储空间或确保没有人可以从硬盘中恢复您的信息&#xff0c;擦除硬盘是必要的步骤。无论您使用的是 Windows 还是 Mac&…

SAP saml2 元数据 HTTP 错误

使⽤事务 SAML2 或 SAML2_IDP 在 ABAP 系统中配置 SAML 2.0 时&#xff0c; Web 页⾯返回 403 已禁⽌、 404 未找到 或 500 服务器内部错误。 在事务 SAML2 中下载元数据时&#xff0c; ⽹页返回 403 已禁⽌、 404 未找到或 500 服务器内部错误。 在事务 SAML2_IDP 中下载…

powershell 中 invoke-expression 报错解决

打开powershell就出现这个报错&#xff1a; 网上搜了也没有很好的解决办法&#xff0c;抱着一点点期待&#xff0c;问了豆包 根据豆包的指示&#xff0c;在终端执行以下 几个命令&#xff0c;报错解决了&#xff08;开心万岁&#xff09; # 移除多余的引号和空路径 $pathArra…

简单说一说Modern ABAP这个概念

Modern ABAP 是 SAP近些年来提出的一个概念&#xff0c;指的是在传统 ABAP (Advanced Business Application Programming) 的基础上&#xff0c;结合新技术和现代化编程理念进行改进和优化&#xff0c;旨在使 ABAP 更适应云计算、数据驱动业务以及开发效率提升的需求。 这一概…

kafka 常用知识点

文章目录 前言kafka 常用知识点1. kafka 概念2. 消息共享和广播3. 分区和副本数量奇偶数 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0…

5G RedCap是什么-与标准5G的区别及支持路由器推荐

技术背景与重要性 从智能穿戴到工业传感器&#xff0c;物联网设备种类繁多&#xff0c;但并非所有设备都需要标准5G的全部功能。为满足这些中端应用的需求&#xff0c;3GPP在Release 17中引入了5G RedCap&#xff08;Reduced Capability&#xff09;&#xff0c;也称为5G NR-L…

C++构造函数与初始化全面指南:从基础到高级实践

C构造函数与初始化全面指南&#xff1a;从基础到高级实践 1. 构造函数基础概念 构造函数是C中一种特殊的成员函数&#xff0c;它在创建类对象时自动调用&#xff0c;用于初始化对象的数据成员。构造函数的核心特点包括&#xff1a; 与类同名无返回类型&#xff08;连void都没…

大模型长对话中上下文无法承载全部历史,如何压缩或提取重点

在人工智能技术迅猛发展的今天,大模型已经渗透到我们生活的方方面面,尤其是自然语言处理领域,简直是掀起了一场革命。从智能客服到个人助手,从在线教育到心理咨询,大模型驱动的对话系统正在以一种前所未有的方式改变我们与机器的互动模式。特别是那些能够进行多轮对话、甚…

ubuntu20.04安装教程(图文详解)

Ubuntu 24.04 LTS&#xff0c;代号 Noble Numbat&#xff0c;于 2024 年 4 月 25 日发布&#xff0c;现在可以从 Ubuntu 官方网站及其镜像下载。此版本将在 2029 年 4 月之前接收为期五年的官方安全和维护更新。 关于 Ubuntu 24.04 LTS 的一些关键点&#xff1a; 发布日期&am…

数据结构之队列:原理与应用

一、基本原理 队列是一种特殊的线性表队列是一个有序表(可以用数组或链表实现)遵循“先来先服务”的原则&#xff0c;它只允许在表的前端&#xff08;队头&#xff09;进行删除操作&#xff0c;在表的后端&#xff08;队尾&#xff09;进行插入操作 (一) 核心操作 入队&…

Ubuntu 安装 Miniconda 及配置国内镜像源完整指南

目录 Miniconda 安装Conda 镜像源配置Pip 镜像源配置验证配置基本使用常见问题 1. Miniconda 安装 1.1 下载安装脚本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh1.2 执行安装 bash Miniconda3-latest-Linux-x86_64.sh按回车查看许可协议…

PYTHON通过VOSK实现离线听写支持WINDOWSLinux_X86架构

在当今人工智能快速发展的时代&#xff0c;语音识别技术已经成为人机交互的重要方式之一。本文将介绍如何使用Python结合Vosk和PyAudio库实现一个离线语音识别系统&#xff0c;无需依赖网络连接即可完成语音转文字的功能。 技术栈概述 1. Vosk语音识别引擎 Vosk是一个开源的…