k8s的数据管理有多种形式,包括:
1、Volume
1.1、emptyDir
是最基础的Volume类型,一个empryDir Volume是Host上的一个空目录。
emptyDir Volume的生命周期与Pod一致。
1.2、hostPath
hostPath Volume的作用是将Docker Host文件系统中已经存在的目录mount给Pod的容器。
2、外部Storage Provider
如果k8s部署在公有云上,可以直接使用云硬盘作为Volume。
3、PersistentVolume(pv)和PersistentVolumeClaim(pvc) --重点--
一、概念
PersistentVolume(pv)
是外部存储系统中的一块存储空间,由管理员创建和维护。与Volume一样,PV具有持久性,生命周期独立于Pod。
PersistentVolumeClaim(pvc)
是对PV的申请。pvc通常由普通用户创建和维护。
饭饭理解:
就是由管理员创建一个大的目录pv,比如/fanfan;然后其他人就可以在此目录下创建各自所需要的目录了,就是pvc,比如/fanfan/test1,/fanfan/test2,...
二、实战
要使用pv/pvc的存储方式,就必须要有一个共享的文件目录了,让k8s集群内的所有服务器全部都可以访问到,这里使用nfs创建一个共享目录。
[root@cma-cluster-slave4 home]# showmount -e
Export list for cma-cluster-slave4:
/home/lyn/sharedata *
[root@cma-cluster-slave4 home]# mkdir -p /home/lyn/sharedata/kafkatest #在创建pv之前,要创建此文件夹
下面创建pv的配置文件:
[root@cma-cluster-slave4 home]# vim nfs-kafka-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: kafka-pv
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce #这儿的权限模式,千万记住要需要挂载的YAML文件的权限模式一样,否则会报找不见storageClass的错误。
persistentVolumeReclaimPolicy: Recycle
storageClassName: cun
nfs:
path: /home/lyn/sharedata/kafkatest
server: 10.14.83.149
accessModes 指定访问模式:
ReadWriteOnce:表示 PV 能以 read-write 模式 mount 到单个节点;
ReadOnlyMany:表示 PV 能以 read-only 模式 mount 到多个节点;
ReadWriteMany:表示 PV 能以 read-write 模式 mount 到多个节点;
persistentVolumeReclaimPolicy 指定pv的回收策略
Retain:表示需要管理员手工回收
Recycle:表示清除pv中的数据,效果相当于执行rm -rf /home/lyn/sharedata/kafka-pv/*
Delete:表示删除Storage Provider上的对应存储资源,比如:OpenStack Cinder Volume等
storageClassName 指定 pv 的 class 为 cun。相当于为 pv 设置了一个分类,pvc 可以指定 class 申请相应 class 的 pv 。
path:指定pv在cun服务器上对应的目录
创建pv的服务:
[root@cma-cluster-slave4 home]# kubectl apply -f nfs-kafka-pv.yaml
[root@cma-cluster-slave4 home]# kubectl get pv
STATUS 为 Available,表示nfs-kafka.yaml就绪,可以被pvc申请。
下面创建pvc的配置文件:
从pv即kafka-py申请资源
[root@cma-cluster-slave4 home]# vim nfs-kafka-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: kafka-pvc
spec:
accessModes:
- ReadWriteOnce #这儿的权限模式,千万记住要需要挂载的YAML文件的权限模式一样,否则会报找不见storageClass的错误。
resources:
requests:
storage: 1Gi
storageClassName: cun
创建pvc的服务
[root@cma-cluster-slave4 home]# kubectl apply -f nfs-kafka-pvc.yaml
[root@cma-cluster-slave4 home]# kubectl get sv,svc -o wide
从输出界面可以看到 STATUS 已经变成 Bound,申请成功。
[root@cma-cluster-slave4 home]# kubectl get sv,svc -o wide
下面创建pod的配置文件
[root@cma-cluster-slave4 home]# vim pod.yaml
kind: pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
- name: mypod
image: busybox
args:
- /bin/sh
- -c
- sleep 30000
volumeMounts:
- mountPath: "/mydata"
name: mydata
volumes:
- name: mydata
persistentVolumeClaim:
claimName: kafka-pvc
创建pod服务
[root@cma-cluster-slave4 home]# kubectl apply -f pod.yaml
[root@cma-cluster-slave4 home]# kubectl get pod -o wide