k8s pv

这个文档描述当前在k8s中PersistentVolumes的使用。 我们建议和volume一起进行了解

Introduction

管理存储和管理计算是截然不同的问题。 持久存储子系统对用户和管理者提供了API, 通过这API, 你可以了解存储是如何提供的,是如何消耗的,为了达到这样的效果,我们将介绍两个新的API:PersistenVolume和PersistenVolumeClaim

一个 PersistenVolume(PV)是一块在集群中被管理员划定好的网络存储,它就和node的一样,都是cluster的一个资源。 PV相当前Volume的扩展, 只不过有一个独立于任何使用PV的Pod个体的生命周期。这个API捕捉了一个存储实施的细节,这个存储可以是NFS,ISCSI或者cloud-provider-specfifc存储系统

一个PersistentVolumeClaim(PVC) 是一个由用户发起的存储请求, 它类似于一个Pod,Pod占用节点资源,PVC消费PV资源。

Pod可以请求不同级别的资源(CPU和内存). Claims可以请求一个特殊的大小和access modes(例如可以挂载一次读写,或者多次只读)的资源

请看  detailed walkthrough with working examples

Lifecycle of a volume and claim

PV占用集群资源。 PVC是请求这些资源并充当这些资源的一个提取证,在一个生命周期中,PV和PVC是相互作用的

Provisioning

一个集群的管理者会创建一些PV,这些PV关注的是能被集群用户使用的真实存储的细节。这些PV存在k8s的API,可以被有效的使用。

Binding

因为一个指明大小的,有指定access modes的存储请求 , 一个用户会创建一个PersistentVolumeClaim。在master中,使用循环来监视,这样就能发现新的PVC,并且找到一个相匹配的PV(如果可以的话), 然后把他们绑定到一块。用户将总是能得到他们所要求的最少的东西,但是得到的存储可能超过他所要求的。 一旦绑定, 不论什么模式被用来绑定他们,PersistentVolumeClaim的绑定是独有的。

如果没有volume可以匹配上的,则Claims会一直保持未绑定状态。当匹配到的volume是有效的时候,Claim将会变为绑定的。 例如,一个集群提供了50G的PV将不会被一个请求100G的PVC所匹配。 当集群提供一个100G的PV的时候,这个PVC将会被绑定。

Using

Pod把claims当作存储卷。 集群检测claim来发现相绑定的存储卷和pod存储卷的挂载点( mounts that volume for a pod)。 对于支持多种access modes的volume来说, 当用户把claim做为一个pod的volume的时候需要指出想要的mode

一旦用户有一个claim并且claim处于绑定状态,这个绑定的PV在用户不解除绑定的时候一直属于该用户。  Users schedule Pods and access their claimed PVs by including a persistentVolumeClaim in their Pod’s volumes block.See below for syntax details. 用户通过在他们的Pod的存储块中包含一个PVC来调度Pod和使用它们请求到的PV

Releasing

当一个用户使用完了他volume, 可以通过API来删除对应的PVC,这样允许回收资源。 当claim被删除后,这个volume可以被认为是“release"状态, 但是它对其他的claim来说是不可用的。 前一个claim产生的数据会一直在volume中,这必须根据你们的策略进行处理

Reclaiming

PersistentVolume的回收策略告诉集群,当volume从他所属的claim中被释放后,集群可以对volume做什么。 当前,volume可以保留,回收和删除。 保留允许手动再利用资源。AWS EBS, GCE PD或者Cinder volume这些volume插件支持在k8s中删除PersistenVolume和其关联的在外部基础设施中的存储。(  For those volume plugins that support it, deletion removes both the PersistentVolume object from Kubernetes as well as deletes associated storage asset in external infrastructure such as AWS EBS, GCE PD or Cinder volume.)。 如果有合适的volume插件支持,那么会对volume循环的执行一个基本的擦除命令(rm -rf /tenvoluem/*)来使得他对新的claim变得可用。

Tpyes of Persistent Volumes

PersistenVolume类型是作为插件(plugin)实现的。k8s当前支持下面这种产检(plugin):

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • AzureFile
  • FC (Fibre Channel)
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • CephFS
  • Cinder (OpenStack block storage)
  • Glusterfs
  • VsphereVolume
  • HostPath (single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)

Persistent Volumes

每一个PV都包含一个spec和status,它是volume的规格和status

  apiVersion: v1
  kind: PersistentVolume
  metadata:
    name: pv0003
  spec:
    capacity:
      storage: 5Gi
    accessModes:
      - ReadWriteOnce
    persistentVolumeReclaimPolicy: Recycle
    nfs:
      path: /tmp
      server: 172.17.0.2

Capacity

一个PV都会有一个特定的存储能力,使用PV的capacity来设置。可以参考k8s   Resource Model 来了解capacity想达到的效果( See the Kubernetes Resource Model to understand the units expected by capacity

当前只有存储的大小可以被设置或者被请求,未来可能包括IOPS,throughput等等

Access Modes

一个PersistentVolume可以被挂在一个主机上通过任何被资源提供者支持的方式。就像下表列出来的一样,提供者有不同的能力,每一个PV的access mode被设置成指定volume所支持的特定的mode。例如,NFS可以支持多次读写的客户端( NFS can support multiple read/write clients),但是一个NFS的PV可能在server上被到处作为只读的。每一个PV通过它自己的access mode设置来描述自己特别的能力

access modes的类别为:

  • ReadWriteOnce – the volume can be mounted as read-write by a single node
  • ReadOnlyMany – the volume can be mounted read-only by many nodes
  • ReadWriteMany – the volume can be mounted as read-write by many nodes

缩写为:

  • RWO - ReadWriteOnce
  • ROX - ReadOnlyMany
  • RWX - ReadWriteMany

重要的:一个volume在同一时间,只能使用一种access mode被挂载,即使他支持多个。例如:一个GCEPersistenDisk可以在一个node中作为ReadWriteOnce被挂载或者使用ReadOnlyMany被多个node挂载,但是这两种方式不能同时存在

Volume Plugin ReadWriteOnce ReadOnlyMany ReadWriteMany
AWSElasticBlockStore x - -
AzureFile x x x
CephFS x x x
Cinder x - -
FC x x -
FlexVolume x x -
GCEPersistentDisk x x -
Glusterfs x x x
HostPath x - -
iSCSI x x -
NFS x x x
RDB x x -
VsphereVolume x - -

Recycling Policy

当前的回收策略是:

  • Retain – manual reclamation 手工回收
  • Recycle – basic scrub (“rm -rf /thevolume/*”)  基础擦除
  • Delete – associated storage asset such as AWS EBS, GCE PD or OpenStack Cinder volume is deleted

当前,只有NFS和HostPath支持Recycle 。 AWS EBS, GCE PD和Cinder存储卷支持删除

Phase

一个volumn将是下面状态中的一种

  1. Avaliable - 一个空闲的资源,还没有和claim绑定
  2. Bound - volume已经和claim绑定
  3. Released - 对应的claim已经被删除。但是资源没有被集群回收
  4. Failed --这个volume自动回收失败

The CLI will show the name of the PVC bound to the PV

PersistentVolumeClaims

每一个PVC都包括一个spec和status, 他是claim的规格和status

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

  name: myclaim

spec:

  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  selector:
    matchLabels:
      release: "stable"
    matchExpressions:

      - {key: environment, operator: In, values: [dev]}

Access Modes

参照PV access mode

Resources

Claims和pod一样,可以请求指定数量的资源。这个请求是针对存储的,  resource model 同样适用于volumes和claims

Selector

Claims可以指定一个label选择器来进一步的过滤设置的volumes。只有通过labels匹配上选择器的volumes才可以和claim绑定

选择器由两部分组成:

  1. matchLabels - volume必须有一个这个样值的label
  2. matchExpressions - values和operator把列出的key和操作符关联起来( a list of requirements made by specifying key, list of values, and operator that relates the key and values),有效的操作符包括In, NotIn,Esxists和DoesNotExist

matchLabels和matchExpressions需要同时匹配( All of the requirements, from both matchLabels and matchExpressions are ANDed together – they must all be satisfied in order to match)

Claims As Volumes

Pod通过把claim当作volume来使用存储。当Pod使用claim,Claim必须和Pod存在于相同的命名空间。集群在Pod的命名空间查找claim,并使用它得到claim的PersistentVolume( uses it to get the PersistentVolume backing the claim.)

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

        claimName: myclaim

A Note on NameSpaces

PersistentVolumes的绑定是特殊的,因为PersistentVolumeClaims在一个命名空间下,只有在同一个命名空间下的挂载请求,才能请求相同的ROX RWX( mounting claims with “Many” modes (ROXRWX) is only possible within one namespace.)

本人翻译是个渣..

时间: 2024-08-07 12:20:09

k8s pv的相关文章

快速批量创建k8s pv&pvc

快速批量创建nfs pv for i in {3..6}; do cat <<EOF | kubectl apply -f - apiVersion: v1 kind: PersistentVolume metadata: name: pv00${i} spec: capacity: storage: 100Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Recycle nfs: path: /volume1/har

K8S与Ceph RBD集成-多主与主从数据库示例

参考文章: https://ieevee.com/tech/2018/05/16/k8s-rbd.html https://zhangchenchen.github.io/2017/11/17/kubernetes-integrate-with-ceph/https://docs.openshift.com/container-platform/3.5/install_config/storage_examples/ceph_rbd_dynamic_example.htmlhttps://jim

k8s使用Glusterfs动态生成pv

一.环境介绍 [[email protected] ~]# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.31.250.152 k8s-m172.31.250.153 node1172.31.250.154 node

k8s 基于NFS部署storageclass pv自动供给

在k8s中部署有状态应用时,通常需要做数据持久化存储. 后端存储的方式有以下几种: 1.基于宿主机本地的存储方式: (重启pod时,若pod被调度到其他节点上,尽管原来节点上的数据不会丢失,但是其他节点上没有该应用存储过的数据,所以并不持久化) 2.基于本地过云存储服务的方式,如:(NFS.glusterfs.cephfs.awsElasticBlockStore.azureDisk.gcePersistentDisk等) (在资源清单中指明URL地址和共享挂载卷目录即可实现数据持久化存储) 3

k8s实践17:kubernetes对接nfs存储实现pvc动态按需创建分配绑定pv

1.开始前的想法.前面测试pv&&pvc的部署和简单配置应用,实现pod应用数据存储到pvc并且和pod解耦的目的.前面操作是全手动操作,手动创建pv,手动创建pvc,如果集群pod少,这样操作可以.假如集群有1000个以上的pod,每个pod都需要使用pvc存储数据,如果只能手动去一个个创建pv,pvc,工作量不可想像.如果可以创建pod的时候,创建pod的用户定义pvc,然后集群能够根据用户的pvc需求创建pv,实现动态的pv&&pvc创建分配.kubernetes支持

K8s数据持久化之自动创建PV

在前两篇实现k8s的数据持久化的流程为:搭建nfs底层存储===>创建PV====>创建PVC===>创建pod.最终pod中的container实现数据的持久化. 上述流程中,看似没什么问题,但细想一下,PVC在向PV申请存储空间的时候,是根据指定的pv名称.访问模式.容量大小来决定具体向哪个PV来申请空间的,如果PV的容量为20G,定义的访问模式是WRO(只允许以读写的方式挂载到单个节点),而PVC申请的存储空间为10G,那么一旦这个PVC是向上面的PV申请的空间,也就是说,那个PV

k8s存储数据持久化,emptyDir,hostPath,基于Nfs服务的PV,PVC

在docker和K8S中都存在容器是有生命周期的,因此数据卷可以实现数据持久化. 数据卷解决的主要问题: 1.数据持久性:当我们写入数据时,文件都是暂时性的存在,当容器崩溃后,host就会将这个容器杀死,然后重新从镜像创建容器,数据就会丢失. 2.数据共享:在同一个Pod中运行容器,会存在共享文件的需求. 数据卷的类型: 1.emptyDiremptyDir数据卷类似于docker数据持久化的docker manager volume,该数据卷初分配时,是一个空目录,同一个Pod中的容器可以对该

k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC

一:Statefulset StatefulSet是为了解决有状态服务的问题,对应的Deployment和ReplicaSet是为了无状态服务而设计,其应用场景包括:1.稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现2.稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现3.有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依

pv和pvc状态

原文地址:https://kubernetes.cn/topics/46 API Server 和 PVController API Server: 这个组件提供对API的支持,响应REST操作,验证API模型和更新etcd中的相应对象 PVController: 是ontroller.volume.persistentvolume.PersistentVolumeController的简称,负责监听PV和PVC资源的改动Event,取得最新的PV和PVC并维护它们之间的绑定关系. 通常情况下A