Kubernetes学习(五)持久化存储
Volume 卷
容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用带来了一些问题。首先,当容器崩溃时,kubectl将重新启动容器,容器中的文件将会丢失--应为容器会以干净的状态重建。其次,当在一个Pod中运行多个容器是,常常需要在这些容器之间共享文件。Kubernetes抽象出Volume对象来解决这2个问题。
Docker也有Volume的概念,但对它是有少量且松散的管理。在Docker中,Volume是磁盘上或者另外一个容器内的一个目录。直到最近,Docker才支持对基于本地磁盘的Volume的生存期进行管理。虽然Docker现在也能提供Volume驱动程序,但是目前功能还非常有限(例如,截止Docker 1.7,每个容器只允许有一个Volume驱动程序,并且无法将参数传递给卷)。
另一方面,Kubernetes卷具有明确的生命周期--与包裹它的pod相同。因此,卷比Pod中运行的任何容器的存活周期都长,在容器重新启动时数据也会得到保留。当然,当一个Pod不再存在时,卷也将不再存在。更重要的是Kubernetes支持许多类型的卷,Pod也能同时使用任意数量的卷。
卷的核心是包含一些数据的目录,Pod中的容器可以访问该目录,特定的卷类型可以决定这个目录如何形成的,并能决定它支持何种介质,以及目录中存放什么内容。
使用卷时,Pod声明中需要提供卷的类型 (spec.volumes字段)和卷挂载的位置(spec.containers.volumeMounts字段)
Kubernetes提供了众多的volume类型,包括emptyDir、hostPath、nfs、glusterfs、cephfs、ceph
emptyDir
当Pod指定到某个节点上时,首先创建的是一个emptyDir卷,并且只要Pod在该节点上运行,卷就一直存在。就像它的名称一样,卷最初是空的。尽管Pod中的容器挂载emptyDir卷的路径可能相同也可能不同,但是,这些容器都可以读写emptyDir卷中相同的文件。当Pod从节点上删除时,emptyDir卷中的数据也会永久删除。
容器崩溃并不会导致Pod从节点上移除,因此容器崩溃时emptyDir卷中的数据是安全的。
emptyDir的用途:
- 缓存空间,例如基于磁盘的归并排序
- 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃状态恢复执行
- 在web服务器容器服务数据时,保存这些文件
hostPath
hostPath卷能将主机节点文件系统上的文件或目录挂载到Pod中。虽然这不是大多数pod需要的,但是它为一些应用提供强大的持久化能力。
apiVersion: v1
kind: Pod
metadata:name: myapplabels:name: myapp
spec:containers:- name: myappimage: nginxvolumeMounts:- mountPath: /test-nginxname: hostpathvolumeresources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80volumes:- name: hostpathvolumehostPath:path: /tmp/nginxtype: DirectoryOrCreate
NFS卷
很多应用需要在集群内部有一个统一的地方存储文件,比如图片日志等,而使用hostPath方式并不灵活,应为需要指定host的地址
挂载NFS卷
1、安装nfs服务
yum install -y nfs-utils
2、修改配置
vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
3、在master节点启动nfs
systemctl enable --now rpcbind
systemctl enable --now nfs
4、创建Pod,挂载nfs卷
apiVersion: v1
kind: Pod
metadata:name: myapplabels:name: myapp
spec:containers:- name: myappimage: nginxvolumeMounts:- mountPath: /usr/share/nginx/htmlname: nfsresources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80volumes:- name: nfsnfs:server: masterpath: /nfsdata
PersistantVolume持久化存储
存储的管理是一个与计算实例的管理完全不同的问题。PersistantVolume子系统为用户和管理员提供了一组API,将存储如果供应的细节从其如何被使用中抽象出来。为了实现这点,我们引入了两个新的API资源:PersistantVolume和PersistantVolumeClaim。
持久卷(PersistantVolume PV)是集群中的一块存储,可以由管理员事先提供,或者使用存储类来动态提供。持久卷是集群资源,就像节点也是集群资源一样,PV持久卷和普通Volume一样,也是使用卷插件来实现的,只是他们拥有独立于任何使用PV的Pod的生命周期。此API对象中记录了存储的实现细节,无论背后是nfs、iSCSI还是特定于云平台的存储系统。
持久卷申领(PersistantVolumeClain PVC)表达的是用户对存储的请求。概念上与Pod类似。Pod会耗节点资源,而PVC申领会耗用PV资源。Pod可以请求特定数量的资源(cpu、内存),同样PVC申领也可以请求特定大小和访问模式
尽管PVC允许用户消耗抽象的存储资源,常见的情况是针对不同的用户需要具有不同属性的PV卷。集群管理员需要能够提供不同性质的PV,并且这些PV卷之间的差别仅限于卷大小和访问模式,同时又不能将卷是如何实现的这些细节暴露给用户。为了满足这类需求,就有了存储类StorageClass资源
示例:pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-demolabels:name: pv-demo
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Recyclenfs:path: /nfsdataserver: master
[root@master k8s]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-demo 5Gi RWO Recycle Available 29s
[root@master k8s]#
PersistantVolumeClain
访问模式
Claim在请求具有特定访问模式的存储时,使用与卷相同的访问模式约定
卷模式
Claim使用与卷相同的约定来表明是将卷作为文件系统还是块设备来使用
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-demolabels:name: pvc-demo
spec:accessModes:- "ReadWriteOnce"resources:requests:storage: 2Gi
[root@master k8s]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-demo Bound pv-demo 5Gi RWO 5s
[root@master k8s]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-demo 5Gi RWO Recycle Bound default/pvc-demo 8m32s
[root@master k8s]#
StorageClass
Kubernetes提供了一套可以自动创建PV的机制,Dynamic Provisioning,这个机制单独核心就是StorageClass这个API对象
StorageClass对象定义了以下两部分内容
1.PV的属性,比如存储类型、Volume大小等
2.创建这种PV需要用到的存储插件
为什么需要StorageClass
在一个大规模的Kubernetes集群里,可以有成千上万个PVC,这就意味着运维人员必须实现创建出多个PV。此外,随着项目的需要,会有新的PVC不断被提交,那么运维人员就需要不断的添加新的PV,否则新Pod就会因为PVC绑定不到PV从而导致创建失败。而且通过PVC请求到一定的存储空间也很有可能不足以满足应用对于存储设备的各种需求。
而且不同的应用对于存储性能的要求也不尽相同,比如读写速度、并发性能等,为了解决这一问题,Kubernetes引入了一个新的资源对象:StorageClass,通过StorageClass的定义,管理员可以将存储资源定义为某种资源类型,比如快速存储、慢性存储等,用户根据StorageClass的描述就可以非常直观的知道各种存储资源的具体特性了,这样就可以根据应用特性去申请合适的存储资源了。
StorageClass对象的命名很重要,用户使用这个命名请求生成一个特定的类,当创建StorageClass对象时,管理员设置StorageClass对象的命名和其他参数,一旦创建了对象就不能再对其更新。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: managed-nfs-storage
provisioner: qgg-nfs-storage #这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
parameters:archiveOnDelete: "false"
示例:PVC&Storage挂载NFS
1、创建Persistent Volume Provisioner
nfs-provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default #与RBAC文件中的namespace保持一致
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: registry.cn-beijing.aliyuncs.com/qingfeng666/nfs-client-provisioner:v3.1.0volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: qgg-nfs-storage #provisioner名称,请确保该名称与 nfs-StorageClass.yaml文件中的provisioner名称保持一致- name: NFS_SERVERvalue: master #NFS Server IP地址- name: NFS_PATHvalue: /nfsdata #NFS挂载卷volumes:- name: nfs-client-rootnfs:server: master #NFS Server IP地址path: /nfsdata #NFS 挂载卷
2、创建用户和角色RBAC
rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default #根据实际环境设定namespace,下面类同
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
3、创建storage-class
storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: managed-nfs-storage
provisioner: qgg-nfs-storage #这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
parameters:archiveOnDelete: "false"
4、创建PVC
pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claimannotations:volume.beta.kubernetes.io/storage-class: "managed-nfs-storage" #与nfs-StorageClass.yaml metadata.name保持一致
spec:accessModes:- ReadWriteManyresources:requests:storage: 1Mi
5、创建Pod,引用Storage Class
pod.yaml
kind: Pod
apiVersion: v1
metadata:name: test-pod
spec:containers:- name: test-podimage: nginxcommand:- "/bin/sh"args:- "-c"- "touch /mnt/SUCCESS && exit 0 || exit 1"volumeMounts:- name: nfs-pvcmountPath: "/mnt"restartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim #与PVC名称保持一致
相关文章:

Kubernetes学习(五)持久化存储
Volume 卷 容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用带来了一些问题。首先,当容器崩溃时,kubectl将重新启动容器,容器中的文件将会丢失--应为容器会以干净的状态重建。其次,当在一个Pod中运行多个容…...

下一个7年,保持期待、持续思考,酷雷曼继续向前!
过去7年,我们一直在思考, VR技术究竟能为我们的生活带来什么? 是足不出户就能云游千里的秀美风光? 是在家就能沉浸式体验线上消费的便利? 还是为商企和用户搭建更快速的沟通桥梁? NO.1、技术变革 在信…...

天梯赛训练L1-010--L1-012
目录 1、L1-010 比较大小 2、L1-011 A-B 3、L1-012 计算指数 4,一些题外话 1、L1-010 比较大小 分数 10 本题要求将输入的任意3个整数从小到大输出。 输入格式: 输入在一行中给出3个整数,其间以空格分隔。 输出格式: 在一…...

三分钟完成Stable Diffusion本地安装(零基础体验AI绘画)
三分钟完成Stable Diffusion本地安装前言安装步骤下载链接前言 最近AI绘画很火,很多无编程基础的小伙伴也想体验一下,所以写这篇博客来帮助小伙伴们愉快的体验一下~废话少说,我们直接开整! 安装步骤 首先,下载本项目的…...

电子台账:教程目录及软件下载
前面内容有点杂乱,这里整理一下教程目录。重点是制作模板,企业只要学会适合自己的一种就行。如果这些模板都学会做了,那可以当老师了。1 目录1 模板制作之一——列过滤(水平过滤)2 模板制作之二——行过滤(…...

多态的优势和弊端
目录 1.多态的优势 2.多态的弊端是什么? 3.引用数据类型的类型,转换有几种方式 4.强制类型转换能解决什么问题楠? 1.多态的优势 方法中,使用父类作为参数,可以接收所有子类的对象 package ploydemo3;import java.u…...

android h5考勤管理系统myeclipse开发mysql数据库编程服务端java计算机程序设计
一、源码特点 android h5考勤管理系统是一套完善的WEBandroid设计系统,对理解JSP java,安卓app编程开发语言有帮助(系统采用web服务端APP端 综合模式进行设计开发),系统具有完整的源代 码和数据库,系统主…...

第二道pwn题:shellcode
题目来自视频:链接:https://pan.baidu.com/s/17vX9dbfHkXBw71mcEXBgNQ?pwd6666 提取码:6666查看文件类型和保护,虽然现在的我还没有明白太多的保护。64位,放到ida里边rbp:保存的是栈中当前执行函数的基本地址。当前执…...

《华为数据之道》读书笔记
《华为数据之道》读书笔记第二章:2.2.1 管理总纲有四点:信息架构管理原则、数据产生管理、数据应用管理原则、数据问责与奖惩管理原则2.1.2 信息架构管理政策:管理信息架构的角色与职责:公司数据Owner、各数据Owner、数据管理专业…...

C++源码pcl1.13.0库编译环境搭建及配置
Pcl github库https://github.com/PointCloudLibrary/pcl官网地址https://pointclouds.org/Pcl exe的下载地址,各个版本,以及各版本对应的源码https://github.com/PointCloudLibrary/pcl/releases源码需要编译,编译之前安装AllInOne的exe程序&…...

Idea工具单工程使用卡顿设置
一、开启Idea内存占比指示 1.1、勾选Idea 内存指示器 1.2、右下角展示当前项目:内存/总内存(726/1024MB) 二、修改Idea自定义内存 2.1、打开help - Edit Custom VM Options 2.2、自定义虚拟内存设置 -Xms1024m // 初始内存分…...

Android 9.0 Camera2退出时屏幕旋转为横屏
1.概述 在9.0的系统rom定制化中,由于是大屏幕产品,所以系统屏幕是默认横屏的,但是在Camera2是竖屏的app,所以会在进入Camera2相机时变成竖屏,退出相机时,还是竖屏, 对于横屏的机器来说不太符合要求,所以要求在退出相机时,旋转为横屏,这就需要知道哪个api监听Camera2 退…...

【云原生】rancher2.6部署MySQL—2023.03
文章目录概要1. 准备NFS服务器1.1 安装nfs1.2 创建挂载路径1.3 启动NFS服务2. 所有node节点上安装NFS服务3. rancher上部署MySQL3.1 创建PV3.2 创建PVC3.3 创建服务发现3.4 部署MySQL服务4. 测试概要 本文以单master节点为例,部署mysql,多master&#x…...

行测-判断推理-图形推理-样式规律-空间重构-立体拼合
有凸必有凹,排除A CD显然不对选BA和4能组成长方体B和3能组成长方体C和1能组成长方体选D这两个东西应该在同一侧,排除A C中间应该要由凸起,排除D选B图1向左旋转90图2逆时针旋转90选A...

细说蛮力法(一)
细说蛮力法(一)蛮力法百元买百鸡传统暴力枚举减少无用枚举最优解法蛮力法 蛮力法通常在算法题中经常用到,也称为暴力枚举,其核心为遍历,即通过列举所有可能的情况,从而得到合适的解。从人的思维角度来看&am…...

关于推荐系统的详细介绍
简介推荐系统是一种信息过滤系统,能够自动预测用户对特定产品或服务的偏好,并向其提供个性化的推荐。它通常基于用户的历史行为、个人喜好、兴趣和偏好等,通过数据挖掘和机器学习算法,在大数据的支持下生成个性化的推荐内容&#…...

leetCode刷题笔记
文章目录1. 把两个有序链表整合成一个新的有序列表2. 两数之和3. 有效括号的字符串1. 把两个有序链表整合成一个新的有序列表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 package com.example.demo.main.Domain; impo…...

数学小课堂:数学和哲学的互动关系(自洽的哲学思想受益于数学思维)
文章目录 引言I 数学是“有底”的学问(止于公理)II 数学对哲学的影响2.1 哲学思想受益于数学思维2.2 笛卡尔的贡献2.3 莱布尼茨的哲学思想III 哲学对数学的影响引言 数学和科学各个分支之间在方法上却具有相通性和普适性,这些通用的方法常常让很多学科同时受益,依靠数学逻…...

大聪明教你学Java | 带你了解 Redis 的三种集群模式
前言 🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言Ǵ…...

Java中异常(异常的处理方式(JVM默认的处理方式、自己处理(灵魂四问)、抛出异常(throws、throw))、异常中的常见方法、小练习、自定义异常)
编译时异常:在编译阶段,必须要手动处理,否则代码报错(提醒程序员检查本地信息) 运行时异常:在编译阶段是不需要处理的,是代码运行时出现的异常(代码出错而导致程序出现的问题&#…...

液氮恒温器概述
恒温器是直接或间接控制一个或多个热源和冷源来维持所要求的温度的一种装置。 恒温器要实现这种功能,就必须具有一个敏感元件和一个转换器,敏感元件量度出温度的变化,并对转换器产生所需的作用。转换器把来自敏感元件的作用转换成对改变温度…...

Shiro核心——Realm
RealmRealm的作用Realm的实现Realm的配置实例在Shiro中,Realm是一个非常灵活和强大的安全组件,它能够与各种数据源进行集成,满足各种安全需求。通过实现自定义的Realm,我们可以轻松地定制身份验证、授权和加密逻辑,实现…...

开发钉钉微应用,实现免登+调试
1.创建h5微应用 https://open.dingtalk.com/document/orgapp/develop-org-h5-micro-applications 根据里面的三个步骤,创建h5微应用 2.免登之前必须要先进行JSAPI的授权 文档说明: https://open.dingtalk.com/document/orgapp/jsapi-authentication 根据文档中的说明 步骤…...

0308java基础-注解,反射
一,注解 1.什么是注解: Annotation是从jdk5.0开始引入的新技术作用: 不是程序本身,可以对程序作出解释可以被其他程序读取格式: 以注释名在代码中存在,还可以添加一些参数值SuppressWarnings(value"…...

【鸿蒙应用ArkTS开发系列】- 页面跳转及传参
先看下效果图 大致实现的功能点: 从Indext页面跳转到Second页面,传递两个参数,一个字符串,一个数量;Second获取Index页面传递的数据;Second页面点击返回弹窗;Second页面返回携带参数数据&#…...

StringBuilder 类
Java StringBuilder类是一个可变字符串缓冲区,它提供了丰富的方法可以方便地进行字符串操作。与Java StringBuffer类类似,Java StringBuilder类的主要作用是优化字符串的拼接操作,提高代码的效率。在本篇文章中,我们将详细介绍Jav…...

kubectl-k8s用户切换
kubernetes默认使用$HOME/.kube/config配置文件。可以在配置文件中定义多个USER和Cluster的上下文。所以就有两种方式切换用户同一个config中,切换不同用户上下文切换不同的config配置文件同config切换不同用户上下文查看config文件kubeconfig config view查看当前上…...

【面试题】三道面试题让你掌握JavaScript中的执行上下文与作用域以及闭包
前言大厂面试题分享 面试题库前后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库大家好,笔者呢最近再回顾JavaScript知识时,又看到了JavaScript的一些较为常见的内容,仔细看了之后发现…...

计算机网络-- 应用层(day08)
计算机网络两种方式 网络应用程序运行再处于网络边缘的不同端系统上,通过彼此间的通信来共同完成某项任务。 开发一种新的网络应用首先要考虑的问题就是网络应用程序在各种端系统上的组织方式和它们之间的关系。 目前流行的主要有以下两种: 客户/服务器…...

English Learning - L2-5 英音地道语音语调 弹力双元音 [ɪə] [ʊə] [eə] 2023.03.6 周一
English Learning - L2-5 英音地道语音语调 弹力双元音 [ɪə] [ʊə] [eə] 2023.03.6 周一朗读节奏元音的长度元音发音在清辅音和浊辅音前的区别元音发音跟后面浊辅音节数的区别元音在重读音节中复习大小元音发音对比/ʌ/ 舌中音/ɒ/ 舌后音/ʊ/ 舌后音/ɪ/ 舌前音[ɑ:] VS […...