Developer Instructions for maintaining the Kubernetes Manifests
This document describes the methods of creating and maintaining Kubernetes manifests in a simpler and easy to user format.
Image Tag Update
In order to update the image tag for a particular component, please edit the corresponding Deployment manifest in cim-solution/kubernetes/cim/Deployments
folder and change the image tag to the required value.
[root@devops230 Deployments]# more ef-reporting-connector-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
ef.service: ef-reporting-connector
ef: expertflow
name: ef-reporting-connector
namespace: expertflow
spec:
replicas: 1
selector:
matchLabels:
ef.service: ef-reporting-connector
template:
metadata:
labels:
ef.service: ef-reporting-connector
ef: expertflow
spec:
imagePullSecrets:
- name: expertflow-reg-cred
containers:
- image: gitlab.expertflow.com:9242/cim/reporting-connector/build:1.2
name: ef-reporting-connector
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume-conf
mountPath: /root/config/reporting-connector.conf
subPath: reporting-connector.conf
- name: config-volume-cron
mountPath: /etc/crontabs/root
subPath: root
volumes:
- name: config-volume-conf
configMap:
name: ef-reporting-connector-conf
optional: true
- name: config-volume-cron
configMap:
name: ef-reporting-connector-cron
items:
- key: reporting-connector-cron
path: root
restartPolicy: Always
To Apply the changed information, please delete the previous deployment using
kubectl delete -f Deployments/ef-<component>-deployment.yaml
and the re-apply the manifest using
kubectl apply -f Deployments/ef-<component>-deployment.yaml
Config-Maps
Config-Maps are meant to provide variable data which must be kept external to the container image like Container Environment and configuration files.
Currently in CIM , we are using 2 different types of Config-Maps
Environment Config-Maps
These are used to configure the Environment variables in key: value format and are then extended to the container process via the config-maps. The container process sees this list as environment variables similar to the way we use in our SHELL using 'export VAR=VAL' command
In order to create the environment based Config-Maps, please follow these steps
In this example we are going to add a variable called NEW_VARIABLES with the value of "true" in component 360-Connector's config-Map with the name of 'ef-connector360-cm'
change path
cd cim-solution/kubernetes/cim/ConfigMaps
Edit the ConfigMap as per the existing lines like
apiVersion: v1
data:
CCM_URL: http://ef-ccm-svc:8081/message/receive
CONNECT_TIMEOUT: "3000"
FILE_ENGINE_URL: https://ef-file-engine-svc:8443/
READ_TIMEOUT: "10000"
NEW_VARIABLES: "true"
kind: ConfigMap
metadata:
labels:
ef.service: 360-connector
ef: expertflow
name: ef-connector360-cm
namespace: expertflow
A new variables with the name of NEW_VARIABLES with the value of "true" has been added.
Now edit the deployment of the same CIM component for which the environment Config-Map has been changed and extend the change to deployment so that container can borrow it.
Go the the Deployments Folder
cd ../Deployment
Edit the corresponding component's Deployment file
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
ef.service: ef-360-connector
ef: expertflow
name: ef-360-connector
namespace: expertflow
spec:
replicas: 1
selector:
matchLabels:
ef.service: ef-360-connector
template:
metadata:
labels:
ef.service: ef-360-connector
ef: expertflow
spec:
imagePullSecrets:
- name: expertflow-reg-cred
containers:
- env:
- name: NEW_VARIABLES
valueFrom:
configMapKeyRef:
key: NEW_VARIABLES
name: ef-connector360-cm
- name: CCM_URL
valueFrom:
configMapKeyRef:
key: CCM_URL
name: ef-connector360-cm
- name: CONNECT_TIMEOUT
valueFrom:
configMapKeyRef:
key: CONNECT_TIMEOUT
name: ef-connector360-cm
- name: FILE_ENGINE_URL
valueFrom:
configMapKeyRef:
key: FILE_ENGINE_URL
name: ef-connector360-cm
- name: READ_TIMEOUT
valueFrom:
configMapKeyRef:
key: READ_TIMEOUT
name: ef-connector360-cm
image: gitlab.expertflow.com:9242/cim/360-connector/build:1.0-SR13_f-CIM-6938-1374e672ae6078fa7413aac858bad8fce91b5b48
name: ef-360-connector
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
restartPolicy: Always
Add the newly added environment Config-Map entry in the Deployment and save the file. The newly added config-map entry will always look like
- name: VARIABLE_NAME
valueFrom:
configMapKeyRef:
key: VARIABLE_NAME
name: CONFIG-MAP-NAME
where the VARIABLE_NAME is the variable that we introduced in our first step and the CONFIG-MAP is the name of its config-map edited in first step.
Once the Config-Map has been updated, the corresponding component's POD will have to re-created . Apply the changes by
deleting the existing config-map
kubectl delete -f ConfigMaps/<name-of-config-map>.yaml
delete the corresponding pod
kubectl delete -f Deployment/ef-<component>-deployment.yaml
Now apply the new config-map
kubectl apply -f ConfigMap/<name-of-config-map>.yaml
and re-create the POD using
kubectl apply -f Deployment/ef-<component>-deployment.yaml
the newly added variable will be made available to the container process. You can verify this by exec'ing into the the container/POD and issuing the 'env' command on your SHELL prompt.
kubectl -n expertflow exec -ti <POD-NAME> -- sh
# env
File-System Config-Maps
This method allows us to use the configuration files ( <= 1 MB file per ConfigMap) as file-name:file-contents pairs and then inherit these files in different locations inside the directory structure of the container. These config-maps can be used READ-ONLY mechanism to mount files.
In this example we will be mounting a file "reporting-connector.conf" as config-map to the Reporting-Connector container and then mount this file at "/root/config/reporting-connector.conf" inside the container, so that it is always available to the container as a regular file.
Create the Config-map from the file that we want to add using
kubectl -n expertflow create configmap <config-map-name> --from-file=reporting-connector.conf
Edit the Deployment of the component in Deployments folder under cim-solution/kubernetes/cim/Deployments
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
ef.service: ef-reporting-connector
ef: expertflow
name: ef-reporting-connector
namespace: expertflow
spec:
replicas: 1
selector:
matchLabels:
ef.service: ef-reporting-connector
template:
metadata:
labels:
ef.service: ef-reporting-connector
ef: expertflow
spec:
imagePullSecrets:
- name: expertflow-reg-cred
containers:
- image: gitlab.expertflow.com:9242/cim/reporting-connector/build:1.2
name: ef-reporting-connector
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume-conf
mountPath: /root/config/reporting-connector.conf
subPath: reporting-connector.conf
- name: config-volume-cron
mountPath: /etc/crontabs/root
subPath: root
volumes:
- name: config-volume-conf
configMap:
name: ef-reporting-connector-conf
optional: true
- name: config-volume-cron
configMap:
name: ef-reporting-connector-cron
items:
- key: reporting-connector-cron
path: root
restartPolicy: Always
Here are the details how it works.
Initially we added these lines
volumeMounts:
- name: config-volume-conf
mountPath: /root/config/reporting-connector.conf
subPath: reporting-connector.conf
This means that there is a volume attachment to the POD/container with the name of config-volume-conf
and its contents should be fetched from the volume name config-volume-conf
.
The volume now points to the actual config-map using
volumes:
- name: config-volume-conf
configMap:
name: ef-reporting-connector-conf
optional: true
The Volume Definition now explains that the volume contents are to be fetched from the configmap called ef-reporting-connector-conf
. Once these conditions are met, the config is inheritied to the container as a file to be mounted on /root/config/reporting-connector.conf
path.
A similar approach will needed to delete both Config-Map and running POD for the information to be transferred to the Container.