首页 > 解决方案 > 如何在 kubectl 运行中从 ConfigMap 设置 Env?

问题描述

出于调试原因,我尝试通过kubectl runConfigMap 或 Secret 运行容器(高山)并设置一些环境变量。为此,我理解使用--override=参数。但是,如果我执行 Container 并回显 vars,则没有设置任何内容。我的内联 json 结构错了吗?

kubectl run --dry-run=client --restart=Never --image=alpine -n app-ns psql-demo --overrides='
{
    "apiVersion": "v1",
    "spec": {        
        "env": [
            {
                "name": "POSTGRES_HOST",
                "valueFrom": {
                    "configMapKeyRef": {
                        "key": "POSTGRES_HOST",
                        "name": "db-config"
                    }
                }
            }
        ]
    }
}' -o yaml -- sh

我尝试通过echo ${POSTGRES_HOST}.

这里的 ConfigMap 配置:

apiVersion: v1
data:
  POSTGRES_HOST: db.host.com
kind: ConfigMap
metadata:
  labels:
    component: postgres
  name: db-config
  namespace: app-ns

任何想法?非常感谢!

标签: kuberneteskubectlkubernetes-pod

解决方案


你的 json 结构有点偏离,应该是这样的:

{
  "spec": {
    "containers": {
      "env": [
        {
          "name": "POSTGRES_HOST",
          "valueFrom": {
            "configMapKeyRef": {
              "name": "db-config",
              "key": "POSTGRES_HOST"
            }
          }
        }
      ]
    }
  }
}

请注意,第一个“名称”是将出现在容器中的实际环境变量名称,它不必与您在 configmap 中使用的实际键相同。

  • 重要的是要注意kubectl run忽略未知字段。

要调试它,您可以运行您指定的命令,然后在另一个终端中:

kubectl get pod POD_NAME -o json

从那里您可以查看实际的 env 规范结构是否与您的 json 覆盖值不同。


推荐阅读