k8s之挂载本地磁盘到POD中

news2024/11/26 4:34:47

写在前面

本文一起看下如何挂载本地的磁盘到POD中。

1:都需要哪些API对象

现实世界中的存储设备有非常非常多的种类,如本文要分析的计算机磁盘,还包括NFS(一种网络磁盘存储协议),Ceph(一种分布式的文件存储系统),不管是哪种方式,最终都是通过将数据存储到硬盘来实现持久化,但是不同种类写入数据的方式是不相同的,k8s针对这些不同的存储目标进行抽象定义了PersistentValume API对象,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl api-resources|egrep -w 'PersistentVolume|KIND'
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
persistentvolumes                 pv           v1                                     false        PersistentVolume

现在不同存储系统的抽象已经有了,那么具体该怎么使用办呢?能不能让pv拥有这种能力呢?自然是可以的,但是这又不符合单一职责的原则了,所以对于这些存储系统的具体使用k8s又定义了一个新的API对象,Persistent Volume Claim,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl api-resources|egrep -w 'PersistentVolumeClaim|KIND'
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim

最后,这么多的存储系统,当多了之后,混杂在一起,势必造成混乱,为此k8s又定义了StorageClass来进行分类维护,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl api-resources|egrep -w 'StorageClass|KIND'
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
storageclasses                    sc           storage.k8s.io/v1                      false        StorageClass

这样,需要用到的3个API对象我们就介绍完毕了,三者的关系我们可以参考下图:

在这里插入图片描述

下面我们看一个实际的例子。

2:挂载磁盘到POD中

毫无疑问,我们需要先定义磁盘的抽象PV,yaml如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: host-10m-pv

spec:
  storageClassName: host-test
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 10Mi
  hostPath:
    path: /tmp/host-10m-pv/

主要属性介绍如下:

name: host-10m-pv
    名字,见名知意,基于host的10m的pv
storageClassName: host-test
    存储class,进行分类,根据具体业务即可
- ReadWriteOnce
    读写策略,完整如下:
        ReadWriteOnce:存储卷可读可写,但只能被一个节点上的Pod挂载。
        ReadOnlyMany:存储卷只读不可写,可以被任意节点上的Pod多次挂载。
        ReadWriteMany:存储卷可读可写,也可以被任意节点上的Pod多次挂载。
    这里是本地磁盘,自然是只能被一个节点上的POD挂载
storage: 10Mi
    大小10MB,但这里使用的是国际标准,不同于我们用的KB(1024 byte),MB(1024*1024 byte),一定不要写错
path: /tmp/host-10m-pv/
    要挂载的本地磁盘目录,没有的话需要手动创建该目录

接着我们应用PV,如下:

kubectl apply -f host-path-pv.yml

在这里插入图片描述

接着我们就要来使用已经定义的PV了,方式自然是定义persistent volume claim,如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: host-5m-pvc

spec:
  storageClassName: host-test
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Mi

storage: 5Mi代表要求的大小是5MB,然后我们应用:

kubectl apply -f host-path-pv.yml

操作完成后k8s就会寻找存储class类型为host-test,大小满足5M的PV,最终找到了pv host-10m-pv,就将其给pvc host-5m-pvc使用,这个使用和被使用确定的过程,我们叫做绑定 bound,如下就显示二者就处于Bound状态了:

需要的是5m但有10m,此时怎么办呢?剩余5m就免费赠送了,因为没有更合适的了。

dongyunqi@mongodaddy:~/k8s$ kubectl get pv
NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
host-10m-pv   10Mi       RWO            Retain           Bound    default/host-5m-pvc   host-test               3h27m
dongyunqi@mongodaddy:~/k8s$ kubectl get pvc
NAME          STATUS   VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
host-5m-pvc   Bound    host-10m-pv   10Mi       RWO            host-test      3h33m

此时PVC已经绑定了PV,接下来我们就该将PVC挂载到POD中了,定义POD如下:

apiVersion: v1
kind: Pod
metadata:
  name: host-pvc-pod

spec:
  volumes:
  - name: host-pvc-vol
    persistentVolumeClaim:
      claimName: host-5m-pvc

  containers:
    - name: ngx-pvc-pod
      image: nginx:alpine
      ports:
      - containerPort: 80
      volumeMounts:
      - name: host-pvc-vol
        mountPath: /tmp

通过claimName: host-5m-pvc声明pvc host-5m-pvc为卷volume,然后在volumeMounts挂载卷到mountPath: /tmp目录中,如果一切顺利的话,我们在POD中的/tmp目录更新文件的内容都会同步写到宿主机Node的/tmp/host-10m-pv/目录,应用后,我们进入POD中验证,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl exec -it host-pvc-pod -- sh
/ # ls /tmp
/ # cd /tmp/
/tmp # ls
/tmp # touch a.txt
/tmp # echo "content writed by pod" > a.txt 
/tmp # cat a.txt 
content writed by pod
/tmp # 

查看POD所在Node(注意这里一定要是POD所在的Node,不确定POD在哪里可通过-o wide确定)

dongyunqi@mongomummy:~/k8s/images$ cd /tmp/host-10m-pv/
dongyunqi@mongomummy:/tmp/host-10m-pv$ ls
a.txt
dongyunqi@mongomummy:/tmp/host-10m-pv$ cat a.txt 
content writed by pod

这样就算POD销毁重建,新建的文件也依然在,也就实现了持久化,如下测试:

dongyunqi@mongodaddy:~/k8s$ kubectl delete pod host-pvc-pod
pod "host-pvc-pod" deleted
dongyunqi@mongodaddy:~/k8s$ kubectl apply -f host-path-pod.yml 
pod/host-pvc-pod created
dongyunqi@mongodaddy:~/k8s$ kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
host-pvc-pod   1/1     Running   0          11s
dongyunqi@mongodaddy:~/k8s$ kubectl exec -it host-pvc-pod -- sh
/ # cat /tmp/a.txt 
content writed by pod
/ # exit
dongyunqi@mongodaddy:~/k8s$ 

写在后面

小结

本文分析了实现磁盘挂载到POD中需要用到的PV persistent volume,PVC persistent volume claim,Storage Class这三个API对象,并一起看了一个实际的例子,实现了POD中数据的持久化。希望本文能够帮助到你。

参考文章列表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web测试的各个测试点

1.什么是Web测试? Web测试测试Web或Web应用程序的潜在错误。它是在上线前对基于网络的应用程序进行完整的测试。 UI测试 功能测试 数据库测试 性能测试 兼容性测试 安全测试 自动化测试 2.WEB测试主要测试场景 1.UI测试 界面是否美观,风格、字体、…

【青训营】Go的并发编程

本文章整理自——字节跳动青年训练营(第五届)后端组 1.线程和协程 操作系统中有三个重要的概念,分别是进程、线程和协程。其中进程和线程的区别请移步操作系统专栏,现在主要叙述线程和协程的区别。 简单来说,协程又称…

看我们网络故障分析系统如何发现系统500报错

背景 汽车配件电子图册系统是某汽车集团的重要业务系统。业务部门反映,汽车配件电子图册调用图纸时,出现访问慢现象。 汽车集团总部已部署NetInside流量分析系统,使用流量分析系统提供实时和历史原始流量。本次分析重点针对汽车配件电子图册…

Python学习笔记-网络爬虫基础

一、网络爬虫概述网络爬虫概述网络爬虫又称网络蜘蛛、网络机器人,在某社区中经常被称为网页追逐者。网络爬虫可以按照指定规则自动浏览或抓取网络中的信息,python可以很轻松的编写爬虫程序或脚本。网络爬虫基本工作流程:网络爬虫的常用技术2.…

【QT5 实现“上图下文”,带图标的按键样式-toolbutton-学习笔记-记录-基础样例】实现方式之一

【QT5 实现“上图下文”,带图标的按键样式-toolbutton-学习笔记-记录-基础样例】1、前言2、实验环境3、效果展示4、实验步骤第一步:新建工程-并运行。第二步:上网找图标文件第四步:(非必须)为了对比图标不同…

23种设计模式(三)——观察者模式【组件协作】

文章目录意图什么时候使用观察者使用观察者模式也有两个重点问题要解决:1)广播链的问题2)异步处理问题真实世界类比观察者模式的实现观察者模式的优缺点亦称:事件订阅者、监听者、Event-Subscriber、Listener、Observer 意图 在许…

mybatis之动态SQL测试环境的搭建以及if语句的使用

动态SQL: 动态 SQL 是 MyBatis 的强大特性之一,如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号&a…

Vue CLI

介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供: 通过 vue/cli 实现的交互式的项目脚手架。 通过 vue/cli vue/cli-service-global实现的零配置原型开发。 一个运行时依赖 (vue/cli-service),该依赖: 可升级&a…

腾讯安全发布《2022年DDoS攻击威胁报告》:DDoS威胁4年持续增长

随着全球数字化蓬勃发展,互联网的应用范围不断扩大,并逐渐普及到各行各业的生产、管理、运营等方面,网络设备可用带宽伴随应用需求的增加而增加,方便了企业业务开展的同时也扩大了安全威胁面,引来黑产的觊觎。DDoS攻击…

Java使用流去除集合中某个字段为空的对象

文章目录0 写在前面1 情景复刻2 解决方案3 写在最后0 写在前面 最近写了一些业务逻辑,调试的时候总会报空指针异常。 Java中空指针异常是危险恐怖分子,最好不要碰见他。所以有些时候,处理集合中的数据时,特定情况下需要略过一些数…

十五天学会Autodesk Inventor,看完这一系列就够了(二),软件界面

众所周知,Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计,现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad,所以再学习Inventor&…

RK3568工业级核心板高温运行测试

Rockchip RK3568 是一款通用型MPU,产品集成GPU、NPU,支持4K、HDMI、LVDS、MIPI、PCIe3.0、USB3.0、千兆以太网、CAN-BUS、UART等丰富外设接口。 RK3568的高温工作情况如何呢?本文将基于万象奥科HD-RK3568-CORE 系列核心板做详细高温测试&…

接口幂等性设计

幂等性: 对于同一个操作发起一次请求或者多次请求,得到的结果都是一样的,不会因为请求多次而出现异常现象。 场景: 用户多次请求,比如重复点击页面上的按钮网络异常,右移网络原因导致在一定时间内未返回调用成功的信息&#xff…

《JavaScript 核心原理解析》学习笔记 Day 1 delete 引用与值

关于引用与值:在 javaScript 中一个表达式的值或者说结果,可能是引用 / 值。所以 x x ,是将右侧表达式x的值赋值给左侧表达式x所指的引用。注意此处的引用并非为到具体内存地址的指向,而是指表达式与其值的一种关联。 这一关联即…

Android 音视频——直播推流技术指南

一、推流架构 推流SDK客户端的模块主要有三个,推流采集端、队列控制模块、推流端。其中每个模块的主要流程如下,本文的主要目的就是拆分推流流程, 1.1 采集端 视频采集:通过Camera采集视频。 音频采集:通过麦克风采…

SSM 05 SpringBoot yaml mybatisplus

01-SpringBoot工程入门案例开发步骤SpringBoot 是 Pivotal 团队提供的全新框架,设计目的是简化 Spring 应用的初始搭建以及开发过程。使用了 Spring 框架后已经简化了我们的开发。而 SpringBoot 又是对 Spring 开发进行简化的,可想而知 SpringBoot使用的…

linux挂载新磁盘

一、查看磁盘挂载状态: fdisk -l df -h 二、为其中一个磁盘创建新的分区,参考: linux用fdisk创建分区,在Linux下用fdisk创建分区_weixin_39968410的博客-CSDN博客 sudo fdisk /dev/nvme0n1 1. 创建主分区: -----------------…

第8章 NVS

NVS Blob块存储 1. 演示app_main任务栈溢出 2. 设置app_main任务栈大小 打开menuconfig&#xff0c;输入main&#xff0c;如下图所示 默认栈大小为3584字节&#xff0c;这里改为35840字节&#xff0c;重新编译 3. Blob存储结果 #include <stdio.h> #include <st…

使用nginx搭建HTTP FLV流媒体服务器

使用nginx搭建HTTP FLV流媒体服务器 文章目录使用nginx搭建HTTP FLV流媒体服务器1 HTTP FLV简介2 HTTP FLV流媒体服务搭建3 结果验证1 HTTP FLV简介 前文已经介绍了RTSP、RTMP、HLS的流媒体协议&#xff0c;还有一种比较常见的流媒体协议HTTP FLV&#xff0c;其兼具RTMP的实时…

Kettle源码启动运行

Kettle源码运行环境如下&#xff1a; windows10 Kettle 9.3.0.2 Java JDK 11 IntelliJ IDEA 2021.2.2 (Community Edition) Maven 3.8.1&#xff08;版本不需要太高 &#xff09; 导入kettle到IDEA 可通过kettle的GIthub地址获取 kettle的克隆连接&#xff0c;或直接下载ZIP压…