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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

【云原生Kubernetes】05-Pod的存储卷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-pod

spec:
  containers:
    - name: tomcat-container
      image:  tomcat
      ports:
        - containerPort: 8080
      volumeMounts:
        - name: app-logs
          mountPath:  /usr/loacl/tomcat/logs


    - name: busybox-container
      image:  busybox
      command: ["sh", "-c", "tail -f /logs/catalins*.log"]
      volumeMounts:
        - name: app-logs
          mountPath: /logs

  volumes:
    - name: app-logs
      emptyDir: {}
  • 查看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-pod1

spec:
  containers:
    - name: tomcat-container1
      image:  tomcat
      ports:
        - containerPort: 8080
      volumeMounts:
        - name: app-logs1
          mountPath:  /data/log1

  volumes:
    - name: app-logs1
      hostPath:
        path: /var/log
        type: Directory

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

gcePersistentDisk

  • gcePersistentDisk是Google Cloud PlatformGCP提供的一种持久性磁盘存储。它是一种网络附加的块存储解决方案为在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-container
    image: nginx
    volumeMounts:
    - name: my-volume
      mountPath: /mnt/data
  volumes:
  - name: my-volume
    gcePersistentDisk:
      pdName: my-disk
      fsType: ext4

NFS

  • NFSNetwork 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-pod

spec:
  containers:
    - name: tomcat-container3
      image: tomcat
      imagePullPolicy: IfNotPresent
      ports:
        - name: tomcat-port
          containerPort:  8080

      volumeMounts:
        - name: nfs-volume
          mountPath: /nfs
  
  volumes:
    - name: nfs-volume
      nfs:
        server: 192.168.194.134
        path: /data

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

iscsi

  • iSCSIInternet 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-container
    image: nginx
    volumeMounts:
    - name: my-volume
      mountPath: /mnt/data
  volumes:
  - name: my-volume
    iscsi:
      targetPortal: 192.168.1.100:3260
      iqn: iqn.2022-05.com.example:storage.target01
      lun: 0
      fsType: ext4
      readOnly: 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-container
    image: nginx
    volumeMounts:
    - name: my-volume
      mountPath: /mnt/data
  volumes:
  - name: my-volume
    glusterfs:
      endpoints: glusterfs-cluster
      path: my-volume
      readOnly: false

ceph

  • RBDRADOS 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-container
    image: nginx
    volumeMounts:
    - name: my-volume
      mountPath: /mnt/data
  volumes:
  - name: my-volume
    rbd:
      monitors: [192.168.1.100:6789, 192.168.1.101:6789, 192.168.1.102:6789]
      pool: rbd-pool
      image: my-image
      user: admin
      keyring: /etc/ceph/keyring
      fsType: xfs
      readOnly: false

其他volume

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

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s