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

项目架构:

原理:

  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

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

原文地址:https://www.cnblogs.com/Smbands/p/11059843.html

时间: 2024-08-06 08:04:29

k8s 基于NFS部署storageclass pv自动供给的相关文章

k8s中部署基于nfs的StorageClass

k8s中部署基于nfs的StorageClass ? storageclass相当于是一个动态的存储,即每个pod需要多少容量,直接在配置资源清单中声明即可;但是nfs默认是不支持storageclass动态存储的. ? 总结一下就是: ? 1. 平时使用过程中,如果是静态的存储,那么过程是先准备好存储,然后基于存储创建PV;然后在创建PVC,根据容量他们会找对应的PV ? 2. 使用动态存储,那么就是先准备好存储,然后直接创建PVC,storageclass会根据要求的大小自动创建PV 首先安

k8s存储数据持久化,emptyDir,hostPath,基于Nfs服务的PV,PVC

在docker和K8S中都存在容器是有生命周期的,因此数据卷可以实现数据持久化. 数据卷解决的主要问题: 1.数据持久性:当我们写入数据时,文件都是暂时性的存在,当容器崩溃后,host就会将这个容器杀死,然后重新从镜像创建容器,数据就会丢失. 2.数据共享:在同一个Pod中运行容器,会存在共享文件的需求. 数据卷的类型: 1.emptyDiremptyDir数据卷类似于docker数据持久化的docker manager volume,该数据卷初分配时,是一个空目录,同一个Pod中的容器可以对该

Kubernetes系列之基于NFS的PV动态供给(StorageClass)

一.简介 PersistentVolume(PV)是指由集群管理员配置提供的某存储系统上的段存储空间,它是对底层共享存储的抽象,将共享存储作为种可由用户申请使的资源,实现了"存储消费"机制.通过存储插件机制,PV支持使用多种网络存储系统或云端存储等多种后端存储系统,例如,NFS.RBD和Cinder等.PV是集群级别的资源,不属于任何名称空间,用户对PV资源的使需要通过PersistentVolumeClaim(PVC)提出的使申请(或称为声明)来完成绑定,是PV资源的消费者,它向PV

基于NFS的PV动态供给(StorageClass)

一.简介 PersistentVolume(PV)是指由集群管理员配置提供的某存储系统上的段存储空间,它是对底层共享存储的抽象,将共享存储作为种可由用户申请使的资源,实现了“存储消费”机制.通过存储插件机制,PV支持使用多种网络存储系统或云端存储等多种后端存储系统,例如,NFS.RBD和Cinder等.PV是集群级别的资源,不属于任何名称空间,用户对PV资源的使需要通过PersistentVolumeClaim(PVC)提出的使申请(或称为声明)来完成绑定,是PV资源的消费者,它向PV申请特定大

基于k8s集群部署prometheus监控etcd

目录 基于k8s集群部署prometheus监控etcd 1.背景和环境概述 2.修改prometheus配置 3.检查是否生效 4.配置grafana图形 基于k8s集群部署prometheus监控etcd 1.背景和环境概述 本文中涉及到的环境中.prometheus监控和grafana基本环境已部署好.etcd内置了metrics接口供收集数据,在etcd集群任意一台节点上可通过ip:2379/metrics检查是否能正常收集数据. curl -L http://localhost:237

k8s使用Glusterfs动态生成pv

一.环境介绍 [[email protected] ~]# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.31.250.152 k8s-m172.31.250.153 node1172.31.250.154 node

k8s 基于ceph存储动态卷的使用

kubernetes 使用Ceph RBD进行动态卷配置 1. 实验环境简述:   本实验主要演示了将现有Ceph集群用作k8s 动态创建持久性存储(pv)的示例.假设您的环境已经建立了一个工作的Ceph集群. 2. 配置步骤: 1. k8s所有节点安装ceph-common软件包 yum install -y ceph-common # 在每一台k8s节点安装ceph-common软件包,无论是master节点还是node节点 如果k8s节点比较多,可以使用ansible安装 ansible

[系统集成] 基于Kubernetes 部署 jenkins 并动态分配资源

基于kubernetes 部署 jenkins master 比较简单,难点是为 jenkins 动态分配资源.基于kubernetes 为 jenkins 动态分配资源需要实现下述功能: 资源分配:jenkins 根据任务属性自动创建临时 docker 容器,并作为 slave 节点加入 jenkins 集群,实现资源的分配: 资源释放:任务执行结束后,jenkins 自动删除相关节点,并销毁相关 docker 容器,实现资源的释放: 整个资源分配和资源释放过程对用户来说是透明的,用户只需要创

heatbeat-gui实现基于nfs的mysql高可用集群

一.简述HA高可用集群 高可用集群就是当集群中的一个节点发生各种软硬件及人为故障时,集群中的其他节点能够自动接管故障节点的资源并向外提供服务.以实现减少业务中断时间,为用户提供更可靠,更高效的服务. 二.基于nfs实现mysql的高可用集群配置 环境准备接上文 heartbeat-gui部署 实验环境: nfs server准备 1.在nfs server准备LVM存储空间 [[email protected] ~]# fdisk /dev/sdb Device contains neither