DEV Community

Sina Tavakkol
Sina Tavakkol

Posted on

40 Days Of Kubernetes (19/40)

Day 19/40

Kubernetes configmap and secret

Video Link
@piyushsachdeva
Git Repository
My Git Repo

We will look at configMap an secret in Kubernetes concepts in this section.
It's not a best practice to save env, key and value in yaml file of a workload such as pod yaml file.

Kubernetes Secrets and ConfigMaps separate the configuration of individual container instances from the container image, reducing overhead and adding flexibility.

Kubernetes has two types of objects that can inject configuration data into a container when it starts up.

source


Demo

Let's see the below yaml file, there's an env with name FIRSTNAME and value is Piyush:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app.kubernetes.io/name: MyApp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    env:
    - name: FIRSTNAME
      value: "Piyush"
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
Enter fullscreen mode Exit fullscreen mode

Let's run and check the env inside the pod:

root@localhost:~# kubectl apply -f day19-configmap.yaml
pod/myapp-pod created
root@localhost:~# kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          8s
root@localhost:~# kubectl exec -it myapp-pod -- sh
/ # echo $FIRSTNAME
Piyush
Enter fullscreen mode Exit fullscreen mode

Now, we are going to do it with different ways as mentioned, configMap.

  • Imperative:
root@localhost:~# kubectl create cm app-cm --from-literal=FIRSTNAME=Piyush --from-literal=NEXT=Sina
configmap/app-cm created
root@localhost:~# kubectl get cm
NAME               DATA   AGE
app-cm             2      5s
kube-root-ca.crt   1      16d
root@localhost:~# kubectl describe cm app-cm
Name:         app-cm
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
FIRSTNAME:
----
Piyush
NEXT:
----
Sina

BinaryData
====

Events:  <none>
Enter fullscreen mode Exit fullscreen mode

Then we need to inject to yaml file of our pod, and define specific block for each environment variable:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app.kubernetes.io/name: MyApp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    env:
    - name: firstName
      valueFrom:
        configMapKeyRef:
          name: app-cm
          key: FIRSTNAME
    - name: next
      valueFrom:
        configMapKeyRef:
          name: app-cm
          key: NEXT
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
Enter fullscreen mode Exit fullscreen mode

Let's run and check:

root@localhost:~# kubectl apply -f day19-configmap.yaml
pod/myapp-pod created
root@localhost:~# kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          36s
root@localhost:~# kubectl exec -it myapp-pod -- sh
/ # echo $firstName
Piyush
/ # echo $next
Sina
/ # 
Enter fullscreen mode Exit fullscreen mode
root@localhost:~# kubectl describe po/myapp-pod
Name:             myapp-pod
...
    Environment:
      firstName:  <set to the key 'FIRSTNAME' of config map 'app-cm'>  Optional: false
      next:       <set to the key 'NEXT' of config map 'app-cm'>       Optional: false
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-
...
Enter fullscreen mode Exit fullscreen mode
  • Declarative: Let's create yaml file from dry-run option:
root@localhost:~# kubectl create cm app-cm --from-literal=FIRSTNAME=Piyush --from-literal=NEXT=Sina --dry-run=client -o yaml > day19-cm.yaml
Enter fullscreen mode Exit fullscreen mode

The yaml file would be below:

apiVersion: v1
data:
  FIRSTNAME: Piyush
  NEXT: Sina
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: app-cm
Enter fullscreen mode Exit fullscreen mode

Sample for cm:

apiVersion: v1
data:
  FIRSTNAME: Piyush
  NEXT: Sina
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: app-cm
Enter fullscreen mode Exit fullscreen mode

Sample for pod:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: app-cm
  restartPolicy: Never
Enter fullscreen mode Exit fullscreen mode

Let's check:

root@localhost:~# kubectl get cm,pod
NAME                         DATA   AGE
configmap/app-cm             2      5m53s
configmap/kube-root-ca.crt   1      16d

NAME                READY   STATUS      RESTARTS   AGE
pod/dapi-test-pod   0/1     Completed   0          4m15s
Enter fullscreen mode Exit fullscreen mode
root@localhost:~# kubectl describe pod dapi-test-pod
Name:             dapi-test-pod
...
    Environment Variables from:
      app-cm      ConfigMap  Optional: false

...
Enter fullscreen mode Exit fullscreen mode

Following this link for get information about secret.
(Will be updated soon!)

Top comments (2)

Collapse
 
msc2020 profile image
msc2020

Very good!

Collapse
 
sina14 profile image
Sina Tavakkol

Thank you!