如何将单个文件从本地 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
我使用 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