Kubernetes卷 - 动态路径

问题描述 投票:5回答:2

我希望我的应用程序在主机位置写入日志文件,所以我正在安装一个hostPath卷。但是所有应用程序都尝试使用相同的文件名写入日志。

我想将文件分成以Pod名称命名的文件夹,但我在文档中没有看到如何实现它:

  volumes:
  - name: logs-volume
    hostPath:
      path: /var/logs/apps/${POD_NAME}
      type: DirectoryOrCreate

在上面的(不工作)示例中,应用程序应将文件写入POD_NAME文件夹。

可能吗?

kubernetes
2个回答
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/)。然后,您的应用程序需要读取该卷或先前定义的环境变量的数据,并将名称添加到它写入日志的路径中。


1
投票

alpha feature that might help可在kubernetes 1.11中找到。我没有测试它,但它显然允许这样的东西:

    volumeMounts:
    - mountPath: /var/log
      name: logs
      subPathFrom:
        fieldRef:
          fieldPath: metadata.name
  volumes:
  - name: logs
    hostPath:
      path: /var/logs/apps/
© www.soinside.com 2019 - 2024. All rights reserved.