Linux运维知识之kubernetes pvc与nfs
小标 2019-03-15 来源 : 阅读 910 评论 0

摘要:本文主要向大家介绍了Linux运维知识之kubernetes pvc与nfs,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助。

本文主要向大家介绍了Linux运维知识之kubernetes pvc与nfs,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助。

Linux运维知识之kubernetes pvc与nfs

此前在存储卷类型中介绍过pvc,以及其他的存储卷类型,本节笔记介绍pvc和nfs的使用


PVC


在pod中只需要定义存储卷,定义时只需要说明需要用到的大小,这个类型就是pvcl类型存储卷

而pvc存储卷必须与当前名称空间中的pvc,建立直接绑定关系,而pvc必须与pv建立绑定关系,而pv则是某个真正存储设备的存储空间,如下:


pv与pvs是kubernetes上抽象的,且标准的资源,与创建其他的pod中资源一样


用法


在存储类型中有很多存储类型被划分成预想的存储空间,这些存储空间被kubernetes映射到pv,在创建资源时,定义pod,且定义pod中的pvc即可。前提是pvc已经被创建好。pvc与pv之间没有被调用则空载,当pvc调用时则会与某个pv进行绑定(数据存放在pv之上)


pvc绑定那个pv取决于pod创建的用户定义volumes请求,如下:

1. 满足空间大小则绑定,不满足则不绑定

2. 满足访问类型:单读,单写,单读/写(pv只有)。多读写,多读,多写,


这样一来就分成大小三组来定义kubernetes。如下:


对于存储设备由存储管理员进行管理,pv与pvc由k8s集群管理员或者用户来管理。集群管理员将存储空间引入到集群内定义为PV,随后用户(创建pod用户)创建pvc(pv create),(创建pod之前创建pvc)pvc根据配置信息查找合适pv申请(如果没有适当的pv则绑定失败,直到创建一个合适的符合条件的pv)。



  • pv与pvc是一 一对应的,一旦pv被某个pvc占用,显示绑定状态,就不会被其他pvc使用。但是,一旦pvc创建完成(与pv绑定),pvc就相当于一个存储卷,而存储卷(绑定过pv的pvc)能够被多个pod使用。而多个pod挂载一个pvc存储卷,这种方式就是多路访问(是否支持取决于accessMode)。



claimName: pvc名称

可以使用kubectl explain pvc查看标准使用,其中pvc kind是PersistentVolumeClaim,在spec中需要指明:


accessMode(访问模型。是否支持多人读写,或者单人读写等。accessmode支持列表,意味着可以支持多中模式。这里定义的权限只能是存储设备的子集)

ReadWriteOnce – 卷可以由单个节点以读写方式挂载

ReadOnlyMany – 卷可以由许多节点以只读方式挂载

ReadWriteMany – 卷可以由许多节点以读写方式挂载

RWO – 单路读写

ROX – 多路只读

RWX – 多路读写

并不是每个卷都支持多路,参考官网的表格,NFS多路单路都支持

resources:资源限制。(至少多少空间)

selector: 标签选择器。使用标签选择器进行绑定

storageClassName:存储类名称

volumeMode: 后端存储卷模式。PV类型限制。如果有合适的pv则会绑定,如果没有则会挂起

volumeName: 存储卷名称。填写则直接绑定。

 capacity : 指定空间大小通过资源访问模型进行定义,关注resources,我们可以定义成Ei,Pi,Ti,Gi,Mi,Ki


storage: 5Gi表示5G


apiSersion: v1
kind: PersistentVolume
metadata:
  name: linuxea-5
  labels:
    name: v5
spec:
  nfs:
    path: /data/volumes/linuxea-5
    server: 10.0.1.61
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 5Gi


创建


1. 准备存储(NFS)


10.0.1.61 创建几个目录进行单独的挂载,分别是linuxea-1-5


[root@Linuxea-VM-Node_10_0_1_61 /data/linuxea-volumes]# mkdir linuxea-{1,2,3,4,5}
[root@Linuxea-VM-Node_10_0_1_61 /data/linuxea-volumes]# ls
index.html  linuxea-1  linuxea-2  linuxea-3  linuxea-4  linuxea-5  linuxea.html


[root@Linuxea-VM-Node_10_0_1_61 /data/linuxea-volumes]# cat /etc/exports
/data/linuxea-volumes/linuxea-1 10.0.0.0/8(rw,no_root_squash)
/data/linuxea-volumes/linuxea-2 10.0.0.0/8(rw,no_root_squash)
/data/linuxea-volumes/linuxea-3 10.0.0.0/8(rw,no_root_squash)
/data/linuxea-volumes/linuxea-4 10.0.0.0/8(rw,no_root_squash)
/data/linuxea-volumes/linuxea-5 10.0.0.0/8(rw,no_root_squash)


[root@Linuxea-VM-Node_10_0_1_61 /data/linuxea-volumes]# exportfs -arv
exporting 10.0.0.0/8:/data/linuxea-volumes/linuxea-5
exporting 10.0.0.0/8:/data/linuxea-volumes/linuxea-4
exporting 10.0.0.0/8:/data/linuxea-volumes/linuxea-3
exporting 10.0.0.0/8:/data/linuxea-volumes/linuxea-2
exporting 10.0.0.0/8:/data/linuxea-volumes/linuxea-1


[root@Linuxea-VM-Node_10_0_1_61 /data/linuxea-volumes]# showmount -e
Export list for Linuxea-VM-Node_10_0_1_61.dwhd.org:
/data/linuxea-volumes/linuxea-5 10.0.0.0/8
/data/linuxea-volumes/linuxea-4 10.0.0.0/8
/data/linuxea-volumes/linuxea-3 10.0.0.0/8
/data/linuxea-volumes/linuxea-2 10.0.0.0/8
/data/linuxea-volumes/linuxea-1 10.0.0.0/8


2. 创建pv


这里定义pv时候,不能定义在namespace。pv是集群级别的,不在名称空间中,所有的名称空间都可以用。但是pvc是属于名称空间的


namespace不能嵌套,namespcace属于集群资源 ,不能定义在名称空间中。所谓集群资源就是不能定义在名称空间中的。而pod,service必须定义在名称空间中。属于名称空间级别


我们之前,事先分别定义了5个pv,分别是1-5Gi的pv大小,支持单点读写和多路读写(稍后方便写入数据测试)。yaml如下:


[root@linuxea volume]# cat pv-demo.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: linuxea-1
  labels:
    name: v1
spec:
  nfs:
    path: /data/volumes/linuxea-1
    server: 10.0.1.61
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: linuxea-2
  labels:
    name: v2
spec:
  nfs:
    path: /data/volumes/linuxea-2
    server: 10.0.1.61
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: linuxea-3
  labels:
    name: v3
spec:
  nfs:
    path: /data/volumes/linuxea-3
    server: 10.0.1.61
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 3Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: linuxea-4
  labels:
    name: v4
spec:
  nfs:
    path: /data/volumes/linuxea-4
    server: 10.0.1.61
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: linuxea-5
  labels:
    name: v5
spec:
  nfs:
    path: /data/volumes/linuxea-5
    server: 10.0.1.61
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 5Gi


定义完成后apply启动


[root@linuxea volume]# kubectl apply -f pv-demo.yaml 
persistentvolume/linuxea-1 created
persistentvolume/linuxea-2 created
persistentvolume/linuxea-3 created
persistentvolume/linuxea-4 created
persistentvolume/linuxea-5 created


启动后使用kubectl get pv查看状态信息


[root@linuxea volume]# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
linuxea-1   1Gi        RWO,RWX        Retain           Available                                      3s
linuxea-2   2Gi        RWO,RWX        Retain           Available                                      3s
linuxea-3   3Gi        RWO,RWX        Retain           Available                                      3s
linuxea-4   4Gi        RWO,RWX        Retain           Available                                      3s
linuxea-5   5Gi        RWO,RWX        Retain           Available                                      3s


其中RECLAIM POLICY 叫回收策略:当一个pvc绑定某个pv,并且存储了数据,如果pv删掉,那么绑定就会失效。删除前存放有数据就会丢失,Retain保留。Recycle(回收),删除数据,将pv制空,让其他pv绑定。当然还有delelte,默认delete。


3. 创建pvc


resources的选择是要大于等于定义的resources值

当创建好pvc后,就算删除pvc,pod数据也会保留,因为pv的回收策略是Retain(取决于回收策略),也不会删除。因此,只要不删除pvc,而删除pod,就算pv策略是Recycle(回收),也不会被删除数据。


pvc是标准的k8s资源,存储在etcd中,只要etcd没有问题,pvc就没有问题,而pod是节点资源,运行在节点之上。其他资源保存在api server集群状态存储etcd当中。



  • 在最新的版本中pv被绑定的状态下是不能够单独删除的。kubectl delete pv PVNAME

    PersistentVolumeClaim
    是独特的kind,pvc需要定义namespace

    在pvc中的accessModes是pv accessModes的子集,也就是说pv有权限,这里才有权限。在之前定义了PV的大小是1-5Gi,在这里定义的spec中storage: 5Gi(这里打大小至少要大于等于才行),假如这里定义的大小在pv中不存在则会失效。这里仍然可以使用标签管理器管理。而后在pod中定义pvc名称和volumes挂载到相应的目录




  • 我们事先已经定了pv大小,现在才能进行绑定




yaml


[root@linuxea volume]# cat pvc-demo.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: linuxea-pvc
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: linuxea-pvc-pod
  namespace: default
spec:
  containers:
  - name: linuxea-pod1-pvc
    image: "marksugar/nginx:1.14.a"
    ports:
      - containerPort: 88
    volumeMounts:
    - name: linuxea-image
      mountPath: /data/wwwroot/
  volumes:
  - name: linuxea-image
    persistentVolumeClaim:
      claimName: linuxea-pvc


apply创建


[root@linuxea volume]# kubectl apply -f pvc-demo.yaml 
persistentvolumeclaim/linuxea-pvc created
pod/linuxea-pvc-pod created


可使用kubectl get pvc查看已经创建好的pvc已经被Bound


[root@linuxea volume]# kubectl get pvc
NAME          STATUS    VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
linuxea-pvc   Bound     linuxea-5   5Gi        RWO,RWX                       6s


以及pod


[root@linuxea volume]# kubectl get pods -o wide
NAME              READY     STATUS    RESTARTS   AGE       IP           NODE                 NOMINATED NODE
linuxea-pvc-pod   1/1       Running   0          22s       172.16.4.7   linuxea.node-2.com   <none>


而后创建pvc之后,可查看pv已经被绑定到linuxea-5上的pv上(大于等于5G)


[root@linuxea volume]# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                 STORAGECLASS   REASON    AGE
linuxea-1   1Gi        RWO,RWX        Retain           Available                                                  2m
linuxea-2   2Gi        RWO,RWX        Retain           Available                                                  2m
linuxea-3   3Gi        RWO,RWX        Retain           Available                                                  2m
linuxea-4   4Gi        RWO,RWX        Retain           Available                                                  2m
linuxea-5   5Gi        RWO,RWX        Retain           Bound       default/linuxea-pvc                            2m


也可以使用kubectl describe pods linuxea-pvc-pod|grep root查看信息


[root@linuxea volume]# kubectl describe pods linuxea-pvc-pod|grep root
      /data/wwwroot/ from linuxea-image (rw)


pv写入测试


在集群内访问


[root@linuxea volume]# curl 172.16.4.7
linuxea-linuxea-pvc-pod.com-127.0.0.1/8 172.16.4.7/24


而后回到nfs修改


[root@Linuxea-VM-Node_10_0_1_61 ~]# echo `date` >> /data/linuxea-volumes/linuxea-5/index.html 


在集群内第二次访问查看


[root@linuxea volume]# curl 172.16.4.7
linuxea-linuxea-pvc-pod.com-127.0.0.1/8 172.16.4.7/24
2018年 09月 23日 星期日 18:22:49 CST
[root@linuxea volume]#


由此可见,创建多大的pv,可能需要事先设定好,pvc才能适配,这种方式有些麻烦,可以考虑使用动态供给


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注系统运维Linux频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程