Home > Software engineering >  Use fieldRef in Kubernetes configMap
Use fieldRef in Kubernetes configMap

Time:01-31

I have the following environment variable in my Kubernetes template:

envFrom:
  - configMapRef:
      name: configmap

env:
- name: MACHINENAME
  valueFrom:
    fieldRef:
      fieldPath: spec.nodeName

I would like to use the value from 'fieldRef' in a config map instead. Would this kind of modification be possible? In other words, I want to add the 'MACHINENAME' environment variable to the config map, so I don't have to use the 'env:' block.

CodePudding user response:

You cannot do this in the way you describe.

A ConfigMap only contains fixed string-key/string-value pairs. You cannot embed a more complex structure into a ConfigMap, or say that a ConfigMap value will be resolved using the downward API when a Pod is created. The node name of the pod, and most of the other downward API information, will be different for each pod using the ConfigMap (and likely even for each replica of the same deployment) and so there is no fixed value you can put into a ConfigMap.

You tagged this question with the Helm deployment tool. If you're using Helm, and you're simply trying to avoid repeating this boilerplate in every Deployment spec, you can write a helper template that includes this definition

{{/* templates/_helpers.tpl */}}
{{- define "machinename" -}}
- name: MACHINENAME
  valueFrom:
    fieldRef:
      fieldPath: spec.nodeName
{{- end -}}

Now in your Deployment spec, you can include this template rather than retyping the whole YAML block.

containers:
  - envFrom:
      - configMapRef:
        name: configmap
    env:
{{ include "machinename . | indent 6 }}

(The exact indent value will depend on the context where you include it, and should be two more than the number of spaces at the start of the env: line. It is important that the line containing indent not itself be indented.)

CodePudding user response:

Yes, using a ConfigMap would be possible. This Stack Overflow post is quite old, but has some good information in:

Advantage of using configmaps for environment variables with Kubernetes/Helm

You would need to either mount the ConfigMap as a volume or consume via environment variables by using envFrom. This guide provides both examples:

https://matthewpalmer.net/kubernetes-app-developer/articles/ultimate-configmap-guide-kubernetes.html

CodePudding user response:

You can use the volume mount option and merge different configmap or env

volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: my-group/my-username
      - downwardAPI:
          items:
            - path: "labels"
              fieldRef:
                fieldPath: metadata.labels
            - path: "cpu_limit"
              resourceFieldRef:
                containerName: container-test
                resource: limits.cpu
      - configMap:
          name: myconfigmap
          items:
            - key: config
              path: my-group/my-config

Ref : https://kubernetes.io/docs/concepts/storage/projected-volumes/

initContainer

There is another alternative you can follow if you want to merge those values.

Either you merge configmap & fieldRef with InitContainer as it's your Node name so, have to get value first and edit/add value to configmap with initContainer.

  • Related