前言:这篇文章我们了解了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/
capacity
属性来设置的。volumeModes
):Filesystem(文件系统)
和 Block(块)
,默认是FilesystemhostPath
卷能将主机节点文件系统上的文件或目录挂载到你的 Pod 中 。HostPath 卷存在许多安全风险,最佳做法是尽可能避免使用 HostPath。 当必须使用 HostPath 卷时,它的范围应仅限于所需的文件或目录,并以只读方式挂载。
访问模式有:
通过访问模式来匹配
PV
和PVC
让我们创建这个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
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-volume
spec:
# storageClassName: nfs-sc
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
这里需要注意的是:
PV
和PVC
中定义的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
这里我们看到PV
和PVC
已经绑定成功都为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/