在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. python——字符编码

    Unicode 是字符集 UTF-8 是编码规则 Unicode:给每一个字符分配一个唯一的ID(又称码位). 编码规则:将码位转换为字节序列的规则. 1.什么是字符编码:字符翻译成数字,所遵循的标准 ...

  2. Web自动化测试—PO设计模式(三)

    test_case目录下面放你要执行的用例 目录结构 ui_auto_test --src --test_case --__init.py --test_login_case --pages --__ ...

  3. CSS grid layout demo 网格布局实例

    直接 上代码,里面我加注释,相当的简单, 也可以去我的github上直接下载代码,顺手给个星:https://github.com/yurizhang/micro-finance-admin-syst ...

  4. 如何构建多模块的SpringBoot项目

    通过阅读本文你将了解到:如何将已有SpringBoot项目改成多模块 & 如何新构建多模块SpringBoot项目 以下示例基于我正在使用的order(订单服务)进行演示,无论你用的是什么项目 ...

  5. SpringMVC注解方式与文件上传

    目录: springmvc的注解方式 文件上传(上传图片,并显示) 一.注解 在类前面加上@Controller 表示该类是一个控制器在方法handleRequest 前面加上 @RequestMap ...

  6. 常用API(Object、String、StringBuffer、用户登陆注册)

    常用API 今日内容介绍 u Object u String u StringBuilder 第1章 Java的API及Object类 在以前的学习过程中,我们都在学习对象基本特征.对象的使用以及对象 ...

  7. 终于有人把P2P、P2C、O2O、B2C、B2B、C2C的区别讲透了!还有许多其它类别的类型分享

    平时在看招聘时,经常看到我们是什么B2C电子商务网站,但是一直不知是啥意思,今天在WEB开发者上面看到这篇文章,就是知道了个所以然,以记录分享. P2P.P2C .O2O .B2C.B2B. C2C, ...

  8. android动画ppt整理

    案例

  9. Leet-code144. Binary Tree Preorder Traversal

    这是一道将二叉树先序遍历,题目不难. 首先采用深搜递归 /** * Definition for a binary tree node. * public class TreeNode { * int ...

  10. 【虚拟机-远程链接】Azure Windows 虚拟机常见导致无法远程的操作

    对Azure虚拟机的一些操作可能会导致无法远程连接,本文罗列了以下导致不能远程连接的场景: 场景1 - 在虚拟机网卡配置中配置IP地址或MAC地址 场景2 - 远程桌面授权过期 场景3 - 误设置“不 ...