如何将单个文件从本地 Kubernetes 集群挂载到 pods

How to mount a single file from the local Kubernetes cluster into the pods

我使用 Kind 设置了一个本地 Kubernetes 集群,然后我 运行 使用 Helm 在其上使用 Apache-Airflow。

要实际创建 pods 和 运行 Airflow,我使用命令:

helm upgrade -f k8s/values.yaml airflow bitnami/airflow

它使用 bitnami/airflow 存储库中的图表 airflow,并使用 values.yaml 的配置“提供”它。 文件 values.yaml 类似于:

web:
 extraVolumeMounts:
   - name: functions
     mountPath: /dir/functions/

 extraVolumes:
   - name: functions
     hostPath:
       path: /dir/functions/
       type: Directory

其中 web 是 Airflow 的一个组件(也是我设置中的 pods 之一),目录 /dir/functions/ 已从 pod 内的集群成功映射。但是,我无法对单个特定文件而不是整个目录执行相同的操作。

有人知道它的语法吗?或者对将文件映射到 pod 中的替代方法有想法(它的整个目录已成功映射到集群中)?

hostPath 有一个 File 类型,它的行为应该如您所愿,如 docs:

中所述

File: A file must exist at the given path

然后您可以将其与 mountPath 中的精确文件路径一起使用。示例:

web:
 extraVolumeMounts:
   - name: singlefile
     mountPath: /path/to/mount/the/file.txt

 extraVolumes:
   - name: singlefile
     hostPath:
       path: /path/on/the/host/to/the/file.txt
       type: File

或者如果这不是问题,您可以将包含它的整个目录挂载到预期路径。


话虽如此,我想指出的是,使用 hostPath(几乎总是)从来都不是一个好主意。

如果您有一个包含多个节点的集群,那么说您的 Pod 正在挂载一个 hostPath 并不会将其限制为特定主机上的 运行(即使您可以强制执行) nodeSelectors 等等)这意味着如果 Pod 在不同的节点上启动,它的行为可能会有所不同,找不到它期望的目录和/或文件。

但即使您将应用程序限制在特定节点上 运行,您也需要接受这样的想法,即如果该节点不可用,Pod 将不会在其他地方自行调度.. 这意味着您需要手动干预才能从单个节点故障中恢复(除非应用程序是多实例并且可以抵抗一个实例宕机)


总结:

  • 如果您想在特定主机上安装路径,无论出于何种原因,我都会选择 local 卷。或者至少使用 hostPath 并将 Pod 限制为 运行它需要运行的特定节点。
  • 如果你想挂载小的文本文件,你可以考虑从 ConfigMaps
  • 挂载它们
  • 如果你想配置一个应用程序,在应用程序启动时在特定路径提供一组文件,你可以选择一个初始化容器which prepares files for the main container in an emptyDir volume