访问 kubernetes pod 中 configMapRef 设置的环境变量
Access environment variables set by configMapRef in kubernetes pod
我在 deployment
中使用 EnvFrom
和 configMapRef
设置了一组环境变量。这些 configMap 中的环境变量最初是由 kustomize 从 json 个文件中设置的。
spec.template.spec.containers[0].
envFrom:
- secretRef:
name: eventstore-login
- configMapRef:
name: environment
- configMapRef:
name: eventstore-connection
- configMapRef:
name: graylog-connection
- configMapRef:
name: keycloak
- configMapRef:
name: database
问题是我无法直接访问特定的环境变量。
这是广告连播中 运行 printenv
的结果:
...
eventstore-login={
"EVENT_STORE_LOGIN": "admin",
"EVENT_STORE_PASS": "changeit"
}
evironment={
"LOTUS_ENV":"dev",
"DEV_ENV":"dev"
}
eventstore={
"EVENT_STORE_HOST": "eventstore-cluster",
"EVENT_STORE_PORT": "1113"
}
graylog={
"GRAYLOG_HOST":"",
"GRAYLOG_SERVICE_PORT_GELF_TCP":""
}
...
这意味着我需要从我的 nodejs 应用程序中执行类似的操作
> process.env.graylog
'{\n "GRAYLOG_HOST":"",\n "GRAYLOG_SERVICE_PORT_GELF_TCP":""\n}\n'
这只是 returns 对应于我的原始 json 文件的 json 字符串。但我希望能够做这样的事情:
process.env.GRAYLOG_HOST
检索我的环境变量。但我不想修改我的部署,使其看起来像这样:
env:
- name: NODE_ENV
value: dev
- name: EVENT_STORE_HOST
valueFrom:
secretKeyRef:
name: eventstore-secret
key: EVENT_STORE_HOST
- name: EVENT_STORE_PORT
valueFrom:
secretKeyRef:
name: eventstore-secret
key: EVENT_STORE_PORT
- name: KEYCLOAK_REALM_PUBLIC_KEY
valueFrom:
configMapKeyRef:
name: keycloak-local
key: KEYCLOAK_REALM_PUBLIC_KEY
显式声明每个变量的位置。我可以做到这一点,但维护起来更痛苦。
简答:
您将需要显式定义变量或更改配置映射,使它们具有 1 environment variable = 1 value
结构,这样您就可以使用 envFrom
引用它们。例如:
"apiVersion": "v1",
"data": {
"EVENT_STORE_LOGIN": "admin",
"EVENT_STORE_PASS": "changeit"
},
"kind": "ConfigMap",
更多详情
Configmaps
是键值对,意味着一个键只有一个值,configmaps
可以得到 string
作为数据,但它们不能与 [=19 一起使用=].
我尝试手动编辑 configmap
以确认以上内容并得到以下信息:
invalid type for io.k8s.api.core.v1.ConfigMap.data: got "map", expected "string"
这就是为什么环境以一个字符串而不是结构出现的原因。
例如,configmap.json
是这样的:
$ kubectl describe cm test2
Name: test2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
test.json:
----
environment={
"LOTUS_ENV":"dev",
"DEV_ENV":"dev"
}
这就是它在 kubernetes 中的存储方式:
$ kubectl get cm test2 -o json
{
"apiVersion": "v1",
"data": {
"test.json": "evironment={\n \"LOTUS_ENV\":\"dev\",\n \"DEV_ENV\":\"dev\"\n}\n"
},
换句话说,观察到的行为是预期的。
有用的链接:
我在 deployment
中使用 EnvFrom
和 configMapRef
设置了一组环境变量。这些 configMap 中的环境变量最初是由 kustomize 从 json 个文件中设置的。
spec.template.spec.containers[0].
envFrom:
- secretRef:
name: eventstore-login
- configMapRef:
name: environment
- configMapRef:
name: eventstore-connection
- configMapRef:
name: graylog-connection
- configMapRef:
name: keycloak
- configMapRef:
name: database
问题是我无法直接访问特定的环境变量。
这是广告连播中 运行 printenv
的结果:
...
eventstore-login={
"EVENT_STORE_LOGIN": "admin",
"EVENT_STORE_PASS": "changeit"
}
evironment={
"LOTUS_ENV":"dev",
"DEV_ENV":"dev"
}
eventstore={
"EVENT_STORE_HOST": "eventstore-cluster",
"EVENT_STORE_PORT": "1113"
}
graylog={
"GRAYLOG_HOST":"",
"GRAYLOG_SERVICE_PORT_GELF_TCP":""
}
...
这意味着我需要从我的 nodejs 应用程序中执行类似的操作
> process.env.graylog
'{\n "GRAYLOG_HOST":"",\n "GRAYLOG_SERVICE_PORT_GELF_TCP":""\n}\n'
这只是 returns 对应于我的原始 json 文件的 json 字符串。但我希望能够做这样的事情:
process.env.GRAYLOG_HOST
检索我的环境变量。但我不想修改我的部署,使其看起来像这样:
env:
- name: NODE_ENV
value: dev
- name: EVENT_STORE_HOST
valueFrom:
secretKeyRef:
name: eventstore-secret
key: EVENT_STORE_HOST
- name: EVENT_STORE_PORT
valueFrom:
secretKeyRef:
name: eventstore-secret
key: EVENT_STORE_PORT
- name: KEYCLOAK_REALM_PUBLIC_KEY
valueFrom:
configMapKeyRef:
name: keycloak-local
key: KEYCLOAK_REALM_PUBLIC_KEY
显式声明每个变量的位置。我可以做到这一点,但维护起来更痛苦。
简答:
您将需要显式定义变量或更改配置映射,使它们具有 1 environment variable = 1 value
结构,这样您就可以使用 envFrom
引用它们。例如:
"apiVersion": "v1",
"data": {
"EVENT_STORE_LOGIN": "admin",
"EVENT_STORE_PASS": "changeit"
},
"kind": "ConfigMap",
更多详情
Configmaps
是键值对,意味着一个键只有一个值,configmaps
可以得到 string
作为数据,但它们不能与 [=19 一起使用=].
我尝试手动编辑 configmap
以确认以上内容并得到以下信息:
invalid type for io.k8s.api.core.v1.ConfigMap.data: got "map", expected "string"
这就是为什么环境以一个字符串而不是结构出现的原因。
例如,configmap.json
是这样的:
$ kubectl describe cm test2
Name: test2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
test.json:
----
environment={
"LOTUS_ENV":"dev",
"DEV_ENV":"dev"
}
这就是它在 kubernetes 中的存储方式:
$ kubectl get cm test2 -o json
{
"apiVersion": "v1",
"data": {
"test.json": "evironment={\n \"LOTUS_ENV\":\"dev\",\n \"DEV_ENV\":\"dev\"\n}\n"
},
换句话说,观察到的行为是预期的。