Kubernetes卷 - 动态路径

时间:2017-12-21 19:39:07

标签: kubernetes

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

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

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

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

有可能吗?

3 个答案:

答案 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/