Kubernetes资源对象之Persistent Volumes
2017-01-19
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