kubernetes Value:将磁盘挂载到容器,PV,PVC

2023-05-16

6.1.介绍卷

6.1.1.卷的类型

emptyDir-用于存储临时数据的简单空目录

hostPath-用于将目录从工作节点的文件系统挂载到pod

nfs-挂载到pod中的NFS共享卷。

还有其他的如gitRepo、gcepersistenDisk

 

6.2.通过卷在容器间共享数据

6.2.1.使用emptyDir卷

卷的生命周期与pod的生命周期项关联,所以当删除pod时,卷的内容就会丢失。

使用empty示例代码如下:

apiVersion: v1
kind: Pod
metadata:
  name: fortune
spec:
  containers:
  - image: luksa/fortune
    name: html-gener
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx
      readOnly: true
  - image: nginx/aplin
    name: web-service
    volumeMounts:
    - name: html
      mountPath: /usr/share
      readOnly: true
  volumes:
  - name: html                        //一个名为html的单独emptyDir卷,挂载在上面的两个容器中
    emptyDir: {}

  

6.3.访问工作节点文件系统上的文件

6.3.1.hostPath卷

hostPath是持久性存储,emptyDir卷的内容随着pod的删除而删除。

使用hostPath会发现当删除一个pod,并且下一个pod使用了指向主机上相同路径的hostPath卷,则新pod将会发现上一个pod留下的数据,但前提是必须将其调度到与第一个pod相同的节点上。

所以当你使用hostPath时请务必考虑清楚,当重新起一个pod时候,必须要保证pod的节点与之前相同。

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
      # this field is optional
      type: Directory

 

6.4.使用持久化存储

怎样保证pod重新启动后调度到任意一个节点都有相同的数据可用,这就需要做到持久化存储。

因此必须要将数据存储在某种类型的网络存储(NAS)中。

各种支持的方式不尽相同,例如 GlusterFS 需要创建 Endpoint,Ceph/NFS 之流就没这么麻烦了。

6.4.1.使用NFS存储

以NFS为例,yml代码如下:

 

 

 

6.4.2.configmap和secert

secret和configmap可以理解为特殊的存储卷,但是它们不是给Pod提供存储功能的,而是提供了从集群外部向集群内部的应用注入配置信息的功能。ConfigMap扮演了K8S集群中配置中心的角色。ConfigMap定义了Pod的配置信息,可以以存储卷的形式挂载至Pod中的应用程序配置文件目录,从configmap中读取配置信息;也可以基于环境变量的形式,从ConfigMap中获取变量注入到Pod容器中使用。但是ConfigMap是明文保存的,如果用来保存数据库账号密码这样敏感信息,就非常不安全。一般这样的敏感信息配置是通过secret来保存。secret的功能和ConfigMap一样,不过secret是通过Base64的编码机制保存配置信息。

从ConfigMap中获取配置信息的方法有两种:

  • 一种是利用环境变量将配置信息注入Pod容器中的方式,这种方式只在Pod创建的时候生效,这就意味着在ConfigMap中的修改配置信息后,更新的配置不能被已经创建Pod容器所应用。
  • 另一种是将ConfigMap做为存储卷挂载至Pod容器内,这样在修改ConfigMap配置信息后,Pod容器中的配置也会随之更新,不过这个过程会有稍微的延迟。

ConfigMap当作存储卷挂载至Pod中的用法:

apiVersion: v1
kind: Pod
metadata:
  name: pod-configmap-vol-2
  labels:
    name: pod-configmap-vol-2
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: my-cm-www
      mountPath: /etc/nginx/conf.d/       # 将名为my-www的configmap挂载至Pod容器的这个目录下。
  volumes:
  - name: my-cm-www
    configMap:               # 存储卷类型选configMap

  secert的方法类似,只是secert对数据进行了加密

 

6.5.从底层存储技术解耦pod

6.5.1.介绍持久卷和持久卷声明

  当集群用户需要在其pod中使用持久化存储时,他们首先创建持久化声明(PVC)清单,指定所需要的最低容量要求,和访问模式,然后用户将持久卷声明清单提交给kubernetes API服务器,kubernetes将找到可以匹配的持久卷并将其绑定到持久卷声明。

  持久卷声明可以当做pod中的一个卷来使用,其他用户不能使用相同的持久卷,除非先通过删除持久卷声明绑定来释放。

6.5.2.创建持久卷

下面创建一个 PV mypv1,配置文件pv1.yml 如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: yh_pv1
spec:
  capacity:
    storage: 1Gi                //capacity 指定 PV 的容量为 1G
  accessModes:                 //accessModes 指定访问模式为 ReadWriteOnce
    - ReadWriteOnce            
  persistentVolumeReclaimpolicy: Recycle  //persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle
  storageClassName: nfs         //storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。
  nfs:
    path: /nfs/data             //指定 PV 在 NFS 服务器上对应的目录
    server: 10.10.0.11

1.accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:

  ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。
  ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。
  ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。

2.persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:
  Retain – 需要管理员手工回收。
  Recycle – 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*
  Delete – 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。

 

创建 pv

# kubectl apply -f pv1.yml 
persistentvolume/yh-pv1 created

 

查看pv:

# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
yh-pv1   1Gi        RWO            Recycle          Available           nfs                     17m

  

STATUS 为 Available,表示 yh-pv1就绪,可以被 PVC 申请。

6.5.3.通过持久卷声明来获取持久卷

 

接下来创建 PVC mypvc1,配置文件 pvc1.yml 如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: yh-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs

  

PVC 就很简单了,只需要指定 PV 的容量,访问模式和 class。

执行命令创建 mypvc1

# kubectl apply -f pvc1.yml 
persistentvolumeclaim/yh-pvc created

查看pvc

# kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
yh-pvc   Bound    yh-pv1   1Gi        RWO            nfs            64s

 

从 kubectl get pvc 和 kubectl get pv 的输出可以看到 yh-pvc1 已经 Bound 到yh- pv1,申请成功。

 

# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
yh-pv1   1Gi        RWO            Recycle          Bound    default/yh-pvc   nfs                     47m

  

6.5.4.在pod中使用持久卷声明

上面已经创建好了pv和pvc,pod中直接使用这个pvc即可

与使用普通 Volume 的格式类似,在 volumes 中通过 persistentVolumeClaim 指定使用 mypvc1 申请的 Volume。

 通过命令创建mypod1

可见,在 Pod 中创建的文件 /mydata/hello 确实已经保存到了 NFS 服务器目录 /nfsdata中。

如果不再需要使用 PV,可用删除 PVC 回收 PV。

 

6.5.5.回收持久卷

当 PV 不再需要时,可通过删除 PVC 回收。

未删除pvc之前  pv的状态是Bound

删除pvc之后pv的状态变为Available,,此时解除绑定后则可以被新的 PVC 申请。

/nfsdata文件中的文件被删除了

 

因为 PV 的回收策略设置为 Recycle,所以数据会被清除,但这可能不是我们想要的结果。如果我们希望保留数据,可以将策略设置为 Retain

通过 kubectl apply 更新 PV:

 

回收策略已经变为 Retain,通过下面步骤验证其效果:

 

① 重新创建 mypvc1

② 在 mypv1 中创建文件 hello

③ mypv1 状态变为 Released

④ PV 中的数据被完整保留。

虽然 mypv1 中的数据得到了保留,但其 PV 状态会一直处于 Released,不能被其他 PVC 申请。为了重新使用存储资源,可以删除并重新创建 mypv1。删除操作只是删除了 PV 对象,存储空间中的数据并不会被删除。

 

新建的 mypv1 状态为 Available,已经可以被 PVC 申请。

PV 还支持 Delete 的回收策略,会删除 PV 在 Storage Provider 上对应存储空间。NFS 的 PV 不支持 Delete,支持 Delete 的 Provider 有 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。

 

6.6.持久卷的动态配置

6.6.1.通过StorageClass资源定义可用存储类型

前面的例子中,我们提前创建了 PV,然后通过 PVC 申请 PV 并在 Pod 中使用,这种方式叫做静态供给(Static Provision)。

与之对应的是动态供给(Dynamical Provision),即如果没有满足 PVC 条件的 PV,会动态创建 PV。相比静态供给,动态供给有明显的优势:不需要提前创建 PV,减少了管理员的工作量,效率高。

动态供给是通过 StorageClass 实现的,StorageClass 定义了如何创建 PV,下面是两个例子。

StorageClass standard

StorageClass slow

这两个 StorageClass 都会动态创建 AWS EBS,不同在于 standard 创建的是 gp2 类型的 EBS,而 slow 创建的是 io1 类型的 EBS。不同类型的 EBS 支持的参数可参考 AWS 官方文档。

StorageClass 支持 Delete 和 Retain 两种 reclaimPolicy,默认是 Delete

与之前一样,PVC 在申请 PV 时,只需要指定 StorageClass 和容量以及访问模式,比如:

 

除了 AWS EBS,Kubernetes 支持其他多种动态供给 PV 的 Provisioner,完整列表请参考 https://kubernetes.io/docs/concepts/storage/storage-classes/#provisioner

 

6.6.2.PV&&PVC在应用在mysql的持久化存储

下面演示如何为 MySQL 数据库提供持久化存储,步骤为:

  1. 创建 PV 和 PVC。

  2. 部署 MySQL。

  3. 向 MySQL 添加数据。

  4. 模拟节点宕机故障,Kubernetes 将 MySQL 自动迁移到其他节点。

  5. 验证数据一致性。

 

首先创建 PV 和 PVC,配置如下:

mysql-pv.yml

 

mysql-pvc.yml

创建 mysql-pv 和 mysql-pvc

 

接下来部署 MySQL,配置文件如下:

 

 PVC mysql-pvc Bound 的 PV mysql-pv 将被 mount 到 MySQL 的数据目录 var/lib/mysql

MySQL 被部署到 k8s-node2,下面通过客户端访问 Service mysql


kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword  

 

更新数据库:

① 切换到数据库 mysql。

② 创建数据库表 my_id。

③ 插入一条数据。

④ 确认数据已经写入。

 关闭 k8s-node2,模拟节点宕机故障。

 

验证数据的一致性:

 由于node2节点已经宕机,node1节点接管了这个任务。

通过kubectl run 命令 进入node1的这个pod里,查看数据是否依旧存在

 

MySQL 服务恢复,数据也完好无损。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kubernetes Value:将磁盘挂载到容器,PV,PVC 的相关文章

  • Vue知识点:v-if和v-show

    v if和v show都是条件渲染指令 xff0c 用于控制元素或模板的渲染 xff0c 也就是控制DOM元素的显示和隐藏 v if v if是 真正 的条件渲染 它控制的是DOM节点 当表达式的值为true或false时 xff0c 生成
  • mybatis-plus le ge 记录

    mybatis plus le ge 记录 LazyTing的博客 CSDN博客 出异常源代码 this baseMapper selectList new QueryWrapper lt PersonnelRoleDO gt lambda
  • 腾讯云 win10链接 重置密码

    win10电脑连接windows服务器的详细步骤 我告诉你msdn 云服务器 重置实例密码 操作指南 文档中心 腾讯云 云服务器 管理登录密码 操作指南 文档中心 腾讯云 腾讯云Windows系统服务器远程登录教程 腾讯云开发者社区 腾讯云
  • Linux下使用FFmpeg将RTMP流转换为HLS

    Linux下使用FFmpeg将RTMP流转换为HLS rtmp转码hls 你知道989的博客 CSDN博客 Linux下使用FFmpeg将RTMP流转换为HLS 所需资料 安装FFmpeg 配置安装nginx并添加nginx http fl
  • MySQL 服务的启动和停止

    4 MySQL 服务的启动和停止 mysql数据库启停 头疼小宇的博客 CSDN博客
  • 相机投影矩阵的计算

    摄像机标定 Camera calibration 中存在的一个关键问题 xff1a 如何求解投影矩阵有了投影矩阵 xff0c 我们便可以把世界坐标系变化到图像坐标系 一 最小二乘法 已知条件 n个三维世界坐标点 保存在dat文件中 n个二维
  • 相机投影矩阵计算

    代码如下 A 3 1 1 1 2 4 1 4 5 B 3 6 2 1 1 4 x1 A B x2 inv A B x3 linsolve A B x1 x2 x3 solve 3 x1 x2 x3 3 6 x1 2 x2 4 x3 2 1
  • Docker EEDocker CE简介与版本规划

    Docker EEDocker CE简介与版本规划 更多干货 分布式实战 xff08 干货 xff09 spring cloud 实战 xff08 干货 xff09 mybatis 实战 xff08 干货 xff09 spring boot
  • 浏览器相关知识点总结

    今天说说浏览器相关问题 xff1a 常见的浏览器内核 xff0c 参见下表 xff1a 浏览器 RunTime内核 xff08 渲染引擎 xff09 JavaScript 引擎ChromeBlink xff08 28 xff09 Webki
  • 图像处理与计算机视觉网址导航

    1常用网站 20条常用网站网址 xff0c 更多点此 Google xff08 gfsoso xff09 直达 计算机视觉网 直达 增强现实资讯 直达 开源中国社区oschina 直达 百度搜索 直达 小木虫 xff0c 学术科研第一站 直
  • 服务器分布式部署和集群部署的区别

    服务器分布式部署和集群部署的区别 1 分布式部署 分布式是以缩短单个任务的执行时间来提升效率的 xff1b 分布式是将不同的业务分布在不同的地方 xff1b 2 集群部署 集群是将几台服务器集中在一起 xff0c 实现同一业务 xff1b
  • Vue知识点:qs

    一 qs是什么 xff1f qs 是一个增加了一些安全性的查询字符串解析和序列化字符串的库 可以进行对象与字符串之间的一个转换 二 qs的安装 qs xff0c 是axios中自带的 xff0c 也是npm仓库所管理的包 安装方式 xff1
  • Vue点击按钮跳转页面的实现方法

    1 跳转外部链接并覆盖当前页 lt el button type 61 34 primary 34 64 click 61 34 cimsInputClick 34 gt 应用入口 lt el button gt cimsInputClic
  • 警告C4819 解决办法

    问题 警告C4819 该文件包含不能在当前代码页 936 中表示的字符 请将该文件保存为 Unicode 格式以防止数据丢失 解决办法 1 如果调用的库为C语言 xff0c 增加extern 34 C 34 extern表明变量或函数是ex
  • fopen和fopen_s简介

    1 fopen函数 xff08 1 xff09 定义 FILE fopen const char filename const char mode r 打开只读文件 xff0c 该文件必须存在 r 43 打开可读写的文件 xff0c 该文件
  • 用Photoshop进行icon的制作或将其它格式图片转成icon

    用Photoshop进行icon的制作或将其它格式图片转成icon 1 准备 1 安装的ps格式里没有ico xff0c 需要安装插件 ICOFormat 8bi xff0c 搜索 ICOFormat 8bi 并根据PC选择下载 xff1b
  • dataGridVie控件绑定List<T>数据

    1 实现功能 dataGridVie控件绑定List数据 xff0c 点击按钮更新List数据并重新绑定 xff0c dataGridVie控件的数据更新 2 编程步骤 xff08 1 xff09 定义Person类 span class
  • VS2019安装、卸载及升级程序打包过程

    1 安装打包工具 在VS2019界面点击扩展菜单下的管理扩展 xff0c 如果已安装Microsoft Visual Studio Installer Project xff0c 则如下图所示 如果没有安装则选择联机 xff0c 进行下载安
  • Modbus TCP协议

    1 Modbus协议 Modbus是一种工业总线协议标准 xff0c 包括ASCII RTU TCP三种报文类型 xff0c 其物理层接口有RS 232 RS 485 RS 422 及以太网 xff0c 采用主 从方式进行通信 2 Modb
  • C#文件拷贝的方法

    1 实现功能 xff1a 打开的文件夹如果和目标文件夹不一样 xff0c 则将文件拷贝到目标文件夹 span class token class name span class token keyword string span span

随机推荐

  • WPF控件样式设置

    1 直接在代码中设置 span class token operator lt span span class token class name Button span Content span class token operator 6
  • C#多线程日志的实现

    1 定义输出目标类型 span class token keyword public span span class token keyword enum span span class token class name LogTarget
  • The power input for PSU 2 is lost

    错误信息 Dell戴尔 PowerEdge R720 服务器错误 xff1a PSU0003 Power input for PSU 2 is lost Please check PSU cables 这个错误信息为 xff1a PSU 2
  • 如何保存token-localStorage存储

    1 原理 原理是通过vue router的beforeEach钩子 xff0c 在每次路由到一个地址的时候先判断该路由是否携带了meta信息 xff0c 且该信息中的requireAuth是否为true xff0c 如果为true表示该路由
  • 在Tomcat服务器部署jar包

    在Tomcat服务器部署jar包 1 输出jar包 在eclipse环境下 xff0c 进入Run Configuration界面 xff0c 在Maven Build下选择demo 将Goals的内容改成package 2 将jar包部署
  • PTA 程序设计天梯赛(1~20题)

    文章目录 1 Hello World 5 分 2 打印沙漏 20 分 3 个位数统计 15 分 4 计算摄氏温度 5 分 5 考试座位号 15 分 6 连续因子 20 分 7 A B 20 分 8 计算指数 5 分 9 计算阶乘和 10 分
  • 关于动态(长度不定)结构体数组的两种处理方法

    讲解这个问题 xff0c 以一个例子入手 xff1a PAT xff08 A xff09 1080 Graduate Admission 方法一 xff1a 定义一个结构体数组 xff0c 为该数组开辟一块大的存储空间 xff0c 然后进行
  • 关于C++中string头文件的用法

    注意 xff1a 这里需要声明一点 xff0c 头文件string和string h是不同的 下面的代码是string的使用例子 xff0c 在string头文件下 xff0c 函数中 xff0c 是可以采取string str 61 34
  • 基于VS2010下利用MFC编写软件控制安捷伦信号源

    程控信号源 最近接触关于写 自动化测试软件 xff0c 里面用到了 xff0c 需要实现频谱仪 信号源的程序控制 所以 xff0c 就把每天遇到的问题 xff0c 和学到的知识 xff0c 进行一个总结思考 信号源程控实现 xff1a 信号
  • Qt中emit的用法:发射信号

    emit是为了调用对应的槽函数 xff0c 用来发射信号
  • OAI:Ubuntu20.04不支持OAI

    遇到一个无法解决的问题 xff0c 将ubuntu从18 04升级到了20 04 xff0c 发现ubuntu20 04不支持OAI啊 xff01
  • OAI:eNB模块和UE模块的示波器显示

  • 力扣网页PC端无法进入(问题得到解决)

    最近发现在不同地方 xff0c 使用不同WiFi时 xff0c 有些地点出现力扣网页PC端无法加载的问题 按照网上方法进行了调试 xff0c 发现帖子推荐改hosts文件 xff0c 将自己电脑https leetcode cn com 的
  • Linux临时动态调整kvm虚拟机内存

    一 运维内容描述 同事反馈在用的虚拟机内存不足 xff0c 需要调整 查看一个虚拟机的内存情况 xff0c 最大是8G内存 xff0c 当前内存显示是4G 虚拟机调整最大内存是需要关闭虚拟机的 xff0c 但现在虚拟机上部了服务 xff0c
  • stringstream的用法

    1 用stringstream来分割指定的字符字符串 xff0c 代码如下 xff1a span class token comment 用stringstream来分割指定的字符字符串 span span class token macr
  • C++字符串输入问题

    经常写核心代码模式 xff0c 对于输入输出很多情况下 xff0c 不怎么会写了 所以 xff0c 做个总结 对于如下输入 xff1a span class token comment 输入 xff1a span span class to
  • 中国系统面试0819

    一面 xff1a 30min C 43 43 xff1a 1 C 43 43 的三大特性 xff0c 以及在项目中是如何是用到的 xff08 封装 继承 多态 xff09 2 STL了解哪些 xff0c 在项目中如何使用的 xff0c 举例
  • C语言实现多态

    利用C语言实现多态 xff1a c语言多态的实现 xff0c 需要用到函数指针 函数名实际上是该函数代码存储空间的首地址 xff0c 这个地址可以通过函数指针来存放 通过改变函数指针存储的地址就可以实现多态 span class token
  • 深入浅析Mysql联合索引原理 之 最左匹配原则。

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章 xff0c 自以为就了解了其原理 xff0c 最近面试时和大牛交流中 xff0c 发现遗漏了些东西 xff0c 这里自己整理一下这方面的内容 最左前缀匹配原则 在mysql
  • kubernetes Value:将磁盘挂载到容器,PV,PVC

    6 1 介绍卷 6 1 1 卷的类型 emptyDir 用于存储临时数据的简单空目录 hostPath 用于将目录从工作节点的文件系统挂载到pod nfs 挂载到pod中的NFS共享卷 还有其他的如gitRepo gcepersistenD