在Kubernetes(K8S)中,卷(Volumes)是Pod中用于存储数据的机制,它们可以被Pod中的容器访问。Pod可以声明并使用一种或多种类型的卷,这些卷在Pod的生命周期内存在,并且可以在Pod中的容器之间共享

Pause容器与卷的关系

  1. Pause容器的作用:Pause容器是Kubernetes中的一个特殊容器,它作为Pod中所有业务容器的父进程存在。Pause容器的主要作用是创建共享的网络名称空间,以便其他容器以平等的关系加入此网络名称空间。
  2. 共享存储卷:Pod中的业务容器共享Pause容器的Volume挂载卷。这意味着,如果你在Pod配置文件中为Pause容器声明了卷,那么这些卷也可以被Pod中的其他容器访问。然而,在实际使用中,我们通常不会直接为Pause容器声明卷,而是为Pod中的业务容器声明卷,并通过Pod的规格让这些卷在容器之间共享。
  3. 通信与数据交换:由于业务容器共享Pause容器的网络栈和Volume挂载卷,因此它们之间的通信和数据交换更为高效。同一个Pod内的容器之间仅需通过localhost就能互相通信,并且可以共享同一份卷中的数据。


emptyDir

当Pod被分配给node时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷救护已存在。正如卷的名字所述,它最初是空的。Pod中的额容器可以读取和写入emptyDir中的文件,尽管该卷可以挂载到每个容器中相同或者不同的路径上。

当处于任何原因从节点删除Pod是,emptyDir中的数据将被永久删除。

注意:容器崩溃不会从节点中移除Pod,因此emptyDir卷中的数据在容器崩溃的时候是安全的。

用途

  • 暂存空间,例如用于基于磁盘的合并排序
  • 用做长时间计算崩溃恢复时的检查点
  • web服务容器提供数据时,保存内容,容器提取文件

示例

apiVersion: v1
kind: Pod
metadata:
  name: v-pod
spec:
  volumes:
  - name: emp-v
    emptyDir: {}
    
  containers:
  - name: v-1
    image: busybox
    command: ["/bin/sh", "-c", "sleep 3600"]
    volumeMounts:
    - mountPath: /tmp
      name: emp-v
   
  - name: v-2
    image: busybox
    command: ["/bin/sh", "-c", "date >> /opt/now"]
    volumeMounts:
    - mountPath: /opt
      name: emp-v

这个示例中v-1 -2容器共享v-pod中的同一个emptyDir卷,而且挂载位置也不相同。v-2容器在运行过程中,会将当前时间写入/opt/now文件中,这个文件对v-1容器来说就是/tmp/now。v-2会不停重启,并不会影响emptyDir卷中的数据。

从0开始搞K8S:存储卷_hostPath


hostPath

hostPath存储卷是将工作节点上某文件的目录或文件挂载于Pod中的一种存储卷,它可以独立于Pod资源的生命周期,因此具有持久性。

用途:

hostPath通常用于特定的存储需求,如让容器访问节点文件系统上的数据。这在系统级Pod资源需要访问节点上的文件时尤为有用。

风险:

由于hostPath直接访问宿主机文件系统,因此存在安全风险。最佳做法是尽可能避免使用hostPath,或在必须使用时将其范围限制在所需的文件或目录,并以只读方式挂载。

示例

apiVersion: v1
kind: Pod
metadata:
  name: hp-pod
spec:
  volumes:
  - name: hp-v
    hostPath:
      path: /data/html

  containers:
  - name: hp-c
    image: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: hp-v

这个示例中,将node节点的、data/html目录通过hostPath方式挂载到nginx容器的/usr/share/nginx/html目录下。

验证

在对应node的/data/html目录创建index.html文件,并写入内容,可以通过容器的80访问到

从0开始搞K8S:存储卷_hostPath_02


注意事项

  • 当Pod被删除时,hostPath中的数据仍然保留在宿主机上。
  • 在使用hostPath时,要确保指定的路径在宿主机上存在,否则Pod可能无法启动。
  • 出于安全考虑,建议仅在必要时使用hostPath,并限制其访问范围。