使用卷 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 将捕获这些日志到其他系统。)
我有一个 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 将捕获这些日志到其他系统。)