深入学习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

  

  

  

 

 

  

  

  

  

 

 

 

  

 

posted @ 2019-01-17 01:09  学习记事本  阅读(377)  评论(0编辑  收藏  举报