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

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM