Kubernetes - Configmap and Deployments
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
Post a Comment