CronJob: unknown field "configMapRef"

2/21/2019

I'm applying a Kubernetes CronJob. So far it works. Now I want to add the environment variables. (env: -name... see below) While tryng to apply I get the error

unknown field "configMapRef" in io.k8s.api.core.v1.EnvVarSource

I don't like to set all singles variables here. I prefer to link the configmap to not to double the variables. How is it possible set a link to the configmap.yaml variables in a CronJob file, how to code it?

Frank

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: ad-sync
  creationTimestamp: 2019-02-15T09:10:20Z
  namespace: default
  selfLink: /apis/batch/v1beta1/namespaces/default/cronjobs/ad-sync
spec:
  concurrencyPolicy: Allow
  failedJobsHistoryLimit: 1
  successfulJobsHistoryLimit: 3
  suspend: false
  schedule: "0 */1 * * *"
  jobTemplate:
    metadata:
      labels:
        job: ad-sync
    spec:
      template:
        spec:
          containers:
          - name: ad-sync
            image: foo.azurecr.io/foobar/ad-sync
            command: ["dotnet", "AdSyncService.dll"]
            args: []
            env:
              - name: AdSyncService
                valueFrom:
                  configMapRef:
                    name: ad-sync-service-configmap
          restartPolicy: OnFailure
-- Frank Mehlhop
kubernetes
kubernetes-cronjob

4 Answers

2/21/2019

It works this way:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  ...
spec:
  ...
  jobTemplate:
    metadata:
      ...
    spec:
      template:
        spec:
          containers:
          - name: ad-sync
            ...
            envFrom:
              - configMapRef:
                  name: ad-sync-service-configmap
            command: ["dotnet", "AdSyncService.dll"]
-- Frank Mehlhop
Source: StackOverflow

2/21/2019

There are two approaches, using valueFrom for individual values or envFrom for multiple values.

valueFrom is used inside the env attribute, like this:

spec:
  template:
    spec:
      containers:
      - name: ad-sync
        image: foo.azurecr.io/foobar/ad-sync
        command: ["dotnet", "AdSyncService.dll"]
        args: []
        env:
          - name: AdSyncService
            valueFrom:
              configMapKeyRef:
                name: ad-sync-service-configmap
                key: log_level

envFrom is used direct inside the container attribure like this:

spec:
  template:
    spec:
      containers:
      - name: ad-sync
        image: foo.azurecr.io/foobar/ad-sync
        command: ["dotnet", "AdSyncService.dll"]
        envFrom:
          - configMapRef:
              name: ad-sync-service-configmap

ConfigMap for reference:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ad-sync-service-configmap
  namespace: default
data:
  log_level: INFO

The main difference on both is:

  • valueFrom will inject the value of a a key from the referenced configMap
  • envFrom will inject All configMap keys as environment variables

The main issue with you example is that you used the configMapRef from envFrom inside the valueFrom where should actually be configMapKeyRef. Also, the configMapKeyRef need a key attribute to identify where the data is comming from.

For more details, please check in this docs.

-- Diego Mendes
Source: StackOverflow

2/21/2019

There is no such field configMapRef in env field instead there is a field called configMapKeyRef

in order to get more detail about kubernetes objects, its convenient to use kubectl explain --help

for example if you would like to check all of the keys and their types you can use following command

kubectl explain cronJob --recursive

kubectl explain cronjob.spec.jobTemplate.spec.template.spec.containers.env.valueFrom.configMapKeyRef
-- Suresh Vishnoi
Source: StackOverflow

2/21/2019

You should use configMapKeyRef for single value or configMapRef with envFrom

-- Amityo
Source: StackOverflow