云原生 | kubernetes 资源对象 - 持久化存储PV,PVC
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生 | kubernetes 资源对象 - 持久化存储PV,PVC相关的知识,希望对你有一定的参考价值。
概念
PV
描述的是持久化存储数据卷 。
PVC
描述的是使用存储话存储的一些属性 。
例子
[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/
字段简述
- 容量:每个PV卷都要确定自己的存储容量。 容量属性是通过 PV 对象的
capacity
属性来设置的。 - 访问模式:PersistentVolume 卷可以用资源提供者所支持的任何方式挂载到宿主系统上。
- 卷模式: Kubernetes 支持两种卷模式(
volumeModes
):Filesystem(文件系统)
和Block(块)
,默认是Filesystem hostPath
卷能将主机节点文件系统上的文件或目录挂载到你的 Pod 中 。
访问模式有:
- ReadWriteOnce(RWO):卷可以被一个节点以读写方式挂载。 ReadWriteOnce 访问模式也允许运行在同一节点上的多个 Pod 访问卷。
- ReadOnlyMany(ROX):卷可以被多个节点以只读方式挂载。
- ReadWriteMany(RWX):卷可以被多个节点以读写方式挂载。
- ReadWriteOncePod(RWOP):卷可以被单个 Pod 以读写方式挂载
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),
PV
和PVC
中定义的storageClassName字段必须保持一致。
:zap:让我们来创建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
:zap: 可以看到,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/
以上是关于云原生 | kubernetes 资源对象 - 持久化存储PV,PVC的主要内容,如果未能解决你的问题,请参考以下文章
云原生之kubernetes实战k8s集群下的DaemonSet 高级资源对象
云原生 | kubernetes 资源对象 - 控制器模型之Deployment
云原生 | kubernetes 资源对象 - 持久化存储PV,PVC
云原生之kubernetes实战k8s集群核心资源对象之Pod