5.K8S pv和pvc
一、PV和PVC示意图1.图1[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e6w1XWiU-1623406038719)(D:\公司文件\工作文件\技术文档\K8S\PV与PVC\所用图片\pvc1.webp)]2.图2[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6h0SyuM-1623406038721)(D:\公司文件\工作
一、PV和PVC示意图
1.图1
2.图2
二、概念
一个应用肯定会跑多个pod,多个pod里面肯定会存放数据,当一个pod死了,数据也会跟着消失,因此k8s就有了pv的概念,pv就是持久化存储,相当于docker的volume,pvc就是分配pv的容量给pod
PVC 是用户存储的一种声明,PVC 和 Pod 比较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请求 CPU 和内存,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。
三、使用流程
1.配置存储空间:
由存储管理员配置存储设备(如NFS,iSCSI,Ceph RBD,Glusterfs),并且划割好了很多可被独立使用的存储空间;
2.定义PV:
k8S集群管理员将配置好的那些存储空间引入至K8S集群中,定义成PV (Persistent Volume,持久化卷);
3.定义PVC:
K8S用户在创建Pod时如果要用到PVC时,必须先创建PVC( 在K8S集群中找一个能符合条件的存储卷PV来用)。注意:PV和PVC是一一对应关系,一旦某个PV被一个PVC占用,那么这个PV就不能再被其他PVC占用,被占用的PV的状态会显示为**Bound
**。PVC创建以后,就相当于一个存储卷,可以被多个 Pod所使用。
4.使用PVC
在Pod中去使用PVC,如果符合PVC条件的PV不存在,而这时去使用这个PVC,则Pod这时会显示Pending(挂起)状态。
四.配置NFS
1.搭建NFS
单独使用一台服务器来搭建共享存储NFS
NFS服务器地址为192.168.100.111
yum -y install nfs-utils
2.创建nfs存储目录
mkdir /data2/kod_pv -p
3.准备配置文件
vim /etc/exports
/data2 192.168.100.0/24(rw,sync,no_root_squash,no_all_squash)
4.启动服务
systemctl restart rpcbind
systemctl enable rpcbind
systemctl restart nfs
systemctl enable nfs
5.查看NFS信息
[root@node7 ~]# showmount -e
Export list for node7:
/data2 192.168.100.0/24
6.在node节点上安装NFS client
yum -y install nfs-utils
五、创建PV
[root@node4 pv]# vim k8s_pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: kod-pv
labels:
pv: kod-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
path: "/data2/kod_pv" #使用NFS的发布目录
server: 192.168.100.111 #这是NFS的地址
readOnly: false
[root@node4 pv]# kubectl create -f k8s_pv.yaml
persistentvolume/kod-pv created
[root@node4 pv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS AGE
kod-pv 5Gi RWX Recycle Available 14s
此时已经创建成功,状态为可用
六、创建PVC
创建PV和PVC时,只有相同类型的STORAGECLASS才能匹配到一起,所以要设置相同的storageClassName标签
PVC 申领不必一定要请求某个类。如果 PVC 的 storageClassName 属性值设置为 “”, 则被视为要请求的是没有设置存储类的 PV 卷,因此这一 PVC 申领只能绑定到未设置 存储类的 PV 卷
当某 PVC 除了请求 StorageClass 之外还设置了 selector
,则这两种需求会按 逻辑与关系处理:只有隶属于所请求类且带有所请求标签的 PV 才能绑定到 PVC。
vim k8s_pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: kod-pvc
spec:
storageClassName: ""
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
这里的PVC的storageClassName就设置了为"" ,所有就会自动会和没有设置storageClassName的PV进行匹配进行绑定
[root@node4 pv]# kubectl create -f k8s_pvc.yaml
persistentvolumeclaim/kod-pvc created
这里PVC的状态是Bound 对应的VOLUME就是 我们刚才创建的kod-pv,说明已经绑定成功
[root@node4 pv]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES AGE
kod-pvc Bound kod-pv 5Gi RWX 37s
注意:
这里也可以同时设置pv和pvc的storageclassname 为一致的名字,这样就可以按照这个属性进行匹配了
七、创建pod
[root@node4 pv]# vim kod_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kod-deploy
spec:
selector:
matchLabels:
app: kodredis
template:
metadata:
labels:
app: kodredis
spec:
containers:
- name: pangbing-redis
image: redis
ports:
- containerPort: 3679
volumeMounts: #将卷挂载到pod的/data目录下
- name: kod-data
mountPath: /data
volumes: #将PVC 组成卷
- name: kod-data
persistentVolumeClaim:
claimName: kod-pvc
创建pod
[root@node4 pv]# kubectl create -f kod_deployment.yaml
deployment.apps/kod-deploy created
八、验证
1.进入pod
[root@node4 pv]# kubectl exec -it kod-deploy-76bf89946f-bk997 -- bash
进入到/data目录下,创建测试文件
root@kod-deploy-76bf89946f-bk997:/data# touch test
2.在NFS上查看文件
[root@node7 kod_pv]# cd /data2/kod_pv/
[root@node7 kod_pv]# ls
test
更多推荐
所有评论(0)