【k8s配置与存储--持久化存储(PV、PVC、存储类)】

1、PV与PVC 介绍

  • 持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。
  • 持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存)。同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以挂载为 ReadWriteOnce、ReadOnlyMany、ReadWriteMany 或 ReadWriteOncePod, 请参阅访问模式)。

在这里插入图片描述

2、生命周期

2.1 构建

2.1.1 静态构建

  • 集群管理员创建若干PV卷,这些卷对象带有直实存储的细节信息,并且对集群用户可用(可见)。PV卷对象存在于Kubernetes APl中,可供用户消费(使用)·

2.1.2 动态构建

  • 如果集群中已经有的PV无法满足PVC的需求,那么集群会根据PVC自动构建一个PV,该操作是通过StorageClass实现的。
  • 想要实现这个操作,前提是PVC必须设置StorageClass,否则会无法动态构建该PV,可以通过启用DefaultStorageClass来实现PV的构建。

2.2 绑定(PV和PVC如何使用?)

  • 当用户创建一个PVC对象后,主节点会监测新的PVC对象,并且寻找与之匹配的PV卷,找到PV卷后将二者绑定在一起。
  • 如果找不到对应的PV,则需要看PVC是否设置StorageClass来决定是否动态创建PV,若没有配置,PVC就会一致处于未绑定状态,直到有与之匹配的PV后才会申领绑定关系。

2.4 使用(POD和PVC如何使用?)

  • Pod将PVC当作存储卷来使用。集群会通过PVC找到绑定的PV,并为Pod挂载该卷。
  • Pod一旦使用PVC绑定PV后,为了保护数据,避免数据丢失问题,PV对象会受到保护,在系统中无法披删除。

2.5 回收策略

  • 当用户不再使用其存储卷时,他们可以从API中将PVC对象删除,从而允许该资源被回收再利用。PersistentVolume对象的回收策路告诉集群,当其被从申领中释放时如何处理该数据卷。
    目前,数据卷可以被Retained(保留)、Recycled(回收)或Deleted(除)。

2.5.1 保留(Retain)

  • 回收策路Retain使得用户可以主动回收资源。当PersistentVolumeClaim对象被删除时,PersistentVolume卷仍然存在,对应的数据卷被视为"已释放(released)"。由于卷上仍然存在这前一申领人的数据,该卷还不能用于其他申领。管理员可以通过下面的步家来手动回收该卷:
    • 1.侧除PersistentVolume对象。与之相关的、位于外部基础设施中的存储资产(伤如AWS EBS、GCE PD、Azure Disk或Cinder卷)在PV删除之后仍然存在。
    • 2.根据情况,手动清除所关联的存储资产上的数据。
    • 3.手动删除所关联的存档资产
  • 如果你希望重用该存储资产,可以基于存储资产的定义创建新的PersistentVolume卷对象。

2.5.2 删除(Delete)

  • 对于支持Delete回收策路的卷插件,册除动作会将PersistentVolume对象从Kubernetes中移除,同时也会从外部础设施(如AWS EBS、GCE PD、Azure Disk或Cinder卷)中移除所关联的存储资产。动态制备的卷会继承基StorageClass中设置的回收策略,该策路默认为Delete。管理员需要根据用户的期望来配置StorageClass: 否则PV卷被创建之后必须要被偏辑或者修补。

2.5.3 回收(Recycled)

  • 警告:回收策路Recycle已被废弃。取而代之的建议方案是使用动态制备。
  • 如果下层的卷插件支持,回收策路Recycle会在卷上执行一些基本的擦除 ( rm-f /thevolume/* )操作,之后允许该卷用于新的PVC申领。

3、PV

3.1 配置文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-01
spec:
  capacity:
    storage: 5Gi  # PV的容量
  volumeMode: Filesystem #存储类型为文件系统
  accessModes: # 访问模式:ReadWriteOnce、ReadWriteMany、ReadonlyMany
    - ReadWriteMany # 可被单节点独写
  persistentVolumeReclaimPolicy: Retain  # 回收策略
  storageClassName: slow   #创建PV的存储类名,需要与pvc的相同
  mountOptions: # 加载配置
    - hard
    - nfsvers=4.1
  nfs: # 连接到nfs
  path: /data/nfs/rw/pv-01  # 存储路径
  server: 10.10.10.100   # nfs服务地址

3.2 创建这个pv资源

[root@k8s-master pv]# kubectl create -f pv-01.yaml
persistentvolume/pv-01 created

3.3 查看PV的状态

  • Availabel:空闲,未被绑定
  • Bound:已经被PVC绑定
  • Released:PVC被删除,资源已回收,但是PV未被重新使用
  • Failed:自动回收失败
[root@k8s-master pv]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-01   5Gi        RWX            Retain           Available           slow                    16s

4、PVC

4.1 配置文件

  • PVC和PV绑定的时候需要注意yaml中这几个参数都需要一一对应
  • spec.accessModes: # 权限需要和对应的pv相同
  • spec.volumeMode: # 数据卷类型需要和pv相同
  • spec.resources.requests.storage: # 数据卷大小只能小于等于pv的大小,大于pv的大小也是无法匹配的。
  • spec.storageClassName: # 设置的属性名字必须和pv相同
apiVersion: v1
kind: PersistentVolumeClaim  # 资源类w为PVC
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany # 权限需要与对应的pv相同
  volumeMode: Filesystem
  resources:
    requests:
      storage: 5Gi # 资源可以小于pv的,但是不能大于,如果大于就会匹配不到pv
  storageClassName: slow # 名字需要与对应的pv相同
#    selector: # 使用选择器选择对应的pw
#      matchLabels:
#        release: "stable"
#      matchExpressions:
#        - {key:environment,operator:In,values:[dev]}

4.2 创建这个pvc资源

[root@k8s-master pv]# kubectl create -f pvc-01.yaml
persistentvolumeclaim/nfs-pvc created

4.3 查看PVC的状态

  • 这里可以看到pvc的状态是Bound,并且挂在的数据卷是pv-01,他的属性是RWX(可读可写可执行)
[root@k8s-master pv]# kubectl get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc   Bound    pv-01    5Gi        RWX            slow           6s

4.4 查看pv的状态

  • 可以看到PV的状态已经变为了Bound(已经被PVC绑定)。
[root@k8s-master pv]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
pv-01   5Gi        RWX            Retain           Bound    default/nfs-pvc   slow                    16m

4.5 pod和pvc进行绑定

4.5.1 创建pod配置文件

apiVersion: v1
kind: Pod
metadata:
  name: nfs-pvc-pod
spec:
  containers:
  - image: nginx:1.20
    name: nginx-pvc
    volumeMounts:
    - mountPath: /usr/share/nginx/html   # 挂载到容器哪个目录
      name: nfs-pvc    # 挂载的数据卷的名字
  volumes:
  - name: nfs-pvc
    persistentVolumeClaim: # 关联PVC
      claimName: nfs-pvc   # 关联到那个pvc,填写这个pvc的名字

4.5.2 创建这个pod资源

[root@k8s-master pv]# kubectl create -f nfs-pvc-pod.yaml
pod/nfs-pvc-pod created

4.5.3 查看pod资源信息

[root@k8s-master pv]# kubectl get po   -o wide
NAME                           READY   STATUS      RESTARTS       AGE     IP          NODE          NOMINATED NODE   READINESS GATES
configfile-po                  0/1     Completed   0              21h     10.2.1.69   k8s-node-02   <none>           <none>
dns-test                       1/1     Running     2 (31h ago)    3d15h   10.2.1.58   k8s-node-02   <none>           <none>
emptydir-volume-pod            2/2     Running     34 (47m ago)   17h     10.2.1.72   k8s-node-02   <none>           <none>
fluentd-59k8k                  1/1     Running     1 (31h ago)    2d22h   10.2.2.34   k8s-node-01   <none>           <none>
fluentd-hhtls                  1/1     Running     1 (31h ago)    2d22h   10.2.1.59   k8s-node-02   <none>           <none>
host-volume-pod                1/1     Running     0              18h     10.2.1.71   k8s-node-02   <none>           <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值