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集群同一网段下的主机)
安装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自动供给的更多相关文章
- kubernetes(14):k8s基于NFS部署storageclass实现pv自动供给
k8s基于NFS部署storageclass实现pv自动供给 https://www.cnblogs.com/Smbands/p/11059843.html https://www.jianshu.c ...
- 基于NFS的PV动态供给(StorageClass)
一.简介 PersistentVolume(PV)是指由集群管理员配置提供的某存储系统上的段存储空间,它是对底层共享存储的抽象,将共享存储作为种可由用户申请使的资源,实现了“存储消费”机制.通过存储插 ...
- 7.2 k8s 基于PV、PVC搭建zookeeper 3节点集群
1.PV,PVC介绍 1.1.StorageClass & PV & PVC关系图 Volumes 是最基础的存储抽象,其支持多种类型,包括本地存储.NFS.FC以及众多的云存储,我们 ...
- 5.基于二进制部署kubernetes(k8s)集群
1 kubernetes组件 1.1 Kubernetes 集群图 官网集群架构图 1.2 组件及功能 1.2.1 控制组件(Control Plane Components) 控制组件对集群做出全局 ...
- 基于k8s集群部署prometheus监控ingress nginx
目录 基于k8s集群部署prometheus监控ingress nginx 1.背景和环境概述 2.修改prometheus配置 3.检查是否生效 4.配置grafana图形 基于k8s集群部署pro ...
- 基于k8s集群部署prometheus监控etcd
目录 基于k8s集群部署prometheus监控etcd 1.背景和环境概述 2.修改prometheus配置 3.检查是否生效 4.配置grafana图形 基于k8s集群部署prometheus监控 ...
- 基于webhook方案的Git自动部署方案
之前已经用Git实现了自己博客的提交自动部署,并自动提交到GitHub和coding以备不时之需.平时项目代码都托管在Coding或者GitHub上,也已经用上了coding提供的webhook功能, ...
- k8s集群部署rabbitmq集群
1.构建rabbitmq镜像 RabbitMQ提供了一个Autocluster插件,可以自动创建RabbitMQ集群.下面我们将基于RabbitMQ的官方docker镜像,添加这个autocluste ...
- k8s实战之部署Prometheus+Grafana可视化监控告警平台
写在前面 之前部署web网站的时候,架构图中有一环节是监控部分,并且搭建一套有效的监控平台对于运维来说非常之重要,只有这样才能更有效率的保证我们的服务器和服务的稳定运行,常见的开源监控软件有好几种,如 ...
随机推荐
- 搭建yum源
五.保留缓存rpm包, 修改配置文件,将最新的rpm包下载到本地并保存. 3) 使用yum命令安装httpd软件包 六.制作yum仓库 1) 自定义yum仓库:createrepo 安 ...
- c# json字符串转数组
JArray jo = (JArray)JsonConvert.DeserializeObject("这里是json字符串");
- Jmeter将JDBC Request查询结果作为下一个接口参数方法
现在有一个需求,从数据库tieba_info表查出rank小于某个值的username和count(*),然后把所有查出来的username和count(*)作为参数值,用于下一个接口. tieba_ ...
- missfresh问题记录
一.基本信息 1.登陆机器 ssh lina02@mjump.missfresh.net -p2222 二.问题 1.分页问题:job_id为空时能查询出来(笛卡尔乘积),需要加上AND res ...
- C8051开发环境
1 keilC51 2 Silicon Laboratories C8051Fxxx uVision Driver_4 C:\Keil9 3 Silicon Laboratories Configu ...
- (转)COBBLER无人值守安装
COBBLER无人值守安装 说在最前面的话 在看Cobbler之前请大家先看一下Kickstart无人值守安装,了解一下Cobbler的实现原理.但是Cobbler是独立的,不需要先安装Kicksta ...
- JAVA基础之Date类、DateFormat类及Calendar类
个人理解: 关于Date类,进行截取或者转换时一定要注意好数据类型,long类型后面要加上L.时间的原点是1970年.用DateFormat则完成日期与文本之间的转换,特别注意的是:月是用M,时是用H ...
- 【Unity3D】射箭打靶游戏(简单工厂+物理引擎编程)
打靶游戏: 1.靶对象为 5 环,按环计分: 2.箭对象,射中后要插在靶上: 3.游戏仅一轮,无限 trials: 增强要求: 添加一个风向和强度标志,提高难度 游戏成品图: U ...
- GreenDao 3.x 注解中ToOne和ToMany的个人理解
GreenDao是什么东西这个就不用多说了.自从GreenDao升级到3.0之后,编译的方法发生了改变.当然这个改变是有助于快速开发的. 区别在哪随便百度一下都可以知道.这里就不多说了. 这里主要说的 ...
- Garmin APP开发之布局
上一章节介绍了garmin app开发的入门,包括garmin-sdk,开发工具的安装部署,文章结尾我们新建了我们的第一个app程序Garmin开发-入门: http://tieba.baidu.co ...