Guide et instructions

1. Objectifs

  • Création des ConfigMaps et secrets
  • Utilisation des ConfigMaps et secrets

2. Introduction

Après avoir vue comment déployer des applications dans un cluster K8s, on va découvrir dans cette partie la configuration de l’ensemble des applications d’un cluster K8s à l’aide des objets « ConfigMap » et « Secrect ».

En général les variables utilisées dans de nombreuses applications (nom d’un bucket, nom d’une file de message, etc.) sont stockées dans un objet de type ConfigMap. Les mots de passe, token ou les clefs sont injectés en utilisant l’objet Secret. Pour manipuler ces aspects on va configurer une base de données « MariaDB »

Créez un dossier « lab07 » et basculez dans ce dossier

mkdir lab07
cd lab07

3. Secrets

Générez un mot de passe en base64 avec la commande suivante:

$ echo -n 'K8sTraining!' | base64

Notez la valeur et placez-la dans la définition le secret définie dans le fichier db-secret.yaml suivant:

apiVersion: v1
kind: Secret
metadata:
  name: mariadb-root-password 
type: Opaque
data:
  password: PLACEZ ICI LA VALEUR

Créez la « secret »

kubectl apply -f db-secret.yaml

Affichez la « secret »

kubectl describe secret mariadb-root-password
kubectl get secret mariadb-root-password -o jsonpath='{.data.password}' | base64 -d

On peut aussi utiliser cette deuxième façon pour créer un « secret » nommé « mariadb-user-creds »

kubectl create secret generic mariadb-user-creds \
--from-literal=MYSQL_USER=kubeuser \
--from-literal=MYSQL_ROOT_PASSWORD=K8sTraining

4. ConfigMap

Créez une « configMap» nommée « mariadb-config » à partir du fichier max_allowed_packet.cnf suivant:

[mysqld]
max_allowed_packet = 64M

Complétez cette commande pour créer la « ConfigMap »

kubectl create configmap ...

Éditez la « configMap » pour changer la valeur de « max_allowed_packet » vers 32M

5. Utilisation

On va déployer la base de donnée mariaDB avec le manifeste mariadb-deployment.yaml suivant:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: mariadb
  name: mariadb-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      containers:
      - name: mariadb
        image: docker.io/mariadb:10.4
        ports:
        - containerPort: 3306
          protocol: TCP
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mariadb-volume-1
      volumes:
      - emptyDir: {}
        name: mariadb-volume-1

Ajouter les 2 secrets créées précédemment en tant que variables d’environnement au déploiement

  • mariadb-root-password: key/value pair
  • mariadb-user-creds: key/value pair

Pour vous aider utilisez les sections suivantes à ajouter et à compléter dans le manifeste.

env:
  - name: MYSQL_ROOT_PASSWORD
    valueFrom:
      secretKeyRef:
        name: mariadb-root-password
        key: password

Et

envFrom:
- secretRef:
    name: mariadb-user-creds

Ajoutez la ConfigMap « mariadb-config » en tant que source dans un volume de la spécification du pod.
Ajoutez ensuite un « volumeMount » à la définition du conteneur. Utilisez le configMap comme volumeMount pour « /etc/mysql/conf.d »

Créez le déploiement

kubectl create -f mariadb-deployment.yaml

Vérifier que les « secrets » et les « configMaps» sont bien utilisés par le pod

kubectl exec -it [pod-name] -- env |grep MYSQL
kubectl exec -it [pod-name] -- ls /etc/mysql/conf.d
kubectl exec -it [pod-name] -- cat /etc/mysql/conf.d/max_allowed_packet.cnf

Vérifiez que ça fonctionne

kubectl exec -it [pod-name] -- /bin/sh
mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e 'show databases;'
mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "SHOW VARIABLES LIKE 'max_allowed_packet';"

Nettoyez les resources

kubectl delete deployment mariadb-deployment
kubectl delete cm mariadb-config
kubectl delete secret mariadb-root-password mariadb-user-creds