访问 kubernetes pod 中 configMapRef 设置的环境变量

Access environment variables set by configMapRef in kubernetes pod

我在 deployment 中使用 EnvFromconfigMapRef 设置了一组环境变量。这些 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"
    },

换句话说,观察到的行为是预期的。

有用的链接: