• k8s 基于NFS部署storageclass pv自动供给


    在k8s中部署有状态应用时,通常需要做数据持久化存储。

    后端存储的方式有以下几种:

    1.基于宿主机本地的存储方式;

      (重启pod时,若pod被调度到其他节点上,尽管原来节点上的数据不会丢失,但是其他节点上没有该应用存储过的数据,所以并不持久化)

    2.基于本地过云存储服务的方式,如:(NFS、glusterfs、cephfs、awsElasticBlockStore、azureDisk、gcePersistentDisk等)

      (在资源清单中指明URL地址和共享挂载卷目录即可实现数据持久化存储)

    3.基于存储类,实现PV自动供给;

      (创建存储类,在资源清单中指明地址和共享挂载卷目录即可实现持久化存储)

    我们这里就介绍一下基于存储类的PV自动供给实现的数据持久化存储

    官网概念说明:

    https://kubernetes.io/docs/concepts/storage/storage-classes/

    项目地址:

    https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy

    项目架构:

    Designed by Smbands

     原理:

      1.存储工程师创建存储类。

      2.集群管理员维护集群中的存储资源。

      3.用户或开发人员提交需求,(如在sts中只要在资源清单中编辑好volumeClaimTemplates中的需求,确保资源清单无误即可运行)这个过程不需要人工手动创建PVC。

    当然图是这样画的,分工明细,但现实中相信一个人把这些活都揽的也不计其数。kube、kube拼音就一苦比,但是多学点没坏处。

    从官网中可以看出目前NFS并不支持做存储类,但是我们可以使用NFS的插件来支持。

    NFS插件在Github中的项目地址https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy

    搭建

    1.搭建NFS服务(与k8s集群同一网段下的主机)

     1  安装nfs服务:yum -y install nfs-utils (集群中的每个节点也要安装否则不支持)
     2 
     3  启动nfs并设为开机自启:systemctl start nfs && systemctl enable nfs
     4 
     5  创建共享挂载目录: mkdir -pv /data/volumes/{v1,v2,v3}
     6 
     7  编辑/etc/exports文件,将目录共享到192.168.1.0/24这个网段中:
     8 
     9 vi /etc/exports
    10 
    11 /data/volume/v1  192.168.1.0/24(rw,no_root_squash)
    12 /data/volume/v2  192.168.1.0/24(rw,no_root_squash)
    13 /data/volume/v3  192.168.1.0/24(rw,no_root_squash)
    14 
    15  发布:exportfs -avr
    16 
    17 exporting 192.168.1.0/24:/data/volume/v3
    18 exporting 192.168.1.0/24:/data/volume/v2
    19 exporting 192.168.1.0/24:/data/volume/v1
    20 
    21  查看:showmount -e
    22 
    23 /data/volume/v3 192.168.1.0/24
    24 /data/volume/v2 192.168.1.0/24
    25 /data/volume/v1 192.168.1.0/24

    2.在kubernetes中部署NFS插件(项目地址在上面)

     1 下载项目:for file in class.yaml deployment.yaml rbac.yaml test-claim.yaml ; do wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/$file ; done
     2 
     3 修改资源清单(红色地方需要修改):
     4 
     5 vim deployment.yaml
     6 
     7 apiVersion: v1
     8 kind: ServiceAccount
     9 metadata:
    10   name: nfs-client-provisioner
    11 ---
    12 kind: Deployment
    13 apiVersion: extensions/v1beta1
    14 metadata:
    15   name: nfs-client-provisioner
    16 spec:
    17   replicas: 1
    18   strategy:
    19     type: Recreate
    20   template:
    21     metadata:
    22       labels:
    23         app: nfs-client-provisioner
    24     spec:
    25       serviceAccountName: nfs-client-provisioner
    26       containers:
    27         - name: nfs-client-provisioner
    28           image: quay.io/external_storage/nfs-client-provisioner:v2.0.0  ##默认是latest版本
    29           volumeMounts:
    30             - name: nfs-client-root
    31               mountPath: /persistentvolumes
    32           env:
    33             - name: PROVISIONER_NAME
    34               value: fuseim.pri/ifs  ##这里的供应者名称必须和class.yaml中的provisioner的名称一致,否则部署不成功
    35             - name: NFS_SERVER
    36               value: k8s-nfs      ##这里写NFS服务器的IP地址或者能解析到的主机名
    37             - name: NFS_PATH
    38               value: /data/volume/v1   ##这里写NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)
    39       volumes:
    40         - name: nfs-client-root
    41 
    42           nfs:
    43             server: k8s-nfs                ##NFS服务器的IP或可解析到的主机名
    44             path: /data/volume/v1  ##NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)

     

    3.部署

     切换到此项目的目录中

    1 kubectl apply -f ./

    4.查看

     查看此NFS插件的pod是否部署成功:

    1 kubectl get pods
    2  
    3 NAME                                      READY       STATUS         RESTARTS       AGE
    4 
    5 nfs-client-provisioner-8664fb9f68-57wkf   1/1        Running            0          5m43s

    5.测试

     部署一个pvc或者声明存储的应用,测试是否自动创建出PV而且自动绑定PVC,

      1 例:PVC  2 
      3   4 
      5 vim test.yaml
      6 
      7 kind: PersistentVolumeClaim
      8 apiVersion: v1
      9 metadata:
     10   name: test-claim
     11   annotations:
     12     volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
     13 spec:
     14   accessModes:
     15     - ReadWriteMany
     16   resources:
     17     requests:
     18       storage: 1Mi
     19 
     20 例:StatefulSet方式部署的nginx应用
     21 
     22 vim nginx-demo.yaml
     23 
     24 apiVersion: v1
     25 kind: Service
     26 metadata:
     27   name: nginx
     28   labels:
     29     app: nginx
     30 spec:
     31   ports:
     32   - port: 80
     33     name: web
     34   clusterIP: None
     35   selector:
     36     app: nginx
     37 ---
     38 
     39 apiVersion: apps/v1
     40 kind: StatefulSet
     41 metadata:
     42   name: web
     43 spec:
     44   selector:
     45     matchLabels:
     46       app: nginx
     47   serviceName: "nginx"
     48   replicas: 3
     49   template:
     50     metadata:
     51       labels:
     52         app: nginx
     53     spec:
     54       terminationGracePeriodSeconds: 10
     55       containers:
     56       - name: nginx
     57         image: nginx
     58         ports:
     59         - containerPort: 80
     60           name: web
     61         volumeMounts:
     62         - name: www
     63           mountPath: /usr/share/nginx/html
     64   volumeClaimTemplates:
     65   - metadata:
     66       name: www
     67     spec:
     68       accessModes: [ "ReadWriteOnce" ]
     69       storageClassName: "managed-nfs-storage"
     70       resources:
     71         requests:
     72           storage: 1Gi
     73 
     74 部署: 75 kubectl apply -f test.yaml nginx-demo.yaml
     76  77 查看pod、svc、pv、pvc状态:
     78  79 kubectl get pv
     80 NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS          REASON   AGE
     81 pvc-5d66051e-9674-11e9-9021-000c29cc70d4   1Mi        RWX            Delete           Bound    default/test-claim   managed-nfs-storage            7m6s
     82 pvc-73235c07-9677-11e9-9021-000c29cc70d4   1Gi        RWO            Delete           Bound    default/www-web-1    managed-nfs-storage            6m15s
     83 pvc-8a58037f-9677-11e9-9021-000c29cc70d4   1Gi        RWO            Delete           Bound    default/www-web-2    managed-nfs-storage            5m36s
     84 pvc-ab7fca5a-9676-11e9-9021-000c29cc70d4   1Gi        RWO            Delete           Bound    default/www-web-0    managed-nfs-storage            7m6s
     85 
     86  87 kubectl get pvc
     88 NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
     89 test-claim   Bound    pvc-5d66051e-9674-11e9-9021-000c29cc70d4   1Mi        RWX            managed-nfs-storage   28m
     90 www-web-0    Bound    pvc-ab7fca5a-9676-11e9-9021-000c29cc70d4   1Gi        RWO            managed-nfs-storage   12m
     91 www-web-1    Bound    pvc-73235c07-9677-11e9-9021-000c29cc70d4   1Gi        RWO            managed-nfs-storage   6m32s
     92 www-web-2    Bound    pvc-8a58037f-9677-11e9-9021-000c29cc70d4   1Gi        RWO            managed-nfs-storage   5m53s
     93 
     94 kubectl get pods -owide 95 NAME                                     READY   STATUS    RESTARTS   AGE    IP             NODE        NOMINATED NODE   READINESS GATES
       nfs-client-provisioner-f9776d996-dpk6z   1/1     Running   0          12m    10.244.1.65    k8s-node1   <none>           <none>
       web-0                                    1/1     Running   0          16m    10.244.1.66    k8s-node1   <none>           <none>
       web-1                                    1/1     Running   0          10m    10.244.2.181   k8s-node2   <none>           <none>
       web-2                                    1/1     Running   0          10m    10.244.2.182   k8s-node2   <none>           <none>

       kubectl get svc

     现在查看nfs服务器中的v1目录下:

    1 default-www-web-0-pvc-c32f532b-968f-11e9-9021-000c29cc70d4   default-www-web-2-pvc-d3944c4a-968f-11e9-9021-000c29cc70d4
    2 default-www-web-1-pvc-ccd2a50b-968f-11e9-9021-000c29cc70d4

    上面这些是k8s集群映射的目录,用来和其他存储挂载使用,从创建pod时的日志可以看出:

    1 Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/7d7c45bc-968c-11e9-9021-000c29cc70d4/volumes/kubernetes.io~nfs/default-www-web-0-pvc-e6b67079-968b-11e9-9021-000c29cc70d4 --scope -- mount -t nfs k8s-nfs:/data/volume/v2/default-www-web-0-pvc-e6b67079-968b-11e9-9021-000c29cc70d4 /var/lib/kubelet/pods/7d7c45bc-968c-11e9-9021-000c29cc70d4/volumes/kubernetes.io~nfs/default-www-web-0-pvc-e6b67079-968b-11e9-9021-000c29cc70d4

    在这些目录中创建默认访问页:

    1 cd default-www-web-0-pvc-c32f532b-968f-11e9-9021-000c29cc70d4
    2 
    3 echo "<h1>NFS Server</h1>" > index.html
    4 
    5 此时使用curl命令访问此nginx pod
    6 
    7 curl 10.244.1.66
    8 
    9 NFS Server

    好了,以上就是全部内容了

  • 相关阅读:
    最常用的vim操作指令练习记录
    数据库中间件——Mycat配置
    分布式事务解决方案seata之AT模式原理剖析
    分布式服务限流降级熔断解决方案Nacos之Dashboard界面配置含义记录
    本地Centos7虚拟机安装rabbitmq,主宿机无法访问监控界面解决
    dubbo学习笔记
    SpringBoot整合mybatis-plus代码生成器(备用)
    Zookeeper大概配置及与java集成使用
    Adb免root卸载Android预装应用
    腾讯X5内核调试(安卓)
  • 原文地址:https://www.cnblogs.com/Smbands/p/11059843.html
Copyright © 2020-2023  润新知