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;看过前几篇的小伙伴可能也发现…

【雕爷学编程】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项目,现在…

13.5.3 【Linux】PAM 模块设置语法

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

基于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…

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;集…

SkyWalking链路追踪中Trace概念以及Trace与span的关系

基本概念 在SkyWalking链路追踪中&#xff0c;Trace&#xff08;追踪&#xff09;是指一个请求或者一个操作从开始到结束的完整路径。它涵盖了分布式系统中所有相关组件的调用关系和性能信息。 具体来说&#xff0c;Trace包含了一系列的span&#xff08;跨度&#xff09;&…

【C#】.Net Framework框架使用JWT

2023年&#xff0c;第31周&#xff0c;第2篇文章。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; 本篇文章主要简单讲讲&#xff0c;.Net Framework框架下使用JWT的代码例子&#xff0c;以及他们的基本概念。 2002年微软发布了.net framewo…

GFLv2 论文学习

1. 解决了什么问题&#xff1f; 预测定位质量对于目标检测很重要&#xff0c;在 NMS 时它能提供准确的得分排序&#xff0c;提高模型的表现。现有方法都是通过分类或回归的卷积特征来预测定位质量得分。 2. 提出了什么方法&#xff1f; 受到 GFLv1 的 general distribution …

前端开发实习总结参考范文(合集)

▼前端开发实习总结篇一 今天就简单聊聊上面的StrutsSpringHibernate吧。 Struts 代表&#xff1a;表示层;Spring代表&#xff1a;业务逻辑层;Hibernate则代表持久层。他们是目前在Java Web编程开发中用得最多的框架&#xff0c;其实这样区分是为了适应软件开发过程中各个分工…

Shell输出帮助手册

代码&#xff1a; 帮助手册雏形 function help(){echo -e "Help manual":echo -e " -h. -- help View the help manual"echo -e " install Installation"echo -e " uninstall Uninstall" }case "$1&qu…

【stable diffusion】保姆级入门课程05-Stable diffusion(SD)图生图-涂鸦重绘的用法

1.什么是涂鸦重绘 涂鸦重绘又称手涂蒙版。 简单来说&#xff0c;局部重绘手涂蒙版 就是涂鸦局部重绘的结合体&#xff0c;这个功能的出现是为了解决用户不想改变整张图片的情况下&#xff0c;对多个元素进行修改。 功能支持&#xff1a; 1.支持蒙版功能 2.笔刷决定绘制的元素…