我希望我的应用程序在主机位置写入日志文件,因此我安装了hostPath
卷。但是所有应用程序都尝试使用相同的文件名来写日志。
我想将文件分隔到以Pod名称命名的文件夹中,但我在文档中没有看到如何实现它:
volumes:
- name: logs-volume
hostPath:
path: /var/logs/apps/${POD_NAME}
type: DirectoryOrCreate
在上面的(不工作)示例中,应用应将文件写入POD_NAME文件夹。
有可能吗?
答案 0 :(得分:3)
从kubernetes 1.17开始,使用subPathExpr支持此功能。有关详细信息,请参见https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath-expanded-environment。
答案 1 :(得分:2)
你可能能够使用向下的API(在https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/#use-pod-fields-as-values-for-environment-variables阅读更多内容)。您可以设置一个变量,例如:
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
然后在卷路径中使用带括号的变量,如:
volumes:
- name: logs-volume
hostPath:
path: /var/logs/apps/$(MY_POD_NAME)
type: DirectoryOrCreate
但是,我不确定你是否可以在命令和参数以外的地方使用环境变量。如果是这种情况,您可以修改应用程序代码或入口点脚本,以将环境变量添加到其写入日志的位置。
环境变量的替代方法是使用包含带有信息(https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/)的文件的映射卷。然后,您的应用程序需要读取该卷或先前定义的环境变量中的数据,并将名称添加到它写入日志的路径中。
答案 2 :(得分:0)
在Kubernetes 1.11中有一个alpha feature that might help。我尚未对其进行测试,但显然它允许类似以下内容:
volumeMounts:
- mountPath: /var/log
name: logs
subPathFrom:
fieldRef:
fieldPath: metadata.name
volumes:
- name: logs
hostPath:
path: /var/logs/apps/