kubernetes云原生纪元:共享存储-PV&&PVC(上)

之前我们学习的都是无状态的服务,如果有状态的服务就非常麻烦,比如有的服务会把自己文件存放到自己服务器的目录上,如果直接嵌入到docker 上那个这个目录每次都会清空,没有创建一个容器磁盘空间都是全新的,可能有人会说用目录挂载,把目录挂载到宿主机上,设置好节点的亲和性就可以每次部署都部署到同一台服务器上不就行了吗?没错这样是可以的,但是缺点比较大,首先你绑定了一台机器,一旦这台机器挂了,应用处于不可用状态了,还有就是数据备份问题,但是上面的kubernetes都想到了,我们开始学习共享存储。

概念

PV

PV 是persistentVolume的简写 ,persistentVolume是描述的是持久化数据卷。由管理员提供的网络存储的一部分。就像集群中的节点一样,PV也是集群中的一种资源。它也像Volume一样,是一种volume插件,但是它的生命周期却是和使用它的Pod相互独立的。PV这个API对象,捕获了诸如NFS、ISCSI、或其他云存储系统的实现细节。

小例子

远程共享存储

storage: 10Gi存储容量10g,

accessModes: accessModes:访问模式是ReadWriteOnce 意思是只有一个pod 使用这个pv,权限是读写,如果多个pod使用这个地方设置为ReadWriteMany

访问模式包括:
   ▷ ReadWriteOnce —— 该volume只能被单个节点以读写的方式映射
   ▷ ReadOnlyMany —— 该volume可以被多个节点以只读方式映射
   ▷ ReadWriteMany —— 该volume只能被多个节点以读写的方式映射

nfs:# kubernetes 提供的存储方式,

nfs远程目录地址 path: "/tmp" server: 172.22.1.2

apiVersion: v1
kind: PersistentVolume
metadata:name: nfs
spec:capacity:storage: 10Gi  #存储容量10gaccessModes: #  访问模式是ReadWriteOnce 意思是只有一个pod- ReadWriteOncenfs: # kubernetes 提供的存储方式,path: "/tmp"server: 172.22.1.2

PVC

PVC 是PersistentVolumeClaim的简写,PersistentVolumeClaim是描述的一个pod所希望使用的持久化存储的需求,比如多少磁盘,内存大小,读写权限。

PVC必须和使用它的pod在同一个命名空间,集群发现pod命名空间的PVC,根据PVC得到其后端的PV,然后PV被映射到host中,再提供给pod

下面定义的是一个具有读写权限的并且只能由我独占ReadWriteOnce的一个有10g 空间大小的这样一个存储。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs
spec:accessModes: # - ReadWriteOnceresources:requests:storage: 10Gi

这是一个pod对共享存储的需求和期望

PV && PVC 的绑定

PV和PVC都创建好了,这时候需要建立他们之间的绑定 ,PV要满足PVC的要求:

权重大小,读写权限,

PV和PVC stroageclass 的name 必须一致

满足这些PersistentVolumeConroller会发现匹配的PV和PVC,自动建立绑定关系,本质上是在 PVC的描述对象里把p V名字填进去

绑定好就可以直接使用了,通过volume挂载persistentVolumeClaim指定PVC的名字

apiVersion: v1
kind: Pod
metadata:name: web-dev
spec:containers:- name: web-devimage: web:v1ports:- containerPort: 8080volumeMounts:- name: nfsmountPath: "/files"volumes:- name: nfs persistentVolumeClaim: # 指定PVC的名字claimName: nfs

具体原理:

Pod里面声明一个PVC的名字,PVC里面描述了pod的需求权限,空间…并且PVC绑定了一个PV,PV描述具体存储的后端服务的地址,如何访问,都有哪些参数。

关于后端具体的存储服务和PV 的配置一般由集群管理员事先给我们配置好,剩下又kubernetes自己解决,包括运维定义的PVPVC建立绑定关系,把Pod 调度起来,把Pod 的volume 设置好 都是由kubernetes搞定的

设置volume首先是volume对应本地具体的目录,对于共享存储就不是一个目录,每种不同的共享存储服务,有不同处理过程,像nfs kubelt 会把这个目录挂载远程PV指定的位置,相当于执行mount命令,把主机的目录挂载nfs server 上,之后对于docker 来说并没有什么区别,还是用 -v参数把这个目录映射到容器里面,最终实现了这个共享存储。

StorageClass

这个时候有很多POD需要共享存储,每次建立一个就需要让运维同学给我们配置一个PV,不用还得通知他得回收,这个代价太大了,kubernetes提供自动管理PV的机制叫做StorageClass。它的本质就是PV的模版。StorageClass自动创建PV

provisioner: kubernetes.io/aws-ebs #kubernetes内置存储插件的名字

parameters:#具体创建PV用到的参数

type: io1,zone: us-east-1d,iopsPerDB: "10“是aws-ebs创建PV所用到的。如果换成其他存储插件,这些参数有所区别。每种插件都有自己所需要的参数。

例子

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: stroage-class-demo
provisioner: kubernetes.io/aws-ebs #kubernetes内置存储插件的名字
parameters: #具体创建PV用到的参数type: io1zone: us-east-1diopsPerDB: "10“

有了StorageClass后PVC的配置

storageClassName: 指定StorageClass的名字,这样我使用kubeContro 去创建PVC的时候 kub ernetes会根据这个名字 找我刚才定义的StorageClass根据它自动创建一个大小10G的PV,然后建立起绑定关系。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-demo
spec:accessModes:- ReadWriteOncestorageClassName: storage-class-demo resources:requests:storage: 10Gi

StorageClass的设计要点

  • 每个PV和PVC都有StorageClass

    没有设置就会有一个默认空的StorageClass,手动创建PV也是可以指定StorageClass,PVC中指定相同名字的StorageClass ,kubernetes会自动建立绑定关系,并不在意StorageClass不需要真实存在,只要名字一样就可以。

  • StorageClass不需要真实存在

一张图概括:

存储插件:ceph…

PV :可以说集群管理员创建的也可以是同storageClass自动创建的PV,
storageClass必定只能对应一种类型的后端存储

对应关系:一个POD可以使用多个PVC,一个PVC也可以同时给多个POD提供服务,一个PVC只能绑定一个PV,一个PV只能对应一种后端存储。

实践

我们这里用 GlusterFs做存储插件,使用GitHub gluster-kubernetes 这个项目,相关重要组件还有heketi

当然对我们基础环境也有一定的要求:

  • 三个**GlusterFS**的节点,每份数据有三个节点
  • 每个节点有个裸磁盘,没有经过分区的磁盘,**GlusterFS**基本要求,他会完全接管这块磁盘,实现更高效的管理数据

kubernetes云原生纪元:共享存储-PVPVC(上)相关推荐

  1. kubernetes云原生纪元:资源管理(k8s)Resource(上)

    kubernetes云原生纪元:资源管理(k8s)Resource(上) 文章目录 kubernetes云原生纪元:资源管理(k8s)Resource(上) 初识 核心设计 如何使用 极限测试 内存过 ...

  2. kubernetes云原生纪元:StatefulSet 状态守护者

    kubernetes云原生纪元:StatefulSet 状态守护者 文章目录 kubernetes云原生纪元:StatefulSet 状态守护者 介绍 实践 验证顺序性 验证持久存储区分 总结 介绍 ...

  3. kubernetes云原生纪元:健康检查-高可用的守护者

    kubernetes云原生纪元:健康检查-高可用的守护者

  4. 高性能云原生数据对象存储MinIO实战-上

    文章目录 概述 定义 特性 架构设计 推荐配置 常见应用场景 部署 支持部署方式 部署常见错误 快速入门MinIO Minio纠删码快速入门 分布式MinIO 概述 定义 MinIO 官网地址 htt ...

  5. Kubernetes云原生开源分布式存储介绍

    Kubernetes存储介绍 为何引入PV.PVC以及StorageClass? 熟悉Kubernetes的都对PV.PVC以及StorageClass不陌生,我们经常用到,因此这里不再详细介绍PV. ...

  6. 【直播回看】「EDGE X Kubernetes · 云原生在边缘的实践与应用」

    简介:6 月 26 日(本周六)下午 13:00-18:00 ,由阿里云联合 VMware.Intel 举办的「KubeMeet|EDGE X Kubernetes」专场沙龙将在杭州举办,12 位来自 ...

  7. FASS-K8S云原生全闪存储解决方案

    分布式存储|北京大道云行科技有限公司 1 FASS-CSI背景 随着Kubernetes容器编排系统的持续发展,应用程序的开发与部署方式经历了巨大的变革.微服务结构体系的兴起,促使基础架构与应用程序逻 ...

  8. 云原生架构演进与企业上云

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 过去的一段时间和一些架构师 / 技术负责人聊天,云原生和企业上云是最近一段架构演进的一个常见话题,那么小公司到大型公司在上云 ...

  9. 将 Kubernetes 云原生技术革命进行到底!

    作者 | 张磊,阿里云高级技术专家 责编 | 唐小引 头图 | CSDN 下载自 VCG 出品 | CSDN(ID:CSDNnews) 几天前,阿里云和微软云共同宣布,Open Application ...

最新文章

  1. 汇编语言中寻址方式[bx + idata]
  2. java 反序列化工具 marshalsec改造 加入dubbo-hessian2 exploit
  3. JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用
  4. el-input输入金额,保留两位小数
  5. 【codeforces 103E】 Buying Sets
  6. 去哪儿对垒携程 在线旅游静悄悄的革命
  7. mosquitto源码分析(二)
  8. 发达国家餐厅的一张罚单 让我们中国人汗颜
  9. IT人士|不可不知的10个行业内幕
  10. n 中选 m —— 随机采样的艺术
  11. 简单学习Infopath
  12. Java读取Oracle中LONG类型数据
  13. 神经网络自适应PID控制及其应用
  14. Android开发之视频播放器
  15. 初识微信小程序 图片与声音
  16. ESIM模型的“全能版”!网易易盾实验室研究员解读HIM混合推理模型
  17. Linux内核部件分析 设备驱动模型之driver ---mark 详细
  18. Aspose.Cells 给EXCEL区域内加上单元格边框
  19. 99、插值法,函数逼近,曲线拟和,数值积分,数值微分,解线性方程组的直接方法,解线性方程组的迭代法,非线性方程求根,常微分方程的数值解法...
  20. Qt编写可视化大屏电子看板系统18-柱状分组图

热门文章

  1. 太傻生活原则是:“无需选择,理解一切,接受一切”--《太傻十日谈》读后感
  2. Lua: Error during loading: \[string “/usr/share/wireshark/init.lua“\]:45
  3. 2021年全球与中国汽车ABS和ESC行业市场规模及发展前景分析
  4. 有道翻译 python 翻译
  5. Java编程经典书籍
  6. c# 自定义多个SplitContainer 支持点击放大缩小
  7. 低代码,拯救“疯狂”的程序员
  8. 【深度学习】环境搭建—TensorFlow 2.0环境搭建
  9. 缺陷修改实践——replace函数的运用|思考?
  10. gradle 跳过单元测试的3种方法