kubernnetes存储-持久卷

持久卷PV和持久卷申领PVC

存储的管理是一个与计算实例的管理完全不同的问题。PersistentVolume 子系统为用户 和管理员提供了一组 API,将存储如何供应的细节从其如何被使用中抽象出来。 为了实现这点,我们引入了两个新的 API 资源:PersistentVolume 和 PersistentVolumeClaim

持久卷(PersistentVolume,PV)是集群中的一块存储,可以由管理员事先供应,或者 使用存储类(Storage Class)来动态供应。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样,也是使用 卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。

持久卷申领(PersistentVolumeClaim,PVC)表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载。

卷和申领的生命周期

PV 卷是集群中的资源。PVC 申领是对这些资源的请求,也被用来执行对资源的申领检查。 PV 卷和 PVC 申领之间的互动遵循如下生命周期。

供应:分为静态供应和动态公用(StorageClass

绑定 用户创建一个带有特定存储容量和特定访问模式需求的 PVC对PV进行一对一绑定;

使用:Pod 将 PVC 申领当做存储卷来使用。集群会检视 PVC 申领,找到所绑定的卷,并 为 Pod 挂载该卷。

保护使用中的存储对象:看到当 PVC 的状态为 Terminating 且其 Finalizers 列表中包含 kubernetes.io/pvc-protection 时,PVC 对象是处于保护状态。

回收:当用户不再使用其存储卷时,他们可以从 API 中将 PVC 对象删除,从而允许 该资源被回收再利用。回收策略:1.Recycle: 回收,2.Retain:保留,3.Delete:删除,删除PVC后PV也会被删掉,这一类的PV,需要支持删除的功能,动态存储默认方式。

预留 PersistentVolume:通过在 PersistentVolumeClaim 中指定 PersistentVolume,你可以声明该特定 PV 与 PVC 之间的绑定关系。如果该 PersistentVolume 存在且未被通过其 claimRef 字段预留给 PersistentVolumeClaim,则该 PersistentVolume 会和该 PersistentVolumeClaim 绑定到一起。

PV的yaml创建

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0003
spec:
  capacity:
    storage: 5Gi  #容量
  volumeMode: Filesystem #卷模式,支持两种卷模式(volumeModes):Filesystem(文件系统) 和 Block(块)
  accessModes:
    - ReadWriteOnce #访问模式,支持ReadWriteOnce、ReadOnlyMany、ReadWriteMany、ReadWriteOncePod
  persistentVolumeReclaimPolicy: Recycle #回收策略,支持Retain、Recycle和Deleted
  storageClassName: slow
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /tmp
    server: 172.17.0.2

Pv的状态:

Available:空闲的PV,没有被任何PVC绑定。

Bound:已经被PVC绑定

Released:PVC被删除,但是资源未被重新使用

Failed:自动回收失败

PVC的创建

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce  #访问方式
  volumeMode: Filesystem #存储模式
  resources:
    requests:
      storage: 8Gi   #资源大小
  storageClassName: slow  #存储类
  selector:    #标签选择符,满足条件的pv才能实现绑定
    matchLabels:
      release: "stable"
    matchExpressions:
      - {key: environment, operator: In, values: [dev]}

PVC和访问模式,存储模式以及资源大小和PV配置一致

申领可以设置标签选择算符 来进一步过滤卷集合。只有标签与选择算符相匹配的卷能够绑定到申领上。 选择算符包含两个字段:

  • matchLabels - 卷必须包含带有此值的标签
  • matchExpressions - 通过设定键(key)、值列表和操作符(operator) 来构造的需求。合法的操作符有 In、NotIn、Exists 和 DoesNotExist。

pod通过PVC引用PV存储资源


---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce  #访问方式
  volumeMode: Filesystem #存储模式
  resources:
    requests:
      storage: 8Gi   #资源大小
  storageClassName: slow  #存储类
  selector:    #标签选择符,满足条件的pv才能实现绑定
    matchLabels:
      release: "stable"
    matchExpressions:
      - {key: environment, operator: In, values: [dev]}
---
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

基于卷快照创建 PVC 申领

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: restore-pvc
spec:
  storageClassName: csi-hostpath-sc
  dataSource:
    name: new-snapshot-test
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

基于现有 PVC 创建新的 PVC 申领

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cloned-pvc
spec:
  storageClassName: my-csi-plugin
  dataSource:
    name: existing-src-pvc-name
    kind: PersistentVolumeClaim
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

StorageClass 资源

StorageClass 为管理员提供了描述存储 "类" 的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。 Kubernetes 本身并不清楚各种类代表的什么。这个类的概念在其他存储系统中有时被称为 "配置文件"。

每个 PV 可以属于某个类(Class),通过将其 storageClassName 属性设置为某个 StorageClass 的名称来指定。 特定类的 PV 卷只能绑定到请求该类存储卷的 PVC 申领。 未设置 storageClassName 的 PV 卷没有类设定,只能绑定到那些没有指定特定 存储类的 PVC 申领。

早前,Kubernetes 使用注解 volume.beta.kubernetes.io/storage-class 而不是 storageClassName 属性。这一注解目前仍然起作用,不过在将来的 Kubernetes 发布版本中该注解会被彻底废弃

每个 StorageClass 都包含 provisionerparameters 和 reclaimPolicy 字段, 这些字段会在 StorageClass 需要动态分配 PersistentVolume 时会使用到。

StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。 当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数,一旦创建了对象就不能再对其更新。

管理员可以为没有申请绑定到特定 StorageClass 的 PVC 指定一个默认的存储类

存储类NFS

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: example-nfs
provisioner: example.com/external-nfs
parameters:
  server: nfs-server.example.com
  path: /share
  readOnly: "false"

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种便捷的方式来管理大规模的容器化应用,并具有以下特点: 1. 高可用性和弹性伸缩:Kubernetes可以确保应用程序在整个集群中始终可用。它可以自动监测和恢复失败的容器,并根据负载情况自动调整容器数量,实现弹性伸缩。 2. 负载均衡和服务发现:Kubernetes提供内建的负载均衡机制,可以将流量均匀地分配给应用程序的多个实例。它还可以自动为应用程序分配唯一的网络地址,并提供服务发现功能,使得应用程序可以方便地互相通信。 3. 灵活的部署策略:Kubernetes支持多种部署策略,如滚动更新、蓝绿部署和金丝雀发布等。这些策略允许你在不中断服务的情况下更新应用程序,并提供了灵活的控制和回滚机制。 4. 配置和密钥管理:Kubernetes提供了一种集中管理和存储应用程序配置和密钥的方式。它支持使用ConfigMap和Secret对象来管理敏感数据,并将它们注入到应用程序的容器中。 5. 自动化操作:Kubernetes提供了一系列的自动化操作,如自动扩展、自愈能力和自动恢复等。它可以根据预定义的规则和策略来执行这些操作,减少了运维工作量。 当应用程序需要进行大规模部署、需要高可用性、负载均衡和弹性伸缩等特性时,使用Kubernetes是一个很好的选择。特别是在微服务架构和容器化应用的场景下,Kubernetes可以提供较为完善的容器编排和管理能力,简化了应用程序的部署和运维工作。此外,Kubernetes还具有丰富的生态系统和社区支持,使得它成为当前流行的容器编排平台之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忍冬行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值