使用卷 mountPath 值的 K8s 环境变量

K8s env variable using volume mountPath value

我有一个 K8s 部署 yaml 定义,其中声明了几个环境变量。我想声明一个环境变量,其值要从特定卷的装载路径中引用。

例如,我想要它如下 yaml 从第 42 行到第 45 行所示。 (注意:我仅将其用作示例。我知道这是不正确的)。是否有可能实现这一点以及如何实现?

 37     spec:
 38       containers:
 39         - name: appplugin
 40           image: {{APP_VERSION}}
 41           env:
 42           - name: INFRA_ACCESS_IP
 43             valueFrom:
 44               fieldRef:
 45                 fieldPath: status.hostIP
 42           - name: LOG_BASE_DIR
 43             valueFrom:
 44               fieldRef:
 45                 fieldPath: volumeMounts.app-logs.mountPath.subPath
 46           envFrom:
 47           - configMapRef:
 48               name: infra-config
 49           - configMapRef:
 50               name: core-config
 51           ports:
 52           - containerPort: 9095
 53           volumeMounts:
 54           - name: app-certs
 55             mountPath: /etc/secrets/certs
 56             readOnly: true
 57           - name: app-logs
 58             mountPath: /var/log/toHost/
 59             subPath: app-logs

不直接。如果您查看 EnvVarSource object, you can see that a limited number of fields are supported for the downward API 的 API 文档;一般只有元数据字段,服务账户名,动态IP和节点信息,资源限制。

在您显示的文件的上下文中,文件路径是固定的,您不需要动态查找。由于每个容器都有一个独立的文件系统,因此您不太可能在不同的部署中实际更改此路径,直接指定该路径即可:

env:
  - name: LOG_BASE_DIR
    value: app-logs
volumeMounts:
  - name: app-logs
    mountPath: /var/log/toHost/
    subPath: app-logs

如果您使用像 Helm 这样的模板工具,您可以在部署时使该值可配置。 Helm 具有在部署时可配置的“值”概念,并且可以在安装时注入这些值(或进行更复杂的操作)。如果你有理由,你可以使用它来设置容器内的路径:

image: {{ .Values.appVersion }}
env:
  - name: LOG_BASE_DIR
    value: {{ .Values.logBaseDir | default "app-logs" }}
volumeMounts:
  - name: app-logs
    mountPath: /var/log/toHost/
    subPath: {{ .Values.logBaseDir | default "app-logs" }}

(特别是对于日志,最好完全跳过此配置,只将日志发送到进程的标准输出。然后 kubectl logs 可以稍后检索它们。您也可以 deploy a log collector as a DaemonSet 将捕获这些日志到其他系统。)