深入学习Kubernetes(五):kubernetes中使用NFS创建pv_pvc
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资源对象。
一、搭建NFS服务
1.1 安装配置nfs
[root@master2 ~]# yum install nfs-utils rpcbing [root@master2 ~]# vim /etc/exports /data/k8s/ 192.168.0.0/24(sync,rw,no_root_squash) [root@master2 ~]# mkdir -p /data/k8s [root@master2 ~]# chmod 777 /data/k8s [root@master2 ~]# systemctl start nfs [root@master2 ~]# systemctl enable nfs //用marste机器搭建
1.2 在node节点上测试
[root@node1 ~]# yum install nfs-utils [root@node1 ~]# showmount -e 192.168.0.113 Export list for 192.168.0.113: /data/k8s 192.168.0.0/24
二 、创建PV(在marster上)
2.1 定义mypv.yaml文件
[root@marster1 ~]# vim mypv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv001 spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: path: /data/k8s/ server: 192.168.0.113
2.2 创建PV
[root@marster1 ~]# kubectl create -f mypv.yaml persistentvolume/pv001 created
2.3 查看PV状态
[root@marster1 ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv001 10Gi RWX Retain Available 5m
- 状态为Available,这是因为它还没有绑定到任何的pvc上面,当定义完pvc后,就可以自动绑定了
三、创建pvc(master上)
3.1定义mypvc.yaml文件
[root@marster1 ~]# vim mypvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: myclaim spec: accessModes: - ReadWriteMany resources: requests: storage: 8Gi
3.2 创建PVC
[root@marster1 ~]# kubectl create -f mypvc.yaml persistentvolumeclaim/myclaim created
3.3 查看PVC状态
[root@marster1 ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE myclaim Bound pv001 10Gi RWX 1m
- 可以看到,pvc状态为Bound,它绑定了pv001
四、定义pod
4.1定义pod文件
[root@marster1 ~]# 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
4.2创建POD
[root@marster1 ~]# kubectl create -f pvpod.yaml pod/httpd-pvpod created
4.3 查看Volumes那部分里的ClaimName
[root@marster1 ~]# kubectl describe pod httpd-pvpod
Name: httpd-pvpod
Namespace: default
Node: 192.168.0.112/192.168.0.112
Start Time: Thu, 17 Jan 2019 00:37:53 +0800
Labels: <none>
Annotations: <none>
Status: Running
IP: 172.20.2.12
Volumes:
httpd-volume:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: myclaim
ReadOnly: false
五、测试验证
5.1 到NFS的共享目录下创建一个文件
[root@master2 ~]# cd /data/k8s/ [root@master2 k8s]# echo "Test file" > 1.html [root@master2 k8s]# ls 1.html
5.2 进入到httpd-pod里查看有没有文件
[root@marster1 ~]# kubectl exec -it httpd-pvpod bash root@httpd-pvpod:/usr/local/apache2# cd htdocs/ root@httpd-pvpod:/usr/local/apache2/htdocs# ls 1.html root@httpd-pvpod:/usr/local/apache2/htdocs# cat 1.html Test file
5.3删除httpd-pvpod 看共享目录有没有文件
[root@marster1 ~]# kubectl delete pod httpd-pvpod pod "httpd-pod" deleted [root@master2 k8s]# cat 1.html Test file //共享目录里还有文件
5.4 重建httpd-pod
[root@marster1 ~]# kubectl create -f pvpod.yaml pod/httpd-pod created [root@marster1 ~]# kubectl get pod httpd-pvpod NAME READY STATUS RESTARTS AGE httpd-pvpod 1/1 Running 0 19m
5.5curl访问
[root@marster1 ~]# kubectl get pod httpd-pvpod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE httpd-pvpod 1/1 Running 0 1m 172.20.2.14 192.168.0.112 <none> //查看pod ip [root@marster1 ~]# curl 172.20.2.14/1.html Test file