K8s卷存储详解(一)

K8s卷存储详解(一)

  • K8s 存储
    • K8s卷分类
    • K8s目前支持的卷类型
  • 临时卷类型
    • EmptyDir
    • CSI 临时卷
    • 通用临时卷

K8s 存储

什么是卷?为什么要用卷?

我们知道K8s是基于容器,对各个Pod进行管理的。Pod是由容器构成的,我也知道,容器(如Docker)有个特点就是,容器删除后,在容器中产生的数据也会随之销毁。K8s会监控容器的运行状态,当有容器崩溃或停止时,K8s的Controller会删除这些容器,并重新创建新的容器。如果容器被销毁,此时容器状态未保存, 因此在容器生命周期内创建或修改的所有文件都将丢失。在崩溃期间,kubelet 会以干净的状态重新启动容器。

另外一个需求就是:当多个容器在一个 Pod 中运行并且需要共享文件时, 就需要跨所有容器设置和访问共享文件系统。

K8s卷分类

根据应用场景不同,和需求不同,将卷分为不同的种类

  • 临时卷

  • 持久卷

  • 投射卷

卷的相关参数

  • 卷类型

  • 卷挂载位置

卷挂载位置

卷挂载在镜像中的指定路径下。 Pod 配置中的每个容器必须独立指定各个卷的挂载位置。

注意:卷不能挂载到其他卷之上(不过存在一种使用 subPath 的相关机制),也不能与其他卷有硬链接。

K8s目前支持的卷类型

已启用的卷类型

  1. awsElasticBlockStore (已弃用)
  2. azureDisk (已弃用)
  3. cinder (已弃用)
  4. gcePersistentDisk(已弃用)
  5. gcePersistentDisk(已弃用)
  6. gitRepo (已弃用)
  7. glusterfs(已移除)
  8. portworxVolume(已弃用)
  9. vsphereVolume(已弃用)
  10. flexVolume(已弃用)

可以使用的卷类型

  1. cephfs
  2. configMap
  3. downwardAPI
  4. emptyDir
  5. fc (光纤通道)
  6. hostPath
  7. iscsi
  8. local
  9. nfs
  10. persistentVolumeClaim
  11. subPath
  12. 树外(Out-of-Tree)卷插件

常用的数据卷(Volume)有:

  • 本地:如,HostPath、EmptyDir;
  • 网络:如,NFS、Ceph、GlusterFS;
  • 公有云:如,AWS EBS;
  • K8s资源:如,Configmap、Secret。

临时卷

什么是临时卷?

临时卷的生命周期与 Pod 的生命周期相同,与 Pod 一起创建和删除,当 Pod 不再存在时,Kubernetes 也会销毁临时卷。 所以停止和重新启动 Pod 时,不会受持久卷在何处可用的限制。

应用场景1:有些应用程序需要额外的存储,但并不关心数据在重启后是否仍然可用。

示例:缓存服务经常受限于内存大小,而且可以将不常用的数据转移到比内存慢的存储中,对总体性能的影响并不大。

应用场景2:些应用程序需要以文件形式注入的只读数据

示例:比如配置数据或密钥。

临时卷类型

根据不同的用途,支持几种不同类型的临时卷

  • EmptyDir: Pod 启动时为空,存储空间来自本地的 kubelet 根目录(通常是根磁盘)或内存
  • 见投射卷:ConfigMap、 DownwardAPI、 Secret: 将不同类型的 Kubernetes 数据注入到 Pod 中
  • CSI 临时卷: 类似于前面的卷类型,但由专门支持此特性 的指定 CSI 驱动程序提供
  • 通用临时卷: 它可以由所有支持持久卷的存储驱动程序提供

emptyDirconfigMapdownwardAPIsecret 是作为 本地临时存储 提供的。它们由各个节点上的 kubelet 管理。

"本地"意味着存储介质不能是网络上的。

image-20230725190542754

EmptyDir

EmptyDir是在当 Pod 分派到某个Node节点上时创建的,它的初始内容为空,k8s自动分配一个目录,而无需指定宿主机上对应的目录文件。当Pod销毁时, EmptyDir中的数据也会被永久删除。

无论Pod 中的容器挂载 emptyDir 卷的路径是否相同,这些容器都可以读写 emptyDir 卷中相同的文件。

说明:容器崩溃并会导致 Pod 被从节点上移除,因此容器崩溃期间 emptyDir 卷中的数据是安全的

emptyDir 的一些用途:

  • 缓存空间,例如基于磁盘的归并排序。
  • 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
  • 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

设置卷挂载位置:

使用emptyDir.medium 字段用来控制 emptyDir 卷的存储位置。

挂载位置可以是基于存储介质的,也可以是基于内存的:

emptyDir 卷存储在该节点所使用的介质上; 此处的介质可以是磁盘、SSD 或网络存储,这取决于你的环境

如果是挂载 tmpfs,将 emptyDir.medium 字段设置为 "Memory", 它与磁盘不同:tmpfs 在节点重启时会被清除, 并且你所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。

示例:

emptyDir 官方配置示例

apiVersion: v1
kind: Pod
metadata:name: test-pd
spec:containers:- image: registry.k8s.io/test-webservername: test-containervolumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir:sizeLimit: 500Mi

容器共享示例:

apiVersion: v1
kind: Pod
metadata:name: volume-emptydirnamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80volumeMounts:  									# 将logs-volume挂在到nginx容器中,对应的目录为 /var/log/nginx- name: logs-volumemountPath: /var/log/nginx- name: busyboximage: busybox:1.30command: ["/bin/sh","-c","tail -f /logs/access.log"] 	# 初始命令,动态读取指定文件中内容volumeMounts:  									# 将logs-volume 挂在到busybox容器中,对应的目录为 /logs- name: logs-volumemountPath: /logsvolumes: 											# 声明volume, name为logs-volume,类型为emptyDir- name: logs-volumeemptyDir: {}

创建Pod

[root@k8s-master01 ~]# kubectl create -f volume-emptydir.yaml# 查看pod
[root@k8s-master01 ~]# kubectl get pods volume-emptydir -n dev -o wide
NAME                  READY   STATUS    RESTARTS   AGE      IP       NODE   ...... 
volume-emptydir       2/2     Running   0          97s   x.x.x.x   node1  ......# 通过podIp访问nginx
[root@k8s-master01 ~]# curl <IP># 通过kubectl logs命令查看指定容器的标准输出
[root@k8s-master01 ~]# kubectl logs -f volume-emptydir -n dev -c busybox

卷限制:

基于介质:通过为默认介质指定大小限制,来限制 emptyDir 卷的存储容量。

基于内存:当启用 SizeMemoryBackedVolumes 特性门控时, 你可以为基于内存提供的卷指定大小。 如果未指定大小,则基于内存的卷的大小为 Linux 主机上内存的 50%。

为本地临时性存储设置请求和限制

以指定 ephemeral-storage 来管理本地临时性存储。 Pod 中的每个容器可以设置以下属性:

  • spec.containers[].resources.limits.ephemeral-storage
  • spec.containers[].resources.requests.ephemeral-storage

表示存储容量的 方式有2种

  • 加后缀表达式(可加的后缀:E、P、T、G、M、k)
  • 2 的幂级数表达式(Ei、Pi、Ti、Gi、Mi、Ki)

官方示例:

假如,Pod 包含两个容器。每个容器请求 2 GiB 大小的本地临时性存储。 每个容器都设置了 4 GiB 作为其本地临时性存储的限制。 因此,整个 Pod 的本地临时性存储请求是 4 GiB,且其本地临时性存储的限制为 8 GiB。 该限制值中有 500Mi 可供 emptyDir 卷使用。

apiVersion: v1
kind: Pod
metadata:name: frontend
spec:containers:- name: appimage: images.my-company.example/app:v4resources:requests:ephemeral-storage: "2Gi"limits:ephemeral-storage: "4Gi"volumeMounts:- name: ephemeralmountPath: "/tmp"- name: log-aggregatorimage: images.my-company.example/log-aggregator:v6resources:requests:ephemeral-storage: "2Gi"			# 关键配置,注意单位limits:ephemeral-storage: "4Gi"			# 关键配置,注意单位volumeMounts:- name: ephemeralmountPath: "/tmp"volumes:									# 挂载的卷- name: ephemeralemptyDir:sizeLimit: 500Mi

CSI 临时卷

使用 CSI 临时存储的 Pod 的示例清单:

kind: Pod
apiVersion: v1
metadata:name: my-csi-app
spec:containers:- name: my-frontendimage: busybox:1.28volumeMounts:- mountPath: "/data"name: my-csi-inline-volcommand: [ "sleep", "1000000" ]volumes:- name: my-csi-inline-volcsi:driver: inline.storage.kubernetes.iovolumeAttributes:foo: bar

通用临时卷

特性状态: Kubernetes v1.23 [stable]

临时存放Pod数据目录,创建初始为空。

通用临时卷与EmptyDir不同的功能特性:

  • 存储可以是本地的,也可以是网络连接的。

  • 卷可以有固定的大小,Pod 不能超量使用。

  • 卷可能有一些初始数据,这取决于驱动程序和参数。

  • 支持典型的卷操作,前提是相关的驱动程序也支持该操作,包括 快照、 克隆、 调整大小和 存储容量跟踪)。

官方示例:

kind: Pod
apiVersion: v1
metadata:name: my-app
spec:containers:- name: my-frontendimage: busybox:1.28volumeMounts:- mountPath: "/scratch"name: scratch-volumecommand: [ "sleep", "1000000" ]volumes:- name: scratch-volumeephemeral:volumeClaimTemplate:metadata:labels:type: my-frontend-volumespec:accessModes: [ "ReadWriteOnce" ]storageClassName: "scratch-storage-class"resources:requests:storage: 1Gi

参阅:

k8s存储:卷、持久卷、存储类

k8s数据存储详解

存储

K8S系列之存储

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

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

相关文章

开发中遇到的 cookie 问题

1. cookie 无法跨域携带问题 尽管已经登录&#xff0c;但是请求接口返回状态码&#xff1a;202&#xff0c;msg&#xff1a; 未登录&#xff0c;如下图所示&#xff1b; 1.1 XMLHttpRequest.withCredentials未设置 如果需要跨域 AJAX 请求发送 Cookie&#xff0c;需要withCre…

使用wxPython和pillow开发拼图小游戏(四)

上一篇介绍了使用本地图片来初始化游戏的方法&#xff0c;通过前边三篇&#xff0c;该小游戏的主要内容差不多介绍完了&#xff0c;最后这一篇来介绍下游戏用时的计算、重置游戏和关闭窗口事件处理 游戏用时的计算 对于游戏用时的记录&#xff0c;看过前几篇的小伙伴可能也发现…

MATLAB实现图像处理:图像识别、去雨、去雾、去噪、去模糊等等(附上20个完整仿真源码)

图像处理是计算机视觉领域的重要研究方向&#xff0c;MATLAB是一种功能强大的数学计算软件&#xff0c;可以用于图像处理和分析。下面是一些简单的MATLAB图像处理代码示例&#xff0c;包括图像增强、边缘检测、形态学处理、特征提取等。 文章目录 1. 图像增强2. 边缘检测3. 形态…

【雕爷学编程】Arduino动手做(88)---水流量传感器模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Springboot初识(二)

文章目录 前言一.Spring配置文件1.1 配置文件的作用1.2 配置文件的类型 二.properties配置⽂件说明2.1 基本语法2.2 读取配置文件 三.yml 配置⽂件说明2.1 基本语法2.2 读取配置文件2.3 注意事项 前言 上篇文章我们介绍了什么是SpringBoot和怎么去创建一个SpringBoot项目,现在…

Navicat连接服务器上Docker安装的mysql提示拒绝连接

一、报错的原因 英语翻译 --- ‘不允许主机连接到此MySQL服务器’ &#xff08;意思是本地账号连接可以登录&#xff0c;但是远程登陆不行&#xff09; 二、解决方法 ①进入docker中的mysql容器 docker exec -it mysql bash ②登陆mysql mysql -uroot -p ③执行以下步骤…

13.5.3 【Linux】PAM 模块设置语法

PAM 借由一个与程序相同文件名的配置文件来进行一连串的认证分析需求。我们同样以passwd 这个指令的调用 PAM 来说明好了。 当你执行 passwd 后&#xff0c;这支程序调用 PAM 的流程是&#xff1a; 1. 使用者开始执行 /usr/bin/passwd 这支程序&#xff0c;并输入密码&#xf…

Mongodb 多文档聚合操作处理方法(Map-reduce 函数)

聚合 聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来&#xff1a; 将多个文档中的值分组在一起。 对分组数据执行操作以返回单个结果。 分析数据随时间的变化。 要执行聚合操作&#xff0c;您可以使用&#xff1a; 聚合管道 单一目的聚合方法 Map-reduce 函…

基于Java+SpringBoot+vue前后端分离在线商城系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

spring 存储对象 + 获取对象

前言 本篇在spring中如何使用五大类注释与方法注释将对象加入IOC容器中&#xff0c;了解如何使用注释来获取容器中的Bean对象&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1.通过注释将类加入IoC…

【云计算小知识】云环境是什么意思?有什么优点?

随着云计算的快速发展&#xff0c;了解云计算相关知识也是运维人员必备的。那你知道云环境是什么意思&#xff1f;有什么优点&#xff1f;云环境安全威胁有哪些&#xff1f;如何保证云环境的运维安全&#xff1f;这里我们就来简单聊聊。 云环境是什么意思&#xff1f; 云环境是…

SpringBoot中配置文件的加载

springboot 启动会扫描一下位置的application.properties或者application.yml文件作为springboot的默认配置文件 file:./config/(项目根目录config文件夹下的配置文件) file:./(项目根目录下的配置文件) classpath:/config/(resources目录config文件下的配置文件) classpat…

如何在3ds max中创建可用于真人场景的巨型机器人:第 2 部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 创建主体 步骤 1 打开 3ds Max。选择机器人头部后&#xff0c;二次单击鼠标并选择隐藏未选中。机器人的其他部分 除了头部之外&#xff0c;将被隐藏。 打开 3ds Max 步骤 2 在人脸选择模式下&#x…

视图和视图解析器

SpringMVC–视图和视图解析器 基本介绍 在springMVC 中的目标方法最终返回都是一个视图(有各种视图)。 返回的视图都会由一个视图解析器来处理(视图解析器有很多种)。 自定义视图 为什么需要自定义视图 ​ 在默认情况下&#xff0c;我们都是返回默认的视图, 然后这个返回…

Java通过InputStream判断word格式

Java通过InputStream判断word格式 1. 传入inputStream文件流2. 读取文件流前八个字节到字节流数组中3. 转为字符串4. 对比字符串判断文件类型5. 完整代码 Java通过InputStream判断word格式) 1. 传入inputStream文件流 2. 读取文件流前八个字节到字节流数组中 byte[] byteArra…

flink1.16使用消费/生产kafka之DataStream

flink高级版本后&#xff0c;消费kafka数据一种是Datastream 一种之tableApi。 上官网 Kafka | Apache Flink Kafka Source 引入依赖 flink和kafka的连接器&#xff0c;里面内置了kafka-client <dependency><groupId>org.apache.flink</groupId><arti…

C++类与对象 - 2(构造函数和析构函数)(超详细)

构造函数和析构函数 - 超详细讲解 1. 构造函数1.1 概念1.2特性 2. 析构函数2.1 概念2.2特性 1. 构造函数 1.1 概念 对于以下Date类&#xff1a; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout <&l…

C语言float类型学习

C语言的小数类型有两种&#xff0c;float和double&#xff1b; float 称为单精度浮点型&#xff0c;double 称为双精度浮点型&#xff1b; float 占用4个字节&#xff0c;double 占用8个字节&#xff1b; 下面看一下float&#xff1b; #include <stdio.h>int main() {…

电脑记事本在哪里?电脑桌面显示记事本要怎么设置?

绝大多数上班族在使用电脑办公时&#xff0c;都需要随手记录一些琐碎或重要的事情&#xff0c;例如工作注意事项、常用的文案、某项工作的具体要求、多个平台的账号和密码等。于是就有不少小伙伴想要使用电脑记事本软件来记录&#xff0c;那么电脑记事本在哪里呢&#xff1f;想…

JAVA基础-集合的工具类Collections

目录 引言 一&#xff0c;Collections工具类的操作方法方法 1&#xff0c;排序操作 2&#xff0c;替换 和 查找操作 二&#xff0c;Collections工具类的使用 2.1&#xff0c;排序操作 2.1.1&#xff0c;集合的逆序 2.1.2&#xff0c;集合的随机排序 2.1.3&#xff0c;集…