k8s教程(Volume篇)-PVC详解

这篇具有很好参考价值的文章主要介绍了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,希望能帮助到大家,谢谢大家的阅读,本文完!文章来源地址https://www.toymoban.com/news/detail-701980.html

到了这里,关于k8s教程(Volume篇)-PVC详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【云原生-Kubernetes篇】K8s的存储卷/数据卷+PV与PVC

    【云原生-Kubernetes篇】K8s的存储卷/数据卷+PV与PVC

    容器部署过程中一般有以下三种数据: • 启动时需要的 初始数据 :例如配置文件 (init container) • 启动过程中产生的 临时数据 :该临时数据需要多个容器间共享 • 启动过程中产生的 持久化数据 :例如MySQL的data目录 (业务数据–很重要) 而容器中的文件在磁盘上是 临时

    2024年02月05日
    浏览(9)
  • 【云原生】K8S存储卷:PV、PVC详解

    【云原生】K8S存储卷:PV、PVC详解

    容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共

    2024年02月12日
    浏览(10)
  • Kubernetes(k8s)实战:深入详解Volume,详解k8s文件同步存储

    Kubernetes(k8s)实战:深入详解Volume,详解k8s文件同步存储

    Volume官网:https://kubernetes.io/docs/concepts/storage/volumes/ On-disk files in a Container are ephemeral, which presents some problems for non-trivial applications when running in Containers. First, when a Container crashes, kubelet will restart it, but the files will be lost - the Container starts with a clean state. Second, when running Containers to

    2024年02月13日
    浏览(13)
  • k8s pv与pvc

    k8s pv与pvc

    1.前言 PV 是 Kubernetes 集群中的一种资源对象,它代表着一块物理存储设备,例如磁盘、网络存储或云存储等。PV 可以被多个 Pod 共享,并且可以独立于 Pod 存在。PV 可以配置不同的访问模式 (Access Modes),例如 ReadWriteOnce 、 ReadOnlyMany 或 ReadWriteMany ,以确定 PV 可以被多少个 Pod 同

    2024年01月21日
    浏览(9)
  • k8s--动态pvc和pv

    k8s--动态pvc和pv

    目录 前情回顾 动态pv 实验模拟 步骤一:在stor01节点上安装nfs,并配置nfs服务 接下来在matser01上配置 步骤二:创建 Service Account,用来管理 NFS Provisioner 在 k8s 集群中运行的权限和动态规则 步骤三:使用 Deployment 来创建 NFS Provisioner  部署nfs-provisioners插件: 步骤四:创建 St

    2024年01月24日
    浏览(29)
  • PV & PVC in K8s

    在Kubernetes中,PV(Persistent Volume)和PVC(Persistent Volume Claim)是用于管理持久化存储的重要资源对象。PV表示存储的实际资源,而PVC表示对PV的声明性要求。当应用程序需要使用持久化存储时,它可以通过创建PVC来请求和使用PV。以下是使用PV和PVC时的一些注意事项: 定义存储类

    2024年02月09日
    浏览(10)
  • k8s ------存储卷(PV、PVC)

    k8s ------存储卷(PV、PVC)

    目录 一:为什么需要存储卷? 二:emptyDir存储卷  ​三:hostPath存储卷  四:nfs共享存储卷   五:PVC 和 PV 1、PVC 和 PV介绍 2、PV和PVC之间的相互作用遵循的生命周期 3、PV 的4 种状态 4、一个PV从创建到销毁的具体流程 六:静态创建pv和pvc资源由pod运用过程 ​1、配置nfs存储 ​

    2024年02月13日
    浏览(9)
  • 【kubernetes系列】Kubernetes之volume、pv和pvc

    本章节将分享kubernetes中关于存储的资源,包括volume和persistent volume。 为了保证数据的持久性,必须保证数据存放在外部存储。在普通的docker容器中,为了实现数据的持久性存储,我们在宿主机和容器内做映射,可以保证在容器的生命周期结束,数据依旧可以实现持久性存储。

    2024年02月11日
    浏览(5)
  • 【K8S系列】深入解析K8S中PV 和PVC

    在 Kubernetes 中,PV(持久卷)和 PVC(持久卷声明)之间的关系是一种动态匹配和绑定关系,用于实现 Pod 与存储资源的解耦。 PV 是集群中的一块网络存储,它独立于 Pod 存在。PV 可以是各种存储系统,如云提供商的存储、NFS、iSCSI、本地存储等。 管理员负责创建 PV,并配置其

    2024年04月23日
    浏览(13)
  • 【K8S 存储卷】K8S的存储卷+PV/PVC

    【K8S 存储卷】K8S的存储卷+PV/PVC

    目录 一、K8S的存储卷 1、概念: 2、挂载的方式: 2.1、emptyDir: 2.2、hostPath: 2.3、NFS共享存储: 二、PV和PVC: 1、概念 2、请求方式 3、静态请求流程图: 4、PV和PVC的生命周期 5、PV的状态: 6、PV的读写挂载方式: 7、回收策略: 三、PV和PVC静态请求实验: 1、默认的Retain保留策

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包