【问题标题】:Access environment variables set by configMapRef in kubernetes pod访问 kubernetes pod 中 configMapRef 设置的环境变量
【发布时间】:2021-08-31 18:03:52
【问题描述】:

我的deployment 中有一组使用EnvFromconfigMapRef 的环境变量。这些 configMaps 中保存的环境变量是由 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

问题是我无法直接访问特定的环境变量。

这是在 pod 中运行 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'

这仅返回与我的原始 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

每个变量都被显式声明。我可以这样做,但维护起来更痛苦。

【问题讨论】:

  • 你能显示其中一个相关 ConfigMap 的内容吗?那个 pod 规格对我来说似乎是正确的。

标签: node.js kubernetes kustomize


【解决方案1】:

简答:

您需要显式定义变量或更改配置映射,使其具有1 environment variable = 1 value 结构,这样您就可以使用envFrom 引用它们。例如:

"apiVersion": "v1",
"data": {
    "EVENT_STORE_LOGIN": "admin",
    "EVENT_STORE_PASS": "changeit"
},
"kind": "ConfigMap",

更多详情

Configmaps 是键值对,这意味着对于一个键只有一个值,configmaps 可以获取string 作为数据,但它们不能与map 一起使用。

我尝试手动编辑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"
    },

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

有用的链接:

【讨论】:

  • 啊,所以我确实需要单独引用它们。他们需要将其改为地图,或者在解析配置地图时提供“展平”配置地图的选项。谢谢!
  • 这实际上来自 kubernetes 中使用的数据存储 - 这是 etcd 是正确的,key-value 存储。所以我不确定它会不会改变,因为它会使逻辑变得更加复杂。
猜你喜欢
  • 1970-01-01
  • 2020-04-04
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 2020-03-30
  • 1970-01-01
  • 2021-08-26
相关资源
最近更新 更多