Kubernetes持久化存储2
一、简介本文在“创建PV,创建PVC挂载PV,创建POD挂载PVC”这个环境的基础上,进行各种删除实验,并记录、分析各资源的状态。
二、实验脚本
实验创建了一个PV、一个PVC挂载了PV、一个POD挂载PVC,并编写了两个简单的小脚本来快速创建和删除环境。对应的脚本如下所示:
需要注意的是在创建PV时,PV并不会去检查你配置的server是否真的存在;也不会检查server上是否有一个可用的NFS服务;当然更不会检查你设置的storage大小是否真有那么大。个人感觉PV的设置只是一个声明,系统并不会对此做任何检查。PVC的挂载也只是根据配额的大小和访问模式,过滤一下PV,并以最小的代价支持。
# cat nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0001
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany persistentVolumeReclaimPolicy: Recycle
nfs:
path:
"/data/disk1" server:
192.168.20.47 readOnly:
false
[iyunv@k8s
-master pv]# cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs
-pvc
spec:
accessModes:
- ReadWriteMany resources:
requests:
storage: 1Gi
[iyunv@k8s
-master pv]# cat test-pvc-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test
-nfs-pvc labels:
name: test
-nfs-pvc
spec:
containers:
- name: test-nfs-pvc image: registry:
5000/back_demon:1.0 ports:
- name: backdemon containerPort:
80 command:
- /run.sh volumeMounts:
- name: nfs-vol mountPath:
/home/laizy/test/nfs-pvc volumes:
- name: nfs-vol persistentVolumeClaim:
claimName: nfs
-pvc
[iyunv@k8s
-master pv]# cat start.sh
#
!/bin/bash
kubectl create
-f nfs-pv.yaml
kubectl create
-f pvc.yaml
kubectl create
-f test-pvc-pod.yaml
[iyunv@k8s
-master pv]# cat remove.sh
#
!/bin/bash
kubectl delete pod test
-nfs-pvc
kubectl delete persistentvolumeclaim nfs
-pvc
kubectl delete persistentvolume pv0001
[iyunv@k8s
-master pv]#
三、删除PV实验
创建PV,创建PVC挂载PV,创建POD挂载PVC。在删除PV后,PVC状态从Bound变为Lost,Pod中的Volume仍然能用,数据也没有被删除。
# ./start.sh
persistentvolume
"pv0001" created
persistentvolumeclaim
"nfs-pvc" created
pod
"test-nfs-pvc" created
[iyunv@k8s
-master pv]# kubectl get persistentvolume
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
pv0001 5Gi RWX Recycle Bound default
/nfs-pvc 15s
[iyunv@k8s
-master pv]# kubectl get persistentvolumeclaim
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
nfs
-pvc Bound pv0001 5Gi RWX 18s
[iyunv@k8s
-master pv]# kubectl get pod test-nfs-pvc
NAME READY STATUS RESTARTS AGE
test
-nfs-pvc 1/1 Running 0 39s
[iyunv@k8s
-master pv]# kubectl delete persistentvolume pv0001
persistentvolume
"pv0001" deleted
[iyunv@k8s
-master pv]# kubectl get persistentvolume
No resources found.
[iyunv@k8s
-master pv]# kubectl get persistentvolumeclaim
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
nfs
-pvc Lost pv0001 0 1m
[iyunv@k8s
-master pv]# kubectl get pod test-nfs-pvc
NAME READY STATUS RESTARTS AGE
test
-nfs-pvc 1/1 Running 0 1m
[iyunv@k8s
-master pv]# kubectl exec -ti test-nfs-pvc /bin/bash
[iyunv@test
-nfs-pvc /]# cd /home/laizy/test/nfs-pvc/
[iyunv@test
-nfs-pvc nfs-pvc]# ls
2.out
# exit
exit
#
四、删除PVC实验
4.1清空Pod设置
设置PV时,如果设置了回收策略是“回收”的时候,在删除PVC时,系统(Controller-Manager)会启动一个recycler的Pod,用于清理数据卷中的内容。每种数据卷的回收Pod是不同的,都有自己特定的逻辑。本文以NFS为例,给出具体配置及Pod描述如下:
# cat /etc/kubernetes/controller-manager #配置完成后请重启controller-manager
###
# The following values are used to configure the kubernetes controller
-manager
# defaults from config and apiserver should be adequate
# Add your own
!
KUBE_CONTROLLER_MANAGER_ARGS
="--pv-recycler-pod-template-filepath-nfs=/etc/kubernetes/recycler.yaml"
[iyunv@k8s
-master ~]# cat /etc/kubernetes/recycler.yaml
apiVersion: v1
kind: Pod
metadata:
name: pv
-recycler- namespace: default
spec:
restartPolicy: Never
volumes:
- name: vol hostPath:
path:
/any/path/it/will/be/replaced containers:
- name: pv-recycler image:
"docker.io/busybox" imagePullPolicy: IfNotPresent
command: [
"/bin/sh", "-c", "test -e /scrub && rm -rf /scrub/..?* /scrub/.[!.]* /scrub/*&& test -z \"$(ls -A /scrub)\" || exit 1"] volumeMounts:
- name: vol mountPath:
/scrub
[iyunv@k8s
-master ~]#
如果不进行上面的设置的话,默认回收Pod用的image是gcr上的busybox,因为种种原因,在国内是无法下载的(即使你的机器上有gcr的busybox也不可以,还需要设置镜像下载策略为IfNotPresent,否则会一直去gcr查询是否有新版本的镜像,这也会导致imagePullError)。所以必须要在Controller-Manager中进行设置,设置成随便哪个busybox。
4.2删除实验
创建PV,创建PVC挂载PV,创建POD挂载PVC。删除PVC后,PV状态从Bound变为Available,系统(controller-manager)调用持久化存储清理插件(recycler-for-pv0001),将PVC对应的PV清空。Pod中的Volume仍然能用,但volume中的数据被删除了。
# ./start.sh
persistentvolume
"pv0001" created
persistentvolumeclaim
"nfs-pvc" created
pod
"test-nfs-pvc" created
[iyunv@k8s
-master pv]# kubectl get persistentvolume
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
pv0001 5Gi RWX Recycle Bound default
/nfs-pvc 11s
[iyunv@k8s
-master pv]# kubectl get persistentvolumeclaim
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
nfs
-pvc Bound pv0001 5Gi RWX 14s
[iyunv@k8s
-master pv]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test
-nfs-pvc 1/1 Running 0 19s
[iyunv@k8s
-master pv]# kubectl exec -ti test-nfs-pvc /bin/bash
[iyunv@test
-nfs-pvc /]# touch /home/laizy/test/nfs-pvc/1.out
[iyunv@test
-nfs-pvc /]# cd /home/laizy/test/nfs-pvc/
[iyunv@test
-nfs-pvc nfs-pvc]# ls
1.out
# exit
exit
# kubectl delete persistentvolumeclaim nfs-pvc
persistentvolumeclaim "nfs-pvc" deleted
# kubectl get pod
NAME READY STATUS RESTARTS AGE
recycler-for-pv0001 0/1 ContainerCreating 0 1s
test-nfs-pvc 1/1 Running 0 1m
# kubectl get persistentvolume
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
pv0001 5Gi RWX Recycle Available 1m
# kubectl get persistentvolumeclaim
No resources found.
# kubectl get pod test-nfs-pvc
NAME READY STATUS RESTARTS AGE
test-nfs-pvc 1/1 Running 0 2m
# kubectl exec -ti test-nfs-pvc /bin/bash
# ls /home/laizy/test/nfs-pvc/
五、删除Pod实验
创建PV,创建PVC挂载PV,创建POD挂载PVC。删除Pod后,PV、PVC状态没变,Pod中的Volume对应的NFS数据没有被删除。
# ./start.sh
persistentvolume
"pv0001" created
persistentvolumeclaim
"nfs-pvc" created
pod
"test-nfs-pvc" created
[iyunv@k8s
-master pv]# kubectl get persistentvolume
NAMECAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
pv0001 5Gi RWX Recycle Bound default
/nfs-pvc 11s
[iyunv@k8s
-master pv]# kubectl get persistentvolumeclaim
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
nfs
-pvc Bound pv0001 5Gi RWX 27s
[iyunv@k8s
-master pv]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test
-nfs-pvc 1/1 Running 0 36s
[iyunv@k8s
-master pv]# kubectl exec -ti test-nfs-pvc /bin/bash
[iyunv@test
-nfs-pvc /]# cat /home/laizy/test/nfs-pvc/1.out
123456
[iyunv@test
-nfs-pvc /]# exit
exit
[iyunv@k8s
-master pv]# kubectl delete pod test-nfs-pvc
pod
"test-nfs-pvc" deleted
[iyunv@k8s
-master pv]# kubectl get persistentvolume
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIMREASON AGE
pv0001 5Gi RWX Recycle Bound default
/nfs-pvc 8m
[iyunv@k8s
-master pv]# kubectl get persistentvolumeclaim
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
nfs
-pvc Bound pv0001 5Gi RWX 8m
[iyunv@k8s
-master pv]# ssh 192.168.20.47#登录到远程NFS服务器
root@
192.168.20.47's password:
Last failed login: Mon Mar 27 14:37:19 CST 2017 from :0 on :0
There was 1 failed login attempt since the last successful login.
Last login: Mon Mar 20 10:49:18 2017
# cd /data/disk1/1.out
123456
页:
[1]