K8s创建持久化存储PV和PVC(kubernetes v1.23)
一、临时存储
当pod的存储方案设定为emptydir的时候,pod启动时就会在pod所在节点的磁盘空间开辟出一块空卷,pod启动后容器产生的数据会存放到那个空卷中,供pod内的容器读取和写入数据,一旦pod容器消失,节点上开辟出的这个临时空间就会随着pod销毁。
二、半持久化存储
hostpath类型则是映射node文件系统中的文件或者目录到pod里。因为在k8s中pod会漂移,当pod漂移到其他node节点的时候,pod不会跨节点的去读取目录。所以说是一种半持久化的存储方式
三、持久化存储
PV是集群中的一块存储,是集群资源,是持久化存储,对存储资源进行抽象。和普通的 Volume 一样,也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。
PVC是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 可以请求特定的大小和访问模式。
PV、PVC生命周期Provisioning ——-> Binding ——–>Using——>Releasing——>Recycling
PV和PVC是最常见的使用存储的方式。
k8s PV 是什么?
PersistentVolume(PV)是群集中的一块存储,由管理员配置或使用存储类动态配置。 它是集群中的资源,就像 pod 是 k8s 集群资源一样。 PV 是容量插件,如 Volumes,其生命周期独立于使用 PV 的任何单个 pod。
k8s PVC 是什么?
PersistentVolumeClaim(PVC)是一个持久化存储卷,我们在创建 pod 时可以定义这个类型的存储卷。 它类似于一个 pod。 Pod 消耗节点资源,PVC 消耗 PV 资源。 Pod 可以请求特定级别的资源(CPU 和内存)。 pvc 在申请 pv 的时候也可以请求特定的大小和访问模式(例如,可以一次读写或多次只读)。
创建一个使用PV和PVC的Pod
- 配置nfs服务:
[root@k8s-master ~]# yum install nfs-utils rpcbind –y |
注意,K8s集群的各个节点都需要安装nfs-utils: yum install nfs-utils
,要不然会导致wrong fs type, bad option, bad superblock
异常。
/etc/exports文件参数:
/cloud-demo:共享目录 |
nfs服务自检
exportfs -arv
如果配置有问题,则会有提示报错信息,根据提示解决问题即可:
[root@k8s-master StorageClass]# exportfs -arv
exporting *:/data/volumes
exportfs: Failed to stat /data/volumes: No such file or directory
exporting *:/cloud-demo
exporting *:/pv-pvc正常提示:
[root@k8s-master volumes]# exportfs -arv
exporting *:/data/volumes
exporting *:/cloud-demo
exporting *:/pv-pvc重启nfs服务:
[root@k8s-master ~]# systemctl restart rpcbind
[root@k8s-master ~]# systemctl restart nfs
[root@k8s-master ~]# systemctl restart nfs-server查看nfs服务:
[root@k8s-master ~]# showmount
Hosts on k8s-master:
[root@k8s-master ~]# showmount -e
Export list for k8s-master:
/cloud-demo *
/pv-pvc *开放端口:
另外,特别注意,开放端口,不然其他主机不能访问tcp 111
udp 111
tcp 2049
udp 4046进入挂载目录创建 pv1 目录
[root@master ~]# cd /pv-pvc/
[root@master pv-pvc]# mkdir pv1
[root@master pv-pvc]# ls
pv1创建PV
[root@master tmp]# vi pv1.yaml
[root@master tmp]# kubectl apply -f pv1.yaml
persistentvolume/mypv created
[root@master tmp]# cat pv1.yaml
apiVersion: v1
kind: PersistentVolume #注意类型
metadata:
name: mypv #PVC要调用
spec:
capacity: #指定PV容量
storage: 1Gi
accessModes: #指定访问模式
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle #指定回收策略
nfs: #配置nfs服务器信息
path: /cloud-demo/data1
server: 10.100.57.178————————————————————————————————————————————————
accessModes
ReadWriteOnce: 该卷能够以读写模式被加载到一个节点上。
ReadOnlyMany: 该卷能够以只读模式加载到多个节点上。
ReadWriteMany: 改卷能够以读写模式加载到多个节点上。
persistentVolumeReclaimPolicy
Retain(保留) :不删除,需手动回收
Recycle(回收):基本擦除,类似rm -rf ,使它可供其他PVC申请。
Delete(删除) :关联存储将被删除。查看PV
[root@master tmp]# kubectl get pv |
- 创建 PVC
[root@master tmp]# vi pvc1.yaml
[root@master tmp]# kubectl apply -f pvc1.yaml
persistentvolumeclaim/mypvc created
[root@master tmp]# cat pvc1.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteMany
volumeName: mypv
resources:
requests:
storage: 1Gi - 对比查看PV的状态从Avilable变为Bound,pvc的状态也是Bound。
[root@master tmp]# kubectl get pvc |
- 创建Pod,使用该PVC
[root@master tmp]# vi testpod.yaml
[root@master tmp]# kubectl apply -f testpod.yaml
pod/pvc-pod created
[root@master tmp]# cat testpod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pvc-pod
spec:
containers:
- name: pvc-pod
args:
- /bin/sh
- -c
- sleep 30000;
image: centos
volumeMounts:
- mountPath: /pv-pvc
name: pvc-volume
volumes:
- name: pvc-volume
persistentVolumeClaim:
claimName: mypvc - 另一个使用PVC示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: newshomebg
namespace: mod
labels:
app: newshomebg
spec:
replicas: 1
selector:
matchLabels:
app: newshomebg
template:
metadata:
labels:
app: newshomebg
spec:
containers:
- name: newshomebg
image: xxx
ports:
- containerPort: 8080
env:
- name: SPRING_DATASOURCE_USERNAME
value: 'root'
volumeMounts:
- name: nfs-volume #设置的名称,和下面的name要一样的
mountPath: /home/uploads #需要挂载的目录
subPath: newshomebg #卷的子目录,也就是在nfs服务目录里生成这个子目录
volumes:
- name: nfs-volume #这个卷的名称,和上面的name要一样的
nfs: #这里是nfs挂载
server: 192.168.1.2 #nfs服务器的ip或者域名
path: "/data" #nfs服务配置的挂载目录
imagePullSecrets:
- name: xxx