Kubernetes资源对象之Persistent Volumes

2017-01-19 阅读: Kubernetes Ceph

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: Recycle
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

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
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:

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
kubectl 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

参考

标题:Kubernetes资源对象之Persistent Volumes
本文链接:https://blog.frognew.com/2017/01/kubernetes-persistent-volumes.html
转载请注明出处。

目录