【问题标题】:How to mount a single file from the local Kubernetes cluster into the pods如何将本地 Kubernetes 集群中的单个文件挂载到 Pod 中
【发布时间】:2021-07-11 15:29:53
【问题描述】:

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

要实际创建 pod 并运行 Airflow,我使用以下命令:

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

它使用来自bitnami/airflow repo 的图表airflow,并使用values.yaml 的配置“馈送”它。 文件values.yaml 类似于:

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

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

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

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

【问题讨论】:

  • 当集群自动扩缩器创建一个新节点时,文件是如何到达它的?您能否将这些文件放入您的 pod 运行的映像中,而不是依赖它们单独部署?

标签: kubernetes kubernetes-helm bitnami


【解决方案1】:

hostPath 有一个 File 类型,其行为应如您所愿,正如 docs 中所述:

文件:文件必须存在于给定路径中

然后您可以将其与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挂载它们
  • 如果你想配置一个应用程序,在应用程序启动时在某个路径提供一组文件,你可以去一个init容器which prepares files for the main container in an emptyDir volume

【讨论】:

    猜你喜欢
    • 2022-11-25
    • 2021-06-14
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2023-01-09
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多