如何在configMap中获取环境变量

Jib*_*eeb 6 kubernetes

我正在寻找一种在 configmap 的数据部分获取环境变量的方法。在下面的 yml 配置中,我分配了 $NODE_NAME 这对我没有帮助。有什么办法可以完成这项工作吗

apiVersion: v1
kind: ConfigMap
metadata:
  name: config
  namespace: kube-system
data:
  test.conf: |
    {
        "push": 5,
        "test": $NODE_NAME
    }
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 14

实现此目的的一种方法是使用 envsubst,如下所示:

$ export NODE_NAME=my-node-name
$ cat << EOF | envsubst | kubectl apply -f-
apiVersion: v1
kind: ConfigMap
metadata:
  name: config
  namespace: kube-system
data:
  test.conf: |
    {
        "push": 5,
        "test": $NODE_NAME
    }
EOF
Run Code Online (Sandbox Code Playgroud)

但是 sth 告诉我你想在 pod 中使用它并使用环境变量填充配置。

看看这个例子:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config
  namespace: kube-system
data:
  test.conf: |
    {
        "push": 5,
        "test": $NODE_NAME
    }

---
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: example-pod
  name: example-pod
spec:
  initContainers:
  - args:
    - sh
    - -c
    - cat /test.conf | envsubst > /data/test.conf
    image: bhgedigital/envsubst
    name: envsubst
    env:
      - name: NODE_NAME
        valueFrom:
          fieldRef:
            fieldPath: spec.nodeName
    volumeMounts:
    - mountPath: /data
      name: data-volume
    - mountPath: /test.conf
      subPath: test.conf
      name: config-volume
  containers:
  - image: busybox
    name: busybox
    args:
    - sleep 
    - "1000"
    volumeMounts:
    - mountPath: /data
      name: data-volume 
  volumes:
  - name: data-volume
    emptyDir: {}
  - name: config-volume
    configMap:
      name: config
Run Code Online (Sandbox Code Playgroud)

当您应用上述 yaml 时,您可以检查文件是否被正确替换,如下所示:

$ kubectl exec -it example-pod -- cat /data/test.conf                      
{
    "push": 5,
    "test": minikube
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我正在 minikube 中测试它(因此在我的例子中,nodeName = minikube)


Raf*_*zko 2

我认为不可能以任何方式打破常规。ConfigMap 只是按原样注入到您的 Pod 中。

不过,您可以做的是使用自定义脚本创建一个Init 容器来修改从 ConfigMap 注入的文件。在您的脚本中您可以使用sedenvsubst工具。