Persistent Volume(持久化卷) 简称 PV,是一个 K8S 资源对象,我们可以单独创建一个 PV,它不和 Pod 直接发生关系,而是通过 Persistent Volume Claim,简称PVC来实现动态绑定,我们会在 Pod 定义里指定创建好的 PVC, 然后 PVC 会根据 Pod 的要求去自动绑定合适的 PV 给 Pod 使用。
持久化卷下 PV 和 PVC 概念
Persistent Volume(PV) 是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资源。 PV 是 Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期。此 API 对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统。
PersistentVolumeClaim(PVC) 是用户存储的请求。它与 Pod 相似,Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU 和内存)。PVC 声明可以请求特定的大小和访问模式(例如,可以以读/写一次或只读多次模式挂载)。
它和普通 Volume 的区别
普通 Volume 和使用它的 Pod 之间是一种静态绑定关系,在定义Pod的文件里,同时定义了它使用的 Volume。
Volume 是 Pod 的附属品,我们无法单独创建一个 Volume,因为它不是一个独立的 K8S 资源对象。
前提准备
按照上篇文章,准备好机器并部署好 k8s 集群环境
master 节点 2 台,node 节点 2 台,harbor 机器 1 台,共计有 5 台机器
实验
1)这里使用 harbor 机器,搭建 NFS 服务
yum -y install nfs-utils rpcbind
vim /etc/exports
/data/k8s/ 10.18.30.0/24(sync,rw,no_root_squash)
mkdir /data/k8s/ && chmod 755 /data/k8s/
systemctl start nfs
systemctl enable nfs
ps aux | grep nfs
root 15812 0.0 0.0 0 0 ? S< 11:02 0:00 [nfsd4_callbacks]
root 15818 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 15819 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 15820 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 15821 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 15822 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 15823 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 15824 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 15825 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 15857 0.0 0.0 112728 972 pts/0 R+ 11:02 0:00 grep --color=auto nfs
2)在 node1 节点上测试
yum -y install nfs-utils
showmount -e 10.18.30.33
Export list for 10.18.30.33:
/data/k8s 10.18.30.0/24
3)在 master1 节点上创建 pv
新创建的 pv 状态为 Available,这是因为它还没有绑定到任何的 pvc 上面,当定义完 pvc 后,就可以自动绑定了。
cd /etc/ansible/
vim mypv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/k8s/
server: 10.18.30.33
kubectl create -f mypv.yaml
persistentvolume/pv001 created
kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 10Gi RWX Retain Available 11s
4)在 master1 节点上创建 pvc
可以看到,pvc 状态为 Bound,它绑定了 pv001
vim mypvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 8Gi
kubectl create -f mypvc.yaml
persistentvolumeclaim/myclaim created
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myclaim Bound pv001 10Gi RWX 6s
5)在 master1 节点上定义 pod
vim pvpod.yaml
apiVersion: v1
kind: Pod
metadata:
name: httpd-pvpod
spec:
containers:
- image: httpd
name: httpd-withpvc-pod
imagePullPolicy: Always
volumeMounts:
- mountPath: "/usr/local/apache2/htdocs/"
name: httpd-volume
volumes:
- name: httpd-volume
persistentVolumeClaim:
claimName: myclaim
kubectl create -f pvpod.yaml
pod/httpd-pvpod created
kubectl get pods
NAME READY STATUS RESTARTS AGE
httpd-pvpod 1/1 Running 0 69s
kubectl describe pod httpd-pvpod
Mounts:
/usr/local/apache2/htdocs/ from httpd-volume (rw)
Volumes:
httpd-volume:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: myclaim
ReadOnly: false
6)验证
01 到 harbor 机器上的 NFS 共享目录下创建一个文件
cd /data/k8s/
echo "Test file" > 1.html
02 在 master1 节点上进入到 httpd-pod 里
kubectl exec -it httpd-pvpod bash
cat /usr/local/apache2/htdocs/1.html
03 在 master1 节点上删除 httpd-pvpod,在 harbor 机器上的 NFS 共享目录查看文件还在不在
# master1
kubectl delete pod httpd-pvpod
# harbor
cat /data/k8s/1.html
04 在 master1 节点上重建 httpd-pod
kubectl create -f pvpod.yaml
05 在 master1 节点上 curl 访问
kubectl get pod httpd-pvpod -o wide //查看其对应的IP
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
httpd-pvpod 1/1 Running 0 8s 172.20.3.6 10.18.30.29 <none> <none>
curl 172.20.3.6/1.html
Test file
扩展阅读
http://www.showerlee.com/archives/2280