PV和PVC的概念
Kubernetes的Persistent Volume是对存储的抽象,这个抽象包含两个资源:
- 持久化卷 PersistentVolume,后边简称PV
- 持久卷申请PersistentVolumeClaim,后边简称PVC
PV是集群中的一块网络存储,也是Kubernetes集群的一种资源。 Pod的Volume与PV的区别是:Volume的生命周期和Pod相同,Pod被删除时,Volume和保存在Volume中的数据就被删除了;对于PV,即使挂载PV的Pod被删除了,PV仍然存在,PV上的数据也还在。
PVC是用户对PV资源的申请,例如申请特定的访问模式和大小。
创建PV
首先在ceph集群上创建pool image
rbd create kube/pv001-image --size 1024
rbd feature disable pv001-image exclusive-lock, object-map, fast-diff, deep-flatten --pool kube将pv001-image映射到内核:
rbd map pv001-image --pool kube
/dev/rbd1格式化pv001-image:
mkfs.ext4 /dev/rbd1接下来创建PV:
pv001.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
rbd:
monitors:
- 192.168.61.31:6789
pool: kube
image: pv001-image
user: admin
secretRef:
name: ceph-secret
fsType: ext4
readOnly: false
persistentVolumeReclaimPolicy: Recyclekubectl create -f pv001.yml
persistentvolume "pv001" created
kubectl get pv
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
pv001 1Gi RWO Recycle Available 32s创建PVC
PVC是对PV资源的请求,这个请求本身也是一种资源,请求资源的存在便于管理以及Pod复用。
myclaim.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gikubectl create -f myclaim.yml
persistentvolumeclaim "myclaim" created
kubectl get pv
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
pv001 1Gi RWO Recycle Bound default/myclaim 7m
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
myclaim Bound pv001 1Gi RWO 1m创建Pod
创建一个使用该PVC的Pod, pvctestpod.yml:
apiVersion: v1
kind: Pod
metadata:
name: pvctestpod
spec:
containers:
- name: pvctest
image: alpine
command: ["tail"]
volumeMounts:
- name: myvol
mountPath: /data
readOnly: false
volumes:
- name: myvol
persistentVolumeClaim:
claimName: myclaimkubectl create -f pvctestpod.yml
pod "pvctestpod" created
kubectl get pod
NAME READY STATUS RESTARTS AGE
pvctestpod 1/1 Running 0 2m下面简单试验一下,进入到容器中在/data目录下创建几个文件:
cd /data
echo 'hello' > hello
echo 'world' > world删除这个Pod:
kubectl delete pod pvctestpod删除一下所有已经停止的容器:
docker container prune重新创建这个Pod:
kubectl create -f pvctestpod.yml进入这个Pod中查看数据还在:
kubectl exec -it pvctestpod ash
ls /data/
hello world
cat hello
hello
cat world
world