Configmap

Prérequis

ConfigMap est la ressource Kubernetes qui vous permet d’externaliser la configuration de votre application.

La configuration d’une application est tout ce qui est susceptible de varier entre les déploiements (staging, production, environnements de développement, etc).

The Twelve-Factor App

Variables d’environnement

MyRESTController.java comprend un petit morceau de code qui s’adresse à l’environnement :

@RequestMapping("/configure")
   public String configure() {
        String databaseConn = environment.getProperty("DBCONN","Default");
        String msgBroker = environment.getProperty("MSGBROKER","Default");
        String hello = environment.getProperty("GREETING","Default");
        String love = environment.getProperty("LOVE","Default");
        return "Configuration: \n"
            + "databaseConn=" + databaseConn + "\n"
            + "msgBroker=" + msgBroker + "\n"
            + "hello=" + hello + "\n"
            + "love=" + love + "\n";
   }

Les variables d’environnement peuvent être manipulées au niveau du déploiement. Les modifications entraînent le redéploiement du Pod.

Déploiement de myboot :

Créer un fichier de déploiement

vi apps/kubefiles/myboot-deployment.yml

myboot-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myboot
  name: myboot
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myboot
  template:
    metadata:
      labels:
        app: myboot
    spec:
      containers:
      - name: myboot
        image: quay.io/rhdevelopers/myboot:v2
        ports:
          - containerPort: 8080
kubectl apply -f apps/kubefiles/myboot-deployment.yml

Déployer le service myboot :

vi apps/kubefiles/myboot-service.yml

myboot-service.yml

apiVersion: v1
kind: Service
metadata:
  name: myboot
  labels:
    app: myboot
spec:
  ports:
  - name: http
    port: 8080
  selector:
    app: myboot
  type: LoadBalancer
kubectl apply -f apps/kubefiles/myboot-service.yml

Et regardez l’état du pod :

watch kubectl get pods

Créer les variables IP et PORT :

IP=$(minikube ip -p devnation)
PORT=$(kubectl get service/myboot -o jsonpath="{.spec.ports[*].nodePort}")

Réaliser une requete sur le service :

curl $IP:$PORT
curl $IP:$PORT/configure
Configuration for : myboot-66d7d57687-jsbz7
databaseConn=Default
msgBroker=Default
greeting=Default
love=Default

Définir les variables d’environnement

kubectl set env deployment/myboot GREETING="namaste"
kubectl set env deployment/myboot LOVE="Aloha"
kubectl set env deployment/myboot DBCONN="jdbc:sqlserver://45.91.12.123:1443;user=MyUserName;password=*****;"

Regardez les pods reborn :

NAME                      READY   STATUS        RESTARTS   AGE
myboot-66d7d57687-jsbz7   1/1     Terminating   0          5m
myboot-785ff6bddc-ghwpc   1/1     Running       0          13s
curl $IP:$PORT/configure
Configuration for : myboot-5fd9dd9c59-58xbh
databaseConn=jdbc:sqlserver://45.91.12.123:1443;user=MyUserName;password=*****;
msgBroker=Default
greeting=namaste
love=Aloha

Décrivez le déploiement :

kubectl describe deployment myboot
...
  Containers:
   myboot:
    Image:      quay.io/burrsutter/myboot:v1
    Port:       8080/TCP
    Host Port:  0/TCP
    Environment:
      GREETING:  namaste
      LOVE:      Aloha
      DBCONN:    jdbc:sqlserver://45.91.12.123:1443;user=MyUserName;password=*****;
    Mounts:      <none>
  Volumes:       <none>
...

Supprimez les variables d’environnement :

kubectl set env deployment/myboot GREETING-
kubectl set env deployment/myboot LOVE-
kubectl set env deployment/myboot DBCONN-

Et vérifiez qu’ils ont été retirés :

curl $IP:$PORT/configure
Configuration for : myboot-66d7d57687-xkgw6
databaseConn=Default
msgBroker=Default
greeting=Default
love=Default

Créer un ConfigMap

kubectl create cm my-config --from-env-file=apps/config/some.properties
kubectl get cm
kubectl get cm my-config
kubectl get cm my-config -o json
...
    "data": {
        "GREETING": "jambo",
        "LOVE": "Amour"
    },
    "kind": "ConfigMap",
...

Ou vous pouvez décrire l’objet ConfigMap :

kubectl describe cm my-config
Name:         my-config
Namespace:    myspace
Labels:       <none>
Annotations:  <none>

Data
====
GREETING:
====
jambo
LOVE:
====
Amour
Events:  <none>

Maintenant, déployez l’application avec sa requête pour le ConfigMap :

kubectl apply -f apps/kubefiles/myboot-deployment-configuration.yml

Et obtenir son point de terminaison de configuration :

curl $IP:$PORT/configure
Configuration for : myboot-84bfcff474-x6xnt
databaseConn=Default
msgBroker=Default
greeting=jambo
love=Amour

Et passez à l’autre fichier de propriétés en recréant le ConfigMap :

kubectl delete cm my-config
kubectl create cm my-config --from-env-file=apps/config/other.properties
kubectl delete pod -l app=myboot
curl $IP:$PORT/configure
Configuration for : myboot-694954fc6d-nzdvx
databaseConn=jdbc:sqlserver://123.123.123.123:1443;user=MyUserName;password=*****;
msgBroker=tcp://localhost:61616?jms.useAsyncSend=true
hello=Default
love=Default

Il y a beaucoup d’autres façons de s’amuser avec ConfigMaps, la documentation de base vous fait manipuler une spécification Pod au lieu d’un déploiement mais les résultats sont fondamentalement les mêmes https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap.

Supprimer les ressources

kubectl delete deployment myboot
kubectl delete cm my-config
kubectl delete service myboot