【 云原生 | kubernetes 】资源对象 - 持久化存储PV,PVC

前言:这篇文章我们了解了Volume ,还有Project Volume这个特殊的卷,它不是用来存储容器的数据,而是为容器提供预先定义好的数据。今天我们了解一下持久卷(Persistent Volume)

概念

PV 描述的是持久化存储数据卷 。

PVC 描述的是使用存储话存储的一些属性 。

“持久化 Volume”,指的就是这个宿主机上的目录,具备“持久性”。如果PV比作一台物理机,那么PVC就是被用户根据需求,可以任意分配CPU,内存,磁盘的虚拟机,这应该可以很好理解两个之间的关系。

在这里插入图片描述

例子

[root@ycloud ycloud]# cat pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume
  labels:
    type: local
spec:
#  storageClassName: nfs-sc
  volumeMode: Filesystem   ###卷模式
  capacity:				###容量
    storage: 10Gi
  accessModes:			###访问模式
    - ReadWriteOnce
  hostPath:				
    path: /data/pv/

字段简述

  1. 容量:每个PV卷都要确定自己的存储容量。 容量属性是通过 PV 对象的 capacity 属性来设置的。
  2. 访问模式:PersistentVolume 卷可以用资源提供者所支持的任何方式挂载到宿主系统上。
  3. 卷模式: Kubernetes 支持两种卷模式(volumeModes):Filesystem(文件系统)Block(块) ,默认是Filesystem
  4. hostPath 卷能将主机节点文件系统上的文件或目录挂载到你的 Pod 中 。

🌈 HostPath 卷存在许多安全风险,最佳做法是尽可能避免使用 HostPath。 当必须使用 HostPath 卷时,它的范围应仅限于所需的文件或目录,并以只读方式挂载。

访问模式有:

  • ReadWriteOnce(RWO):卷可以被一个节点以读写方式挂载。 ReadWriteOnce 访问模式也允许运行在同一节点上的多个 Pod 访问卷。
  • ReadOnlyMany(ROX):卷可以被多个节点以只读方式挂载。
  • ReadWriteMany(RWX):卷可以被多个节点以读写方式挂载。
  • ReadWriteOncePod(RWOP):卷可以被单个 Pod 以读写方式挂载

🗝通过访问模式来匹配 PVPVC

PV

让我们创建这个PV,并查看其状态。

[root@ycloud ycloud]# kubectl apply -f pv.yaml 
persistentvolume/pv-volume created
[root@ycloud ycloud]# kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                        STORAGECLASS                   REASON   AGE
pv-volume       10Gi       RWO            Retain           Available     17s

这里我们可以看到我们创建的名为 pv-volume 的PV已经创建成功,状态为 Available 可用状态,下来让我们创建其对应的PVC

PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-volume
spec:
#  storageClassName: nfs-sc
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

这里需要注意的是:

  • PV和PVC的.spec字段.PV的存储大小,必须要满足PVC的要求。换句话说,PVC的容量设定不能大于PVC的容量,不然匹配不成功就无法绑定PV。
  • 如果创建PV是用了存储类(storageClass),PVPVC中定义的storageClassName字段必须保持一致。

⚡️让我们来创建PVC

[root@ycloud ycloud]# kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                        STORAGECLASS                   REASON   AGE
pv-volume       10Gi       RWO            Retain           Bound    default/pvc-volume                                                   3m32s
[root@ycloud ycloud]# kubectl get pvc
NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-volume   Bound    pv-volume   10Gi       RWO                           11s

这里我们看到PVPVC已经绑定成功都为Bound状态,从CLAIM可以清楚的看到PV的绑定对象是default NameSpce下的名为pvc-volume的PVC,也可以查看其描述信息。

[root@ycloud ycloud]# kubectl describe pv pv-volume
Name:            pv-volume
Labels:          type=local
Annotations:     pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    
Status:          Bound
Claim:           default/pvc-volume
Reclaim Policy:  Retain
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        10Gi
Node Affinity:   <none>
Message:         
Source:
    Type:          HostPath (bare host directory volume)
    Path:          /data/pv/
    HostPathType:  
Events:            <none>

在PV和PVC成功绑定之后,就可以被容器使用起来。让我们创建一个Pod来使用hostPath这个Volume

[root@ycloud ycloud]# cat pod.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: test-pvc
spec:
  containers:
  - name: web
    image: nginx
    ports:
      - name: web
        containerPort: 80
    volumeMounts:
        - name: nginx
          mountPath: "/var/log/nginx/"
  volumes:
  - name: nginx
    persistentVolumeClaim:
      claimName: pvc-volume

⚡️ 可以看到,Pod只需要在volumes字段声明自己要使用的PVC名字就可以了。一切准备就绪之后让我们创建这个Pod

[root@ycloud ycloud]# kubectl apply  -f pod.yaml 
pod/test-pvc created
[root@ycloud ycloud]# kubectl get po -o wide
NAME                               READY   STATUS       RESTARTS       AGE     IP               NODE     NOMINATED NODE   READINESS GATES
test-pvc                           1/1     running   		0          8m39s   100.111.212.40          ycloud   <none>           <none>

我们这里是把Nginx服务的日志挂在了Volume,我们可以查看挂载目录,日志已经被存储到我们指定的路径下。

[root@ycloud ycloud]# ls /data/pv/
access.log  error.log 

我们也可以定义一个NFS类型的PV,如下所示。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.100.10
    path: "/"

总结

我们这里只是使用一个简单案例,阐述了PV和PVC的作用。不过如果在生产环境中,可能会有更多的PVC需要创建、绑定。我们不可能依靠人工去创建它,下一篇我们了解一下存储类,可以自动帮我们创建的PVC去绑定PV。

参考文献
https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力做一名技术

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

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

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

打赏作者

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

抵扣说明:

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

余额充值