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

1rbd create kube/pv001-image --size 1024
2rbd feature disable pv001-image exclusive-lock, object-map, fast-diff, deep-flatten --pool kube

将pv001-image映射到内核:

1rbd map pv001-image --pool kube
2/dev/rbd1

格式化pv001-image:

1mkfs.ext4 /dev/rbd1

接下来创建PV:

pv001.yml

 1apiVersion: v1
 2kind: PersistentVolume
 3metadata:
 4  name: pv001
 5spec:
 6  capacity:
 7    storage: 1Gi
 8  accessModes:
 9    - ReadWriteOnce
10  rbd:
11    monitors:
12      - 192.168.61.31:6789
13    pool: kube
14    image: pv001-image
15    user: admin
16    secretRef:
17      name: ceph-secret
18    fsType: ext4
19    readOnly: false
20  persistentVolumeReclaimPolicy: Recycle
1kubectl create -f pv001.yml
2persistentvolume "pv001" created
3
4kubectl get pv
5NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     REASON    AGE
6pv001     1Gi        RWO           Recycle         Available                       32s

创建PVC

PVC是对PV资源的请求,这个请求本身也是一种资源,请求资源的存在便于管理以及Pod复用。

myclaim.yml

 1apiVersion: v1
 2kind: PersistentVolumeClaim
 3metadata:
 4  name: myclaim
 5spec:
 6  accessModes:
 7    - ReadWriteOnce
 8  resources:
 9    requests:
10      storage: 1Gi
 1kubectl create -f myclaim.yml
 2persistentvolumeclaim "myclaim" created
 3
 4kubectl get pv
 5NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM             REASON    AGE
 6pv001     1Gi        RWO           Recycle         Bound     default/myclaim             7m
 7
 8kubectl get pvc
 9NAME      STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
10myclaim   Bound     pv001     1Gi        RWO           1m

创建Pod

创建一个使用该PVC的Pod, pvctestpod.yml:

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: pvctestpod
 5spec:
 6  containers:
 7  - name: pvctest
 8    image: alpine
 9    command: ["tail"]
10    volumeMounts:
11    - name: myvol
12      mountPath: /data
13      readOnly: false
14  volumes:
15  - name: myvol
16    persistentVolumeClaim:
17      claimName: myclaim
1kubectl create -f pvctestpod.yml
2pod "pvctestpod" created
3
4kubectl get pod
5NAME                    READY     STATUS     RESTARTS   AGE
6pvctestpod              1/1       Running    0          2m

下面简单试验一下,进入到容器中在/data目录下创建几个文件:

1cd /data
2echo 'hello' > hello
3echo 'world' > world

删除这个Pod:

1kubectl delete  pod pvctestpod

删除一下所有已经停止的容器:

1docker container prune

重新创建这个Pod:

1kubectl create -f pvctestpod.yml

进入这个Pod中查看数据还在:

 1kubectl exec -it pvctestpod ash
 2
 3
 4ls /data/
 5hello  world
 6
 7cat hello
 8hello
 9cat world
10world

参考