在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集群同一网段下的主机)

  安装nfs服务:yum -y install nfs-utils (集群中的每个节点也要安装否则不支持)

  启动nfs并设为开机自启:systemctl start nfs && systemctl enable nfs

  创建共享挂载目录: mkdir -pv /data/volumes/{v1,v2,v3}

  编辑/etc/exports文件,将目录共享到192.168.1./24这个网段中:

 vi /etc/exports

 /data/volume/v1  192.168.1.0/(rw,no_root_squash)
/data/volume/v2 192.168.1.0/(rw,no_root_squash)
/data/volume/v3 192.168.1.0/(rw,no_root_squash)  发布:exportfs -avr exporting 192.168.1.0/:/data/volume/v3
exporting 192.168.1.0/:/data/volume/v2
exporting 192.168.1.0/:/data/volume/v1  查看:showmount -e /data/volume/v3 192.168.1.0/
/data/volume/v2 192.168.1.0/
/data/volume/v1 192.168.1.0/

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

 下载项目: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

 修改资源清单(红色地方需要修改):

 vim deployment.yaml

 apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: nfs-client-provisioner
spec:
replicas:
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:v2.0.0 ##默认是latest版本
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs ##这里的供应者名称必须和class.yaml中的provisioner的名称一致,否则部署不成功
- name: NFS_SERVER
value: k8s-nfs    ##这里写NFS服务器的IP地址或者能解析到的主机名
- name: NFS_PATH
value: /data/volume/v1 ##这里写NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)
volumes:
- name: nfs-client-root nfs:
server: k8s-nfs  ##NFS服务器的IP或可解析到的主机名
path: /data/volume/v1  ##NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)

3.部署

 切换到此项目的目录中

 kubectl apply -f ./

4.查看

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

 kubectl get pods

 NAME                                      READY       STATUS         RESTARTS       AGE

 nfs-client-provisioner-8664fb9f68-57wkf   /        Running                      5m43s

5.测试

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

 例:PVC 

 vim test.yaml

 kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi 例:StatefulSet方式部署的nginx应用

vim nginx-demo.yaml apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port:
name: web
clusterIP: None
selector:
app: nginx
--- apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas:
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds:
containers:
- name: nginx
image: nginx
ports:
- containerPort:
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "managed-nfs-storage"
resources:
requests:
storage: 1Gi 部署: kubectl apply -f test.yaml nginx-demo.yaml
查看pod、svc、pv、pvc状态:
kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-5d66051e--11e9--000c29cc70d4 1Mi RWX Delete Bound default/test-claim managed-nfs-storage 7m6s
pvc-73235c07--11e9--000c29cc70d4 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 6m15s
pvc-8a58037f--11e9--000c29cc70d4 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 5m36s
pvc-ab7fca5a--11e9--000c29cc70d4 1Gi RWO Delete Bound default/www-web- managed-nfs-storage 7m6s kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-claim Bound pvc-5d66051e--11e9--000c29cc70d4 1Mi RWX managed-nfs-storage 28m
www-web- Bound pvc-ab7fca5a--11e9--000c29cc70d4 1Gi RWO managed-nfs-storage 12m
www-web- Bound pvc-73235c07--11e9--000c29cc70d4 1Gi RWO managed-nfs-storage 6m32s
www-web- Bound pvc-8a58037f--11e9--000c29cc70d4 1Gi RWO managed-nfs-storage 5m53s kubectl get pods -owide 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目录下:

 default-www-web--pvc-c32f532b-968f-11e9--000c29cc70d4   default-www-web--pvc-d3944c4a-968f-11e9--000c29cc70d4
default-www-web--pvc-ccd2a50b-968f-11e9--000c29cc70d4

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

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

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

 cd default-www-web--pvc-c32f532b-968f-11e9--000c29cc70d4

 echo "<h1>NFS Server</h1>" > index.html

 此时使用curl命令访问此nginx pod

 curl 10.244.1.66

 NFS Server

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

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

  1. kubernetes(14):k8s基于NFS部署storageclass实现pv自动供给

    k8s基于NFS部署storageclass实现pv自动供给 https://www.cnblogs.com/Smbands/p/11059843.html https://www.jianshu.c ...

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

    一.简介 PersistentVolume(PV)是指由集群管理员配置提供的某存储系统上的段存储空间,它是对底层共享存储的抽象,将共享存储作为种可由用户申请使的资源,实现了“存储消费”机制.通过存储插 ...

  3. 7.2 k8s 基于PV、PVC搭建zookeeper 3节点集群

    1.PV,PVC介绍 1.1.StorageClass & PV & PVC关系图 Volumes 是最基础的存储抽象,其支持多种类型,包括本地存储.NFS.FC以及众多的云存储,我们 ...

  4. 5.基于二进制部署kubernetes(k8s)集群

    1 kubernetes组件 1.1 Kubernetes 集群图 官网集群架构图 1.2 组件及功能 1.2.1 控制组件(Control Plane Components) 控制组件对集群做出全局 ...

  5. 基于k8s集群部署prometheus监控ingress nginx

    目录 基于k8s集群部署prometheus监控ingress nginx 1.背景和环境概述 2.修改prometheus配置 3.检查是否生效 4.配置grafana图形 基于k8s集群部署pro ...

  6. 基于k8s集群部署prometheus监控etcd

    目录 基于k8s集群部署prometheus监控etcd 1.背景和环境概述 2.修改prometheus配置 3.检查是否生效 4.配置grafana图形 基于k8s集群部署prometheus监控 ...

  7. 基于webhook方案的Git自动部署方案

    之前已经用Git实现了自己博客的提交自动部署,并自动提交到GitHub和coding以备不时之需.平时项目代码都托管在Coding或者GitHub上,也已经用上了coding提供的webhook功能, ...

  8. k8s集群部署rabbitmq集群

    1.构建rabbitmq镜像 RabbitMQ提供了一个Autocluster插件,可以自动创建RabbitMQ集群.下面我们将基于RabbitMQ的官方docker镜像,添加这个autocluste ...

  9. k8s实战之部署Prometheus+Grafana可视化监控告警平台

    写在前面 之前部署web网站的时候,架构图中有一环节是监控部分,并且搭建一套有效的监控平台对于运维来说非常之重要,只有这样才能更有效率的保证我们的服务器和服务的稳定运行,常见的开源监控软件有好几种,如 ...

随机推荐

  1. 搭建yum源

    五.保留缓存rpm包, 修改配置文件,将最新的rpm包下载到本地并保存. 3) 使用yum命令安装httpd软件包 六.制作yum仓库 1)         自定义yum仓库:createrepo 安 ...

  2. c# json字符串转数组

    JArray jo = (JArray)JsonConvert.DeserializeObject("这里是json字符串");

  3. Jmeter将JDBC Request查询结果作为下一个接口参数方法

    现在有一个需求,从数据库tieba_info表查出rank小于某个值的username和count(*),然后把所有查出来的username和count(*)作为参数值,用于下一个接口. tieba_ ...

  4. missfresh问题记录

    一.基本信息 1.登陆机器    ssh lina02@mjump.missfresh.net -p2222 二.问题 1.分页问题:job_id为空时能查询出来(笛卡尔乘积),需要加上AND res ...

  5. C8051开发环境

    1 keilC51 2 Silicon Laboratories C8051Fxxx uVision Driver_4 C:\Keil9 3  Silicon Laboratories Configu ...

  6. (转)COBBLER无人值守安装

    COBBLER无人值守安装 说在最前面的话 在看Cobbler之前请大家先看一下Kickstart无人值守安装,了解一下Cobbler的实现原理.但是Cobbler是独立的,不需要先安装Kicksta ...

  7. JAVA基础之Date类、DateFormat类及Calendar类

    个人理解: 关于Date类,进行截取或者转换时一定要注意好数据类型,long类型后面要加上L.时间的原点是1970年.用DateFormat则完成日期与文本之间的转换,特别注意的是:月是用M,时是用H ...

  8. 【Unity3D】射箭打靶游戏(简单工厂+物理引擎编程)

    打靶游戏:     1.靶对象为 5 环,按环计分:    2.箭对象,射中后要插在靶上:    3.游戏仅一轮,无限 trials: 增强要求:  添加一个风向和强度标志,提高难度 游戏成品图: U ...

  9. GreenDao 3.x 注解中ToOne和ToMany的个人理解

    GreenDao是什么东西这个就不用多说了.自从GreenDao升级到3.0之后,编译的方法发生了改变.当然这个改变是有助于快速开发的. 区别在哪随便百度一下都可以知道.这里就不多说了. 这里主要说的 ...

  10. Garmin APP开发之布局

    上一章节介绍了garmin app开发的入门,包括garmin-sdk,开发工具的安装部署,文章结尾我们新建了我们的第一个app程序Garmin开发-入门: http://tieba.baidu.co ...