【云原生|Kubernetes】05-Pod的存储卷(Volume)

news/2024/10/17 10:30:06/

【云原生Kubernetes】05-Pod的存储卷(Volume)

文章目录

  • 【云原生Kubernetes】05-Pod的存储卷(Volume)
    • 简介
    • Volume类型解析
      • emptyDir
      • HostPath
      • gcePersistentDisk
      • NFS
      • iscsi
      • glusterfs
      • ceph
      • 其他volume

简介

  • Volume 是Pod 中能够被多个容器访问的共享目录。 Kubernetes 中的Volume 概念、用 途和目的与 Docke 中的 Vo lume 比较类似,但二者不能等价, 首先 Kubernetes 中的Volume 被定义在 Pod上 ,被一个 Pod 里的多个容器挂载到具体的文件目录 ;其次, Kubernete 中的 Volume与 Pod 的生命周期相同,但与容器的生命周期不相关, 当容器终止或者重启,volume 中的数据也不会丢失;最后, Kubemetes 支持多种类型的 Volume ,例如 GlusterFS Ceph 等分布式文件系.

Volume类型解析

kubernetes提供了非常丰富的Volume类型供容器使用,例如emptyDir(临时目录);宿主机目录(hostpath),共享存储(NFS,glusterfs等),下面将对常见的类型进行说明:

emptyDir

  • emptyDir是在Pod分配到node时创建的,从它的名称就可以看出,它的初始内容为空,并且必须指定宿主机上对应的目录文件,因为这是Kubernetes自动分配的一个目录,当Pod从Node上移除时,emptyDir中的数据也将被永久删除。emptyDir的一些用途如下:

    • 临时空间,例如用于某些应用程序运行时所需的临时目录,且无需永久保留;

    • 长时间任务执行过程中使用的临时目录;

    • 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)

  • 在默认情况下,emptyDir使用的是节点存储介质,例如磁盘或者网络存储,还可以使用emptyDir.medium属性,把这个属性设置为“Memory”,就可以使用更快的基于内存的后端存储了。需要注意的是,这种情况下的emptyDir使用的内存会被计入容器的内存消耗,将受到资源限制和配额的管理。

示例

  1. 在pod中创建两个容器:tomcat和busybox,在pod级别设置名为‘app-logs’的volume,用于tomcat容器向其中写日志文件,busybox容器从中读取日志文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJwiIjjH-1684847247245)(D:\学习\学习笔记\图片\110.png)]

apiVersion: v1
kind: Pod
metadata:name: volume-podspec:containers:- name: tomcat-containerimage:  tomcatports:- containerPort: 8080volumeMounts:- name: app-logsmountPath:  /usr/loacl/tomcat/logs- name: busybox-containerimage:  busyboxcommand: ["sh", "-c", "tail -f /logs/catalins*.log"]volumeMounts:- name: app-logsmountPath: /logsvolumes:- name: app-logsemptyDir: {}
  • 查看pod的详细信息
 kubectl describe pods volume-pod

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d0cLlGp0-1684847247246)(D:\学习\学习笔记\图片\111.png)]

HostPath

  • hostpath为在Pod上挂载宿主机的文件或目录,通常可以用于以下几个方面:
    • 在容器应用程序生成的日志文件需要永久保存时,可以使用宿主机的高速文件系统对其存储;
    • 需要访问宿主机上的Docker引擎内部数据结构的容器应用时,可以通过定义hostPath为宿主机/var/lib/docker目录,使容器内部的应用可以直接访问docker的文件系统。
  • 在使用这种类型的Volume时,需要注意以下几点:
    • 在不同的Node上具有相同配置的Pod,可能会因为宿主机上的 目录和文件不同而导致对Volume上目录和文件的访问结果不一致。
      • 目录和文件路径不同:不同节点上的宿主机可能具有不同的目录和文件路径,这意味着在不同节点上运行的 Pod 访问 HostPath 卷上的目录和文件时,可能会得到不同的结果。例如,在一个节点上,HostPath 卷可能映射到 /mnt/data 目录,而在另一个节点上,它可能映射到 /data 目录。
      • 目录和文件权限不同:不同节点上的宿主机可能具有不同的文件权限,这意味着在不同节点上运行的 Pod 访问 HostPath 卷上的目录和文件时可能需要不同的权限。
    • 如果使用了资源配额管理,则Kubernetes无法将hostPath在宿主 机上使用的资源纳入管理。

示例

  1. 在pod中创建一个容器:tomcat,在pod级别设置名为‘app-logs1’的volume,将本地/var/log目录挂载到pod的/data/log1下
apiVersion: v1
kind: Pod
metadata:name: volume-pod1spec:containers:- name: tomcat-container1image:  tomcatports:- containerPort: 8080volumeMounts:- name: app-logs1mountPath:  /data/log1volumes:- name: app-logs1hostPath:path: /var/logtype: Directory

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jy3WDtfL-1684847247247)(D:\学习\学习笔记\图片\112.png)]

gcePersistentDisk

  • gcePersistentDisk是Google Cloud Platform(GCP)提供的一种持久性磁盘存储。它是一种网络附加的块存储解决方案,为在Google Compute Engine上运行的虚拟机实例提供耐用且高性能的存储。

    gcePersistentDisk具有多种优点,包括:

    • 耐久性:存储在gcePersistentDisk上的数据在多个物理磁盘和计算机上进行复制,确保高耐用性和可用性。
    • 性能:gcePersistentDisk提供高性能存储,具有实现高读写速度的能力。
    • 可扩展性:gcePersistentDisk可以轻松调整大小,以满足不断变化的存储需求,无需停机。
    • 兼容性:gcePersistentDisk可以与在Google Compute Engine上运行的各种虚拟机实例一起使用,使其成为一种灵活的存储解决方案。
  • 使用gcePersistentDisk时有以下一些限制条件:

    • Node(运行kubelet的节点)需要是GCE虚拟机。
    • 这些虚拟机需要与PD存在于相同的GCE项目和Zone中。

示例

  1. Pod中有一个名为“my-container”的容器,它使用了一个名为“my-volume”的卷,将gcePersistentDisk挂载到了容器的“/mnt/data”目录下。同时,在Pod的“volumes”字段中定义了一个名为“my-volume”的卷,并指定了使用名为“my-disk”的gcePersistentDisk,并将文件系统类型设置为“ext4”
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:- name: my-volumemountPath: /mnt/datavolumes:- name: my-volumegcePersistentDisk:pdName: my-diskfsType: ext4

NFS

  • NFS(Network File System)是一种分布式文件系统协议,用于在网络上共享文件和目录。它允许多个计算机共享相同的文件系统,从而使多个计算机可以访问相同的文件和数据。

示例

  1. Pod 中有一个名为“tomcat-container3”的容器,它使用了一个名为“ nfs-volume”的卷,将 NFS 挂载到了容器的“/nfs”目录下。同时,在 Pod 的“volumes”字段中定义了一个名为“nfs-volume”的卷,并指定了使用 NFS,指定 NFS 服务器的地址为“192.168.194.134”,共享路径为"/data"”

Kubernetes 节点上需要安装nfs-util客户端

apiVersion: v1
kind: Pod
metadata:name: nfs-podspec:containers:- name: tomcat-container3image: tomcatimagePullPolicy: IfNotPresentports:- name: tomcat-portcontainerPort:  8080volumeMounts:- name: nfs-volumemountPath: /nfsvolumes:- name: nfs-volumenfs:server: 192.168.194.134path: /data

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NJfLxhis-1684847247248)(D:\学习\学习笔记\图片\113.png)]

iscsi

  • iSCSI(Internet Small Computer System Interface)是一种基于TCP/IP的存储协议,用于在计算机网络上共享块存储设备。它允许远程计算机(即iSCSI客户端)通过网络连接访问存储设备(即iSCSI存储设备),就像它们是直接连接在本地计算机上的一样。
  • 在Kubernetes中,可以将iSCSI存储设备挂载到Pod中,以为Pod提供持久性的块存储。

示例

  1. me”的卷,将 iSCSI 存储设备挂载到了容器的“/mnt/data”目录下。同时,在 Pod 的“volumes”字段中定义了一个名为“my-volume”的卷,并指定了使用 iSCSI,指定 iSCSI 目标地址为“192.168.1.100:3260”,iSCSI 名称为“iqn.2022-05.com.example:storage.target01”,逻辑单元号为“0”,文件系统类型为“ext4”,只读模式为“false”。

需要在 Kubernetes 节点上安装 iSCSI 客户端软件

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:- name: my-volumemountPath: /mnt/datavolumes:- name: my-volumeiscsi:targetPortal: 192.168.1.100:3260iqn: iqn.2022-05.com.example:storage.target01lun: 0fsType: ext4readOnly: false

glusterfs

  • GlusterFS是一种开源的分布式文件系统,用于在计算机网络上共享文件和目录。它是一种基于用户空间的文件系统,可以在多个服务器之间创建一个可扩展的、高可用性的存储池,从而提供高性能、可靠的存储解决方案。

  • GlusterFS可以通过将多个存储节点组合成一个存储池来扩展存储容量。每个存储节点都运行一个GlusterFS客户端,用于将本地存储设备映射到存储池中。这样,多个存储节点就可以共享相同的文件系统,并提供高可用性和容错性。

s示例

  1. Pod 中有一个名为“my-container”的容器,它使用了一个名为“my-volume”的卷,将 GlusterFS 文件系统挂载到了容器的“/mnt/data”目录下。同时,在 Pod 的“volumes”字段中定义了一个名为“my-volume”的卷,并指定了使用 GlusterFS,指定 GlusterFS 集群的地址为“glusterfs-cluster”,共享路径为“my-volume”,只读模式为“false”。
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:- name: my-volumemountPath: /mnt/datavolumes:- name: my-volumeglusterfs:endpoints: glusterfs-clusterpath: my-volumereadOnly: false

ceph

  • RBD(RADOS Block Device)是一种基于Ceph存储集群的块存储协议,用于在计算机网络上共享块存储设备。它允许远程计算机(即RBD客户端)通过网络连接访问存储设备(即RBD存储设备),就像它们是直接连接在本地计算机上的一样。

  • RBD协议的工作原理是将块设备映射到Ceph存储集群中的对象存储池,从而提供分布式、高可用性、高性能的块存储服务。RBD存储设备可以动态调整大小,并且可以在多个客户端之间共享。

示例

  1. Pod 中有一个名为“my-container”的容器,它使用了一个名为“my-volume”的卷,将 RBD 存储设备挂载到了容器的“/mnt/data”目录下。同时,在 Pod 的“volumes”字段中定义了一个名为“my-volume”的卷,并指定了使用 RBD,指定 Ceph 存储集群的监视器地址为“192.168.1.100:6789, 192.168.1.101:6789, 192.168.1.102:6789”,对象存储池为“rbd-pool”,镜像名称为“my-image”,用户名为“admin”,密钥文件为“/etc/ceph/keyring”,文件系统类型为“xfs”,只读模式为“false”。
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:- name: my-volumemountPath: /mnt/datavolumes:- name: my-volumerbd:monitors: [192.168.1.100:6789, 192.168.1.101:6789, 192.168.1.102:6789]pool: rbd-poolimage: my-imageuser: adminkeyring: /etc/ceph/keyringfsType: xfsreadOnly: false

其他volume

  • **flocker:**使用Flocker管理存储卷;
  • gitRepo: 通过挂载一个空目录,并从Git库clone一个git repository以供Pod使用;
  • **secret:**一个Secret Volume用于为Pod提供加密的信息,你可以 将定义在Kubernetes中的Secret直接挂载为文件让Pod访问。Secret Volume是通过TMFS(内存文件系统)实现的,这种类型的Volume总是 不会被持久化的。

在上述中挂载外部存储,如ceph,gluster,nfs,iscsi等,的时候虽然pod可以直接进行挂载,但是kubernetes更加推荐我们先需要创建一个 PersistentVolume,并将其绑定到 PersistentVolumeClaim 上。然后,在 Pod 中使用该 PersistentVolumeClaim 来挂载。后面我们将会单独并且着重的介绍pv和pvc的功能和作用。
你可以 将定义在Kubernetes中的Secret直接挂载为文件让Pod访问。Secret Volume是通过TMFS(内存文件系统)实现的,这种类型的Volume总是 不会被持久化的。


http://www.ppmy.cn/news/86689.html

相关文章

MAAS搭建

要求 https://maas.io/docs/installation-requirements 安装maas sudo snap install --channel=3.3 maas安装postgres sudo apt update -y sudo apt install -y postgresql设置数据库 sudo -i -u postgres psql -c "CREATE USER \"$MAAS_DBUSER\" WITH E…

2021-2023外包生涯的遗憾屈辱过错总结

遗憾 最大的遗憾是: 做的项目并发量、用户量不大。背锅,被人甩锅的时候,没有进行明确的反击。 屈辱 项目:2021-2022 打印日志的时候,如果实体重写了toString(),即使使用Map类型,也不需要使…

DJ5-4 链路层交换机

目录 一、链路层交换机 二、交换机:支持多节点同时传输 三、交换机:转发表或称交换表 四、交互机:自学习 1. 单个交换机自学习/转发的例子 2. 多个交换机自学习/转发的例子 五、交换机:数据帧的过滤/转发 六、交换机的交换…

java矢量切片实现

概述 可通过多种方式实现矢量切片的制作&#xff0c;前面讲到了基于postgis数据库、tippecanoe、Qgis等方式&#xff0c;本文讲述基于spring Boot框架下java的实现。 实现效果 实现代码 后端代码 引入依赖 <dependency><artifactId>giscat-vector-mvt</art…

【Unity】实现无缝地图

无缝地图是沙盒游戏的标配&#xff0c;可以极大提升玩家体验和沉浸感。 无缝地图的实现过程还是比较复杂的&#xff0c;在这里做一下实现笔记 1、地图分块&#xff1a; 将地图划分为较小的块&#xff0c;例如瓦片或区块。每个块可以是一个独立的游戏对象或地形块。确定每个块…

全国第六届研究生数学建模竞赛-110 警车配置及巡逻方案

目录 摘 要: 1 问题重述 2 问题分析 3 模型假设 4 符号定义与说明 4.1 符号表定义

vim的使用、vim入门的三种常用模式、以及vim中常用的命令(超详细)

vim 入门的三种常用模式&#xff1a;分别是 1. 命令模式、2. 插入/编辑模式、3. 底行模式 1. 命令模式 控制屏幕光标的移动&#xff0c;字符、字或行的删除&#xff0c;移动复制某区段及进入Insert mode下&#xff0c;或者到 last line mode 如下&#xff0c;这个就是命令模式…

【数据结构】KMP算法概述

KMP算法&#xff0c;全称为Knuth-Morris-Pratt算法&#xff0c;是一种用于字符串匹配的算法。它的核心思想是利用已知信息来避免无用的比较操作&#xff0c;从而提高算法效率。KMP算法的时间复杂度为O(n m)&#xff0c;其中n为模式串的长度&#xff0c;m为文本串的长度。 本文…