1. 综述
当前,存储的方式和种类有很多,并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中,放了方便我们的使用和管理,Kubernetes提出了PV和PVC的概念,这样Kubernetes集群的管理人员就可以将注意力集中到Kubernetes集群中来,而无需操心后端的存储设备了。
Kubernetes集群存储架构如下所示:
从上图可以看出,底层的存储可以使各种类型,包括NFS、Ceph、iSCSI等等,而Kubernetes会把这些存储统一抽象为PV。PV,即Persistent Volume,是集群中配置的存储资源。PVC,即Persistent Volume Claim,是用户存储的请求,通常我们在一个Pod中定义一个存储卷,定义的时候会指定该存储卷的相关信息,比如空间大小、可读可写等属性。但是PVC并不是真正的存储空间,Pod的PVC和PV之间必须建立某种联系,这样才能使得Pod可以调用实际存储空间。
2. PersistentVolume(PV)
PersistentVolume(PV)是集群中由管理员配置的一段网络存储。 它是集群中的资源,就像节点是集群资源一样。 PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。 此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。
3. PersistentVolumeClaim(PVC)
PersistentVolumeClaim(PVC)是由用户进行存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。
虽然PersistentVolumeClaims允许用户使用抽象存储资源,但是PersistentVolumes对于不同的问题,用户通常需要具有不同属性(例如性能)。群集管理员需要能够提供各种PersistentVolumes不同的方式,而不仅仅是大小和访问模式,而不会让用户了解这些卷的实现方式。对于这些需求,有StorageClass 资源。
4. StorageClass
StorageClass为管理员提供了一种描述他们提供的存储的“类”的方法。 不同的类可能映射到服务质量级别,或备份策略,或者由群集管理员确定的任意策略。 Kubernetes本身对于什么类别代表是不言而喻的。 这个概念有时在其他存储系统中称为“配置文件”。
PVC和PV是一一对应的。
5. 实战
5.1 准备nfs服务
准备nfs存储路径
[root@nfs ~]# cd /data/volumes/
[root@nfs volumes]# mkdir v{1,2,3,4,5}
[root@nfs volumes]# ls
v1 v2 v3 v4 v5
[root@nfs volumes]# echo "<h1>NFS stor 01</h1>" > v1/index.html
[root@nfs volumes]# echo "<h1>NFS stor 02</h1>" > v2/index.html
[root@nfs volumes]# echo "<h1>NFS stor 03</h1>" > v3/index.html
[root@nfs volumes]# echo "<h1>NFS stor 04</h1>" > v4/index.html
[root@nfs volumes]# echo "<h1>NFS stor 05</h1>" > v5/index.html
配置nfs将新建的路径提供共享存储
[root@nfs volumes]# vim /etc/exports
/data/volumes/v1 192.168.130.0/24(rw,no_root_squash)
/data/volumes/v2 192.168.130.0/24(rw,no_root_squash)
/data/volumes/v3 192.168.130.0/24(rw,no_root_squash)
/data/volumes/v4 192.168.130.0/24(rw,no_root_squash)
/data/volumes/v5 192.168.130.0/24(rw,no_root_squash)
[root@nfs volumes]# vim /etc/exports
/Users/harry/getting-started/data/volumes/v1 -alldirs -maproot=root:wheel -network=192.168.0.0 -mask=255.255.0.0
查看nfs的配置
LOG 实践
apiVersion: apps/v1
kind: Deployment
metadata:
name: test123
labels:
app: test123
spec:
replicas: 1
template:
metadata:
name: test123
labels:
app: test123
spec:
containers:
- name: test123
image: test-demo1:v1.0
volumeMounts:
- mountPath: /Users/harry/eclipse-workspace/test_spring_cloud_kubernate
name: mydir
- mountPath: /Users/harry/eclipse-workspace/test_spring_cloud_kubernate/test.log
name: myfile
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 250m
memory: 256Mi
restartPolicy: Always
volumes:
- name: mydir
hostPath:
# 确保文件所在目录成功创建。
path: /Users/harry/eclipse-workspace/test_spring_cloud_kubernate
type: DirectoryOrCreate
- name: myfile
hostPath:
path: /Users/harry/eclipse-workspace/test_spring_cloud_kubernate/test.log
type: FileOrCreate
selector:
matchLabels:
app: test123
---
apiVersion: v1
kind: Service
metadata:
name: test123-service
labels:
app: test123-service
spec:
selector:
app: test123
ports:
- port: 8087
targetPort: 8089
nodePort: 30082
type: NodePort
我就想存个文件,怎么这么麻烦 ?- k8s PV、PVC、StorageClass 的关系 - 掘金
注意几点
1. pv不是一个namespace资源 pv是跨namespace的共享对象,pvc是有namespace特征的
2.
其它
NFS:Network File System( 网络文件系统),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
Mac 开启nfs 服务
$ sudo nfsd enable
$ sudo nfsd start
其它
# 服务命令
sudo nfsd checkexports
sudo nfsd enable
sudo nfsd disable
sudo nfsd start
sudo nfsd stop
sudo nfsd restart
sudo nfsd status
showmount -e 192.168.0.10