k8s教程(Volume篇)-PVC详解

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDSClaw,2核4GB
简介: k8s教程(Volume篇)-PVC详解

01 引言

声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

在上一篇博客《k8s教程(Volume篇)-PV详解》,我们了解了持久卷的工作原理,本文继续深入学习PVC。

02 PVC详解

PVC作为用户对存储资源的需求申请,主要涉及存储空间请求访问模式PV选择条件存储类别等信息的设置。

2.1 参数配置

下例声明的PVC具有如下属性:申请8GiB存储空间,访问模式为ReadWriteOnce,PV选择条件为包含release=stable标签并且包含条件为environment In[dev]的标签,存储类别为“slow”(要求在系统中已存在名为slow的StorageClass):

apiVersion: v1
kind: PersistentVolumeclaim 
metadata:
  name: myclaim 
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 8Gi
  storageClassName: slow 
  selector:
    matchLabels:
      release: "stable"
    matchExpressions:
      - {key: environment, operator: In, values: [dev]}

对PVC的关键配置参数说明如下:

2.1.1 资源请求(Resources)

资源请求(Resources)描述对存储资源的请求,通过 resources.requests.storage字段设置需要的存储空间大小

2.1.2 访问模式 (Access Modes)

访问模式 (Access Modes)PVC也可以设置访问模式,用于描述用户应用对存储资源的访问权限。其三种访问模式的设置与PV的设置相同

2.1.3 存储卷模式(Volume Modes)

存储卷模式(Volume Modes)PVC也可以设置存储卷模式,用于描述希望使用的PV存储卷模式,包括文件系统(Filesystem)和块设备 (Block)

PVC设置的存储卷模式应该与PV存储卷模式相同,以实现绑定,如果不同,则可能出现不同的绑定结果。在各种组合模式下是否可以绑定的结果如下图所示:

PV的存储卷模式 PVC的存储卷模式 是否可以绑定
未设定 未设定 可以绑定
未设定 Block 无法绑定
未设定 FileSystem 可以绑定
Block 未设定 无法绑定
Block Block 可以绑定
Block FileSystem 无法绑定
FileSystem FileSystem 可以绑定
FileSystem Block 无法绑定
FileSystem 未设定 可以绑定

2.1.4 PV选择条件 (Selector)

PV选择条件 (Selector)通过Label Selector的设置,可使PVC对于系统中己存在的各种PV进行筛选。系统将根据标签选出合适的PV与该PVC进行绑定

对选择条件可以使用matchLabelsmatchExpressions进行设置,如果两个字段都已设置,则Selector的逻辑将是两组条件同时满足才能完成匹配

2.1.5 存储类别(Class)

存储类别(Class)PVC在定义时可以设定需要的后端存储的类别(通过storageClassName字段指定),以减少对后端存储特性的详细信息的依赖。只有设置了该ClassPV才能被系统选出,并与该PVC进行绑定

PVC也可以不设置 Class 需求,如果 storageClassName 字段的值被设置为空 (storageClassName=""),则表示该PVC不要求特定的Class,系统将只选择未设定ClassPV与之匹配和绑定。PVC也可以完全不设置storageClassName字段, 此时将根据系统是否启用了名为DefaultStorageClassadmission controller进行相应的操作。


启用DefaultStorageClass:要求集群管理员己定义默认的StorageClass。

  • 如果在系统中不存在默认的StorageClass,则等效于不启用DefaultStorageClass的情况;
  • 如果存在默认的StorageClass,则系统将自动为PVC创建一个PV (使用默认StorageClass的后端存储),并将它们进行绑定;
  • 集群管理员设置默认 StorageClass 时,会在 StorageClass 的定义中加上一个 annotation“storageclass.kubernetes.io/is-default-class=true”;
  • 如果管理员将多个StorageClass都定义为default,则由于不唯一,系统将无法创建PVC。

未启用DefaultStorageClass:等效于PVC设置storageClassName的值为空(storageClassName=“),即只能选择未设定Class的PV与之匹配和绑定。

  • 当Selector和Class都进行了设置时,系统将选择两个条件同时满足的PV与之匹配。

另外,如果PVC设置了Selector,则系统无法使用动态供给模式为其分配PV

03 Pod使用PVC

PVC创建成功之后,Pod就可以以存储卷(Volume)的方式使用PVC的存储资源了

PVC受限于命名空间,Pod在使用PVC时必须与PVC处于同一个命名空间。

Kubernetes为Pod挂载PVC的过程如下:系统在Pod所在的命名空间中找到其配置的PVC,然后找到PVC绑定的后端PV,将PV存储挂载到Pod所在Node的目录下,最后将Node的目录挂载到Pod的容器内

3.1 举例

3.1.1 举例:默认模式 (Filesystem)

在Pod中使用PVC时,需要在YAML配置中设置PVC类型的Volume,然后在容器中通过volumeMounts.mountPath设置容器内的挂载目录,示例如下:

apiversion: v1
kind: Pod 
metadata:
  name: mypod 
spec:
  containers:
  - name: myfrontend
      image: nginx 
      volumeMounts:
    - mountPath: "/var/www/html" 
      name: mypd
    volumes:
      - name: mypd
      persistentVolumeClaim:
        claimName: myclaim

3.1.2 举例:存储卷模式为块设备(Block)

如果存储卷模式为块设备(Block),则PVC的配置与默认模式 (Filesystem)略有不同,下面对如何使用裸块设备 (Raw Block Device) 进行说明。

假设使用裸块设备的PV已创建,例如:

apiVersion: V1
kind: PersistentVolume 
metadata:
  name: block-pv 
spec:
  capacity:
    storage: 10Gi 
  accessModes:
    - ReadwriteOnce
  volumeMode: Block
  persistentVolumeReclaimPolicy: Retain 
  fc:
    targetWwNs: ["50060e801049cfa1"]
    lun: 0
    readOnly: false

PVC的YAML配置示例如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: block-pvc 
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Block
  resources:
    requests:
      storage: 10Gi

使用裸块设备PVC的Pod定义如下:

与文件系统模式PVC的用法不同,容器不使用volumeMounts设置挂载目录,而是通过volumeDevices字段设置块设备的路径devicePath

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-block-volume
spec:
  containers:
    - name: fc-container
        image: fedora:26
        conmand: ["/bin/sh", "-c"] 
        args: ["tail -f /dev/nul1"]
        volumeDevices:
      - name: data
          devicePath: /dev/xvda
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: block-pvc

在某些应用场景中,同一个Volume可能会被多个Pod或者一个Pod中的多个容器共享,此时可能存在各应用程序需要使用不同子目录的需求。这可以通过Pod 的volumeMounts定义的subPath字段进行设置。通过对subPath的设置,在容器中将以subPath设置的目录而不是在Volume中提供的默认根目录作为根目录使用。

下面的两个容器共享同一个PVC(及后端PV),但是各自在Volume中可以访问的根目录由subPath进行区分,mysql容器使用Volume中的mysql子目录作为根目录,php容器使用Volume中的html子目录作为根目录:

apiVersion: v1 
kind: Pod
metadata:
  name: mysql 
spec:
  containers:
  - name: mysql 
    image: mysql 
    env:
      name: MY_SQL_ROOT_PASSWORD 
    value: "rootpasswd" 
  volumeMounts:
  - mountPath: /var/lib/mysql 
    name: site-data
    subPath: mysql
  - name: php
    image: php:7.0-apache 
  volumeMounts:
  - mountPath: /var/www/html 
    name: site-data
    suoPath: html
  volumes:
  - name: site-data
    persistentVolumeClain:
      claimName: site-data-pvc

注意,subPath中的路径名称不能以“/”开头,需要用相对路径的形式。

在一些应用场景中,如果希望通过环境变量来设置subPath路径,例如使用 Pod名称作为子目录的名称,则可以通过 subPathExpr 字段提供支持。subPathExpr字段用于将Downward API的环境变量设置为存储卷的子目录。需要注意的是,subPathExpr字段和subPath字段是互斥的,不能同时使用。

下面的例子通过Downward APIPod名称设置为环境变量POD_NAME,然后在挂载存储卷时设置subPathExpr=$ (POD_NAME) 子目录:

apiversion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: container1
    env:
    - name: POD_NAME 
      valueFrom:
      fieldRef:
        apiVersion: v1
        fieldPath: metadata.name
      image: busybox
    command: ["sh","-c", "while [true];do do echo 'Hello';sleep 10; done | tee -a /logs/hello .txt" ]
    volumeMounts:
      - name: workdir1
        mountPath: /logs
      subPathExpr: $ (POD NAME) 
   restartPolicy: Never 
   volumes:
   - name: workdir1
   hostPath:
    path: /var/log/pods

04 文末

本文主要讲解了PVC,以及Pod使用PVC,希望能帮助到大家,谢谢大家的阅读,本文完!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
JSON Kubernetes Shell
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
315 0
|
Kubernetes Shell Perl
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
296 0
|
存储 Kubernetes Go
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
309 0
|
人工智能 运维 Kubernetes
2025 超详细!Lens Kubernetes IDE 多平台下载安装与集群管理教程
Lens 是一款企业级 Kubernetes 可视化操作平台,2025版实现了三大技术革新:AI智能运维(异常检测准确率98.7%)、多云联邦管理(支持50+集群)和实时3D拓扑展示。本文介绍其安装环境、配置流程、核心功能及高阶技巧,帮助用户快速上手并解决常见问题。适用于 Windows、macOS 和 Ubuntu 系统,需满足最低配置要求并前置依赖组件如 kubectl 和 Helm。通过 Global Cluster Hub 实现多集群管理,AI辅助故障诊断提升运维效率,自定义监控看板和插件生态扩展提供更多功能。
|
存储 Kubernetes 安全
k8s存储类型:emptyDir、hostPath、nfs、pvc及存储类storageclass的静态/动态创建pv
Kubernetes提供了多种存储类型,满足不同的应用需求。`emptyDir`和 `hostPath`适用于临时和宿主机存储需求,`nfs`适用于共享存储,`PersistentVolumeClaim`和 `StorageClass`实现了持久存储的灵活管理。通过理解和配置这些存储类型,可以有效提升Kubernetes集群的存储管理能力。
707 13
|
存储 Kubernetes 测试技术
k8s使用pvc,pv,sc关联ceph集群
文章介绍了如何在Kubernetes中使用PersistentVolumeClaim (PVC)、PersistentVolume (PV) 和StorageClass (SC) 来关联Ceph集群,包括创建Ceph镜像、配置访问密钥、删除默认存储类、编写和应用资源清单、创建资源以及进行访问测试的步骤。同时,还提供了如何使用RBD动态存储类来关联Ceph集群的指南。
639 7
|
存储 Kubernetes 调度
在K8S中,什么是PV和PVC?
在K8S中,什么是PV和PVC?
|
存储 缓存 Kubernetes
在K8S中,有状态服务与无状态服务都是怎么使用pv和pvc?(可以通过应用场景说明一下)
在K8S中,有状态服务与无状态服务都是怎么使用pv和pvc?(可以通过应用场景说明一下)
|
Kubernetes 关系型数据库 MySQL
k8s练习--通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储
本文档介绍了如何使用Kubernetes (K8s)、NFS、PersistentVolume (PV)、PersistentVolumeClaim (PVC)和Pod来部署并实现MySQL服务的数据持久化存储。Kubernetes是一个用于自动化部署、扩展和管理容器化应用的强大平台。NFS作为一种网络文件系统协议,能够使Kubernetes集群中的Pod跨节点访问共享文件。PV和PVC机制则提供了持久化的存储解决方案,确保数据即使在Pod生命周期结束后仍得以保留。
1213 0
|
6月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
576 1

推荐镜像

更多
下一篇
开通oss服务