kubernetes中使用NFS创建pv_pvc
Persistent Volume(持久化卷)简称PV, 是一个K8S资源对象,我们可以单独创建一个PV, 它不和Pod直接发生关系, 而是通过Persistent Volume Claim, 简称PVC来实现动态绑定, 我们会在Pod定义里指定创建好的PVC, 然后PVC会根据Pod的要求去自动绑定合适的PV给Pod使用。
#就是我们在pod定义的时候可以指定一个PVC。然后PVC再去和PV进行绑定(这个过程是自动的,不需要去设置上面)。
类似于linux我们不能直接使用一个磁盘,要格式化成你想要的格式,比如xfs、ext4。只有把磁盘格式化成你系统能识别的文件系统,你才能在里面写数据。那pv也是一样的,pod直接识别不了,需要借助PVC,才能使用它
持久化卷下PV和PVC概念:
Persistent Volume(PV)是由管理员设置的存储,它是群集的一部分(可理解为是物理层面的)。就像节点是集群中的资源一样,PV 也是集群中的资源。 PV 是 Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期(pv和pod之间没有直接的关系)。此 API 对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统。
PersistentVolumeClaim(PVC)是用户存储的请求。它与 Pod 相似,Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU 和内存)。PVC声明可以请求特定的大小和访问模式(例如,可以以读/写一次或只读多次模式挂载)。 #特定大小是请求磁盘存储的大小是多大,还有权限是可读还是可写或是只读
它和普通Volume的区别是什么呢?
普通Volume和使用它的Pod之间是一种静态绑定关系,在定义Pod的文件里,同时定义了它使用的Volume。Volume是Pod的附属品,我们无法单独创建一个Volume,因为它不是一个独立的K8S资源对象。 #我们在pod里面去定义一个 Volume,那么pod没了,Volnme也就没有了。而pv是独立存在的,pod没有了,跟pv没有关系
1 准备一台机器,搭建NFS服务
yum install nfs-utils
vim /etc/exportfs
/data/k8s/ 172.7.15.0/24(sync,rw,no_root_squash) #这里的ip要写node节点网段的ip端,是要分享整个集群的
mkdir /data/k8s #创建该目录
chmod 777 !$ #为方便测试,可加777的权限
systemctl start nfs
systemctl start rpcbind
systemctl enable nfs
systemctl enbale rpcbind
2 在node节点上测试
yum install nfs-utils
showmount -e 172.7.15.113
3 创建pv(master上)
vim mypv.yaml //内容如下
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
spec:
capacity:
storage: 10Gi #给他10G的空间
accessModes:
- ReadWriteMany #就是可读可写很多次
nfs:
path: /data/k8s/ #挂载的目录
server: 172.7.15.113 #nfs服务端的ip
·························mypv.yaml文件到此为止································
kubectl create -f mypv.yaml #创建pv
kubectl get pv #查看pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 10Gi RWX Retain Available 10m
状态为Available,这是因为它还没有绑定到任何的pvc上面,当定义完pvc后,就可以自动绑定了。
4 创建pvc(master上) #让pod去引用他
vim mypvc.yaml //内容如下 #这个pvc文件可以自动的去关联上面创建的pv
kind: PersistentVolumeClaim #注意大小写
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 8Gi
·························mypvc.yaml文件到此为止································
kubectl create -f mypvc.yaml
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myclaim Bound pv001 10Gi RWX 2m
可以看到,pvc状态为Bound,它绑定了pv001 #这个pv001就是上面我们创建的pv
5 定义pod #定义一个pod去使用pvc
vim pvpod.yaml //内容如下
apiVersion: v1
kind: Pod
metadata:
name: httpd-pvpod #注意名字不能和其他的pod有重复
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 #指定你pvc的名字
·························pvpod.yaml文件到此为止································
kubectl create -f pvpod.yaml
kubectl describe pod httpd-pvpod //查看Volumes那部分里的ClaimName
6 验证
1)到NFS的共享目录下创建一个文件
cd /data/k8s/
echo "Test file" > 1.html
2)进入到httpd-pod里
kubectl exec -it httpd-pvpod bash
cat /usr/local/apache2/htdocs/1.html #查看指定的目录下有无挂载的这个文件
3)删除httpd-pvpod
kubectl delete pod httpd-pod #删除这个pod,在master上查看是否有这个。以此证明pvc不受pod的删除而受影响
cat /data/k8s/1.html
4)重建httpd-pod
kubectl create -f pvpod.yaml #再次重建这个pod。然后再访问他,看他是否随着pod的重建而依然持久化这个文件
5)curl访问
kubectl get pod httpd-pvpod -o wide //查看其对应的IP #就是查看这个pod在哪个节点上
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
httpd-pod 1/1 Running 0 2m 172.20.3.5 172.7.15.114 <none>
curl 172.20.3.5/1.html #访问的时候要访问这个pod的唯一ip,而不是访问节点的ip。通过kubectl get pod httpd-pvpod -o wide这个命令来查看pod的ip
参考 http://www.showerlee.com/archives/2280
总结:
首先要搭建一个nfs,共享目录给这个集群里所有的节点,包括master
然后再node节点上测试nfs服务(showmount -e)
再创建pv
再创建pvc,pvc可以自动的去绑定pv
定义pod,指定pvc的名字。实验中的名字时myclin, claimName: myclaim
最后测试