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

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

将pv001-image映射到内核:

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

格式化pv001-image:

1
mkfs.ext4 /dev/rbd1

接下来创建PV:

pv001.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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: Recycle
1
2
3
4
5
6
kubectl 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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
kubectl 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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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: myclaim
1
2
3
4
5
6
kubectl create -f pvctestpod.yml
pod "pvctestpod" created

kubectl get pod
NAME                    READY     STATUS     RESTARTS   AGE
pvctestpod              1/1       Running    0          2m

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

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

删除这个Pod:

1
kubectl delete  pod pvctestpod

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

1
docker container prune

重新创建这个Pod:

1
kubectl create -f pvctestpod.yml

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
kubectl exec -it pvctestpod ash


ls /data/
hello  world

cat hello
hello
cat world
world

参考