您现在的位置是:首页 >其他 >【云原生|Kubernetes】05-Pod的存储卷(Volume)网站首页其他

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

小肖同学.. 2024-06-20 06:01:03
简介【云原生|Kubernetes】05-Pod的存储卷(Volume)

【云原生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 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-container
    image: nginx
    volumeMounts:
    - name: my-volume
      mountPath: /mnt/data
  volumes:
  - name: my-volume
    gcePersistentDisk:
      pdName: my-disk
      fsType: 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-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

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

  • 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-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总是 不会被持久化的。

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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。