zeisen
zeisen

Reputation: 125

k8s: configMap does not work in deployment

We ran into an issue recently as to using environment variables inside container.

OS: windows 10 pro
k8s cluster: minikube
k8s version: 1.18.3

1. The way that doesn't work, though it's preferred way for us

Here is the deployment.yaml using 'envFrom':

apiVersion: apps/v1
kind: Deployment
metadata:
  name: db
  labels:
    app.kubernetes.io/name: db
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: db
  template:
    metadata:
      labels:
        app.kubernetes.io/name: db
    spec:
      serviceAccountName: default
      securityContext:
        {}
      containers:
        - name: db
          image: "postgres:9.4"
          ports:
            - name: http
              containerPort: 5432
              protocol: TCP
          envFrom:
            - configMapRef:
                name: db-configmap

here is the db.properties:

POSTGRES_HOST_AUTH_METHOD=trust

step 1:

kubectl create configmap db-configmap ./db.properties

step 2:

kebuctl apply -f ./deployment.yaml

step 3:

kubectl get pod

Run the above command, get the following result:

db-8d7f7bcb9-7l788        0/1    CrashLoopBackOff   1      9s

That indicates the environment variables POSTGRES_HOST_AUTH_METHOD is not injected.

2. The way that works (we can't work with this approach)

Here is the deployment.yaml using 'env':

apiVersion: apps/v1
kind: Deployment
metadata:
  name: db
  labels:
    app.kubernetes.io/name: db
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: db
  template:
    metadata:
      labels:
        app.kubernetes.io/name: db
    spec:
      serviceAccountName: default
      securityContext:
        {}
      containers:
        - name: db
          image: "postgres:9.4"
          ports:
            - name: http
              containerPort: 5432
              protocol: TCP
          env:
            - name: POSTGRES_HOST_AUTH_METHOD
              value: trust

step 1:

kubectl apply -f ./deployment.yaml

step 2:

kubectl get pod

Run the above command, get the following result:

db-fc58f998d-nxgnn                   1/1        Running        0            32s

the above indicates the environment is injected so that the db starts.

What did I do wrong in the first case?

Thank you in advance for the help.

Update:

Provide the configmap:

 kubectl describe configmap db-configmap
Name:         db-configmap
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
db.properties:
----
POSTGRES_HOST_AUTH_METHOD=trust

Upvotes: 11

Views: 7922

Answers (3)

Abhi Gadroo
Abhi Gadroo

Reputation: 210

See when you do it like you described.

deployment# exb db-7785cdd5d8-6cstw
root@db-7785cdd5d8-6cstw:/# env | grep -i TRUST
db.properties=POSTGRES_HOST_AUTH_METHOD=trust

the env set is not exactly POSTGRES_HOST_AUTH_METHOD its actually taking filename in env. create configmap via kubectl create cm db-configmap --from-env-file db.properties and it will actually put env POSTGRES_HOST_AUTH_METHOD in pod.

Upvotes: 0

Ramakrishnan M
Ramakrishnan M

Reputation: 492

For creating config-maps for usecase-1. please use the below command

kubectl create configmap db-configmap --from-env-file db.properties

Upvotes: 9

granadaCoder
granadaCoder

Reputation: 27904

Are you missing the key? (see "key:" (no quotes) below) And I think you need to provide the name of the env-variable...which people usually use the key-name, but you don't have to. I've repeated the same value ("POSTGRES_HOST_AUTH_METHOD") below as the environment variable NAME and the keyname of the config-map.

  #start env .. where we add environment variables
env:
    # Define the environment variable
- name: POSTGRES_HOST_AUTH_METHOD
  #value: "UseHardCodedValueToDebugSometimes"

  valueFrom:
    configMapKeyRef:
          # The ConfigMap containing the value you want to assign to environment variable (above "name:")
      name: db-configmap 
          # Specify the key associated with the value
      key: POSTGRES_HOST_AUTH_METHOD      

My example (trying to use your values)....comes from this generic example:

https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#define-container-environment-variables-using-configmap-data

pods/pod-single-configmap-env-variable.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        # Define the environment variable
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              # The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
              name: special-config
              # Specify the key associated with the value
              key: special.how
  restartPolicy: Never

PS

You can use "describe" to take a looksie at your config-map, after you (think:) ) you have set it up correctly.

kubectl describe configmap db-configmap --namespace=IfNotDefaultNameSpaceHere

Upvotes: 0

Related Questions