Kubernetes - Configmap and Deployments

 


Below post is all about a request from a colleague.

1) There are 20 microservices.

2) All the microservices use a single configmap.

3) Change made to configmap should reflect in the microservices.

4) Microservices can also update the configmap as part of the deployment.

In this exampled, I am using nginx and redis deployment sharing a configmap.

First creating a configmap from a file:

root@masterk8s:/docker# cat cm.txt

app1=nginx

app2=redis

app3=memcached

root@masterk8s:/docker#

root@masterk8s:/docker# kubectl create configmap app-cm --from-file=cm.txt

configmap/app-cm created

root@masterk8s:/docker#

root@masterk8s:/docker# kubectl get configmap app-cm

NAME     DATA   AGE

app-cm   1      22s

root@masterk8s:/docker#

root@masterk8s:/docker# kubectl describe cm app-cm

Name:         app-cm

Namespace:    default

Labels:       <none>

Annotations:  <none>


Data

====

cm.txt:

----

app1=nginx

app2=redis

app3=memcached


Events:  <none>

root@masterk8s:/docker#

Creating a nginx deployment:

root@masterk8s:/docker# kubectl create deployment nginx --image=nginx --replicas=2 --dry-run=client -o yaml

root@masterk8s:/docker# cat nginx.yml

apiVersion: apps/v1

kind: Deployment

metadata:

  creationTimestamp: null

  labels:

    app: nginx

  name: nginx

spec:

  replicas: 2

  selector:

    matchLabels:

      app: nginx

  strategy: {}

  template:

    metadata:

      creationTimestamp: null

      labels:

        app: nginx

    spec:

      volumes:

      - name: cm-vol

        configMap:

          name: app-cm

      containers:

      - image: nginx

        name: nginx

        volumeMounts:

        - name: cm-vol

          mountPath: /etc/cfg

        resources: {}

status: {}

root@masterk8s:/docker#

root@masterk8s:/docker# kubectl apply -f nginx.yml

deployment.apps/nginx created

root@masterk8s:/docker#


root@masterk8s:/docker# kubectl get pods

NAME                     READY   STATUS    RESTARTS   AGE

nginx-5f8966bd76-mqnmq   1/1     Running   0          3m5s

nginx-5f8966bd76-zbjkg   1/1     Running   0          3m5s

root@masterk8s:/docker#

root@masterk8s:/docker# kubectl exec -it nginx-5f8966bd76-mqnmq -- cat /etc/cfg/cm.txt

app1=nginx

app2=redis

app3=memcached

root@masterk8s:/docker#

We have validated the configmaps are availabe on nginx deployment. 

Lets create another deployment using redis image using the same configmap.

root@masterk8s:/docker# cat redis.yml

apiVersion: apps/v1

kind: Deployment

metadata:

  creationTimestamp: null

  labels:

    app: redis

  name: redis

spec:

  replicas: 2

  selector:

    matchLabels:

      app: redis

  strategy: {}

  template:

    metadata:

      creationTimestamp: null

      labels:

        app: redis

    spec:

      volumes:

      - name: cm-vol

        configMap:

          name: app-cm

      containers:

      - image: redis

        name: redis

        volumeMounts:

        - name: cm-vol

          mountPath: /etc/cfg

        resources: {}

status: {}

root@masterk8s:/docker#

root@masterk8s:/docker# kubectl apply -f redis.yml

deployment.apps/redis created

root@masterk8s:/docker#

root@masterk8s:/docker# kubectl get pods

NAME                     READY   STATUS    RESTARTS   AGE

nginx-5f8966bd76-mqnmq   1/1     Running   0          6m4s

nginx-5f8966bd76-zbjkg   1/1     Running   0          6m4s

redis-d5675fbdc-29qqs    1/1     Running   0          26s

redis-d5675fbdc-6h2rs    1/1     Running   0          25s

root@masterk8s:/docker#


root@masterk8s:/docker# kubectl exec -it redis-d5675fbdc-29qqs -- cat /etc/cfg/cm.txt

app1=nginx

app2=redis

app3=memcached

root@masterk8s:/docker#


Now, Lets modify the configmap by removing the last line app3=memcached.


root@masterk8s:/docker# kubectl edit configmap app-cm

configmap/app-cm edited

root@masterk8s:/docker# kubectl describe cm app-cm

Name:         app-cm

Namespace:    default

Labels:       <none>

Annotations:  <none>


Data

====

cm.txt:

----

app1=nginx

app2=redis


Events:  <none>

root@masterk8s:/docker#


Now, the existing deployment should pickup the changes dynamically.


root@masterk8s:/docker# kubectl exec -it redis-d5675fbdc-29qqs -- cat /etc/cfg/cm.txt

app1=nginx

app2=redis

root@masterk8s:/docker#


root@masterk8s:/docker# kubectl exec -it nginx-5f8966bd76-mqnmq -- cat /etc/cfg/cm.txt

app1=nginx

app2=redis

root@masterk8s:/docker#





Comments

Popular posts from this blog

SRE/DevOps Syllabus

AWS Code Commit - CI/CD Series Part 1

Docker - Preventing IP overlapping