Dans cet exercice vous allez utiliser un Secret pour vous connecter à une base de données externe.
1. Le context
L’image registry.gitlab.com/lucj/messages:v1.0.5 contient une application simple qui écoute sur le port 3000 et permet, via des requêtes HTTP, de créer des messages ou de lister les messages existants dans une base de données MongoDB. L’URL de connexion de cette base doit être fournie à l’application de façon à ce que celle-ci puisse s’y connecter. Nous pouvons lui fournir via une variable d’environnement MONGODB_URL ou via un fichier qui devra être accessible depuis /app/db/mongodb_url.
Pour cet exercice vous allez utiliser la base de données Mongo dont l’URL de connexion est la suivante:
mongodb+srv://k8sExercice:k8sExercice@techwhale.hg5mrf8.mongodb.net/
Cette database est hostée sur MongoDB Atlas.
2. Création du Secret
Créez un Secret nommé mongo, le champ data de celui-ci doit contenir la clé mongo_url dont la valeur est la chaine de connection spécifiée ci-dessus.
Choisissez pour cela l’une des options suivantes:
-
Option 1: utilisation de la commande
kubectl create secret generic
avec l’option--from-file
-
Option 2: utilisation de la commande
kubectl create secret generic
avec l’option--from-literal
-
Option 3: utilisation d’un fichier de spécification
3. Utilisation du Secret dans une variable d’environnement
Définissez un Pod nommé messages-env dont l’unique container a la spécification suivante:
- image: registry.gitlab.com/lucj/messages:v1.0.5
- une variable d’environnement MONGODB_URL ayant la valeur liée à la clé mongo_url du Secret mongo créé précédemment
Créez ensuite ce Pod et exposez le en utilisant la commande kubectl port-forward
en faisant en sorte que le port 3000 de votre machine locale soit mappé sur le port 3000 du Pod messages-env.
Depuis un autre terminal, vérifiez que vous pouvez créer un message avec la commande suivante:
Note: assurez vous de remplacer YOUR_NAME par votre prénom
curl -H 'Content-Type: application/json' -XPOST -d '{"msg":"hello from YOUR_NAME"}' http://localhost:3000/messages
4. Utilisation du Secret dans un volume
Définissez un Pod nommé messages-vol ayant la spécification suivante:
- un volume nommé mongo-creds basé sur le Secret mongo
- un container ayant la spécification suivante:
- image: registry.gitlab.com/lucj/messages:v1.0.5
- une instructions volumeMounts permettant de monter la clé mongo_url du volume mongomongo-creds* dans le fichier /app/db/mongo_url
Créez le Pod et vérifier que vous pouvez créer un message de la même façon que dans le point précédent en exposant le Pod via un port-forward.
5. Cleanup
Supprimez les ddiférentes resources créées.
Solution
2. Création du Secret
- Option 1: utilisation de la commande
kubectl create secret generic
avec l’option--from-file
Utilisez la commande suivante afin de créer un fichier mongo_url contenant la chaine de connexion à la base de données:
echo -n "mongodb+srv://k8sExercice:k8sExercice@techwhale.hg5mrf8.mongodb.net/" > mongo_url
Nous crééons ensuite le Secret à partir de ce fichier:
kubectl create secret generic mongo --from-file=mongo_url
- Option 2: utilisation de la commande
kubectl create secret generic
avec l’option--from-literal
La commande suivante permet de créer le Secret à partir de valeurs littérales
kubectl create secret generic mongo --from-literal=mongo_url='mongodb+srv://k8sExercice:k8sExercice@techwhale.hg5mrf8.mongodb.net/'
- Option 3: utilisation d’un fichier de spécification
La première étape est d’encrypter en base64 la chaine de connexion
$ echo -n 'mongodb+srv://k8sExercice:k8sExercice@techwhale.hg5mrf8.mongodb.net/' | base64
bW9uZ29kYitzcnY6Ly9rOHNFeGVyY2ljZTprOHNFeGVyY2ljZUB0ZWNod2hhbGUuaGc1bXJmOC5tb25nb2RiLm5ldC8=
Ensuite nous pouvons définir le fichier de spécification mongo-secret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: mongo
data:
mongo_url: bW9uZ29kYitzcnY6Ly9rOHNFeGVyY2ljZTprOHNFeGVyY2ljZUB0ZWNod2hhbGUuaGc1bXJmOC5tb25nb2RiLm5ldC8=
La dernière étape consiste à créer le Secret à partir de ce fichier
kubectl apply -f mongo-secret.yaml
3. Utilisation du Secret dans une variable d’environnement
Nous définissons la spécification suivante dans le fichier messages-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: messages-env
spec:
containers:
- name: messages
image: registry.gitlab.com/lucj/messages:v1.0.5
env:
- name: MONGODB_URL
valueFrom:
secretKeyRef:
name: mongo
key: mongo_url
Nous pouvons alors créer le Pod:
kubectl apply -f messages-env.yaml
La commande suivante permet d’exposer en localhost l’API tournant dans le container du Pod:
kubectl port-forward messages-env 3000:3000
Depuis un autre terminal de la machine locale, nous pouvons alors envoyer une requête POST sur l’API:
curl -H 'Content-Type: application/json' -XPOST -d '{"msg":"hello from YOUR_NAME"}' http://localhost:3000/messages
La réponse retournée est similaire à celle ci-dessous:
{"msg":"hello from USER_NAME","created_at":"2023-08-02T11:37:29.796Z"}
Nous pouvons ensuite arrêter le port-forward.
4. Utilisation du Secret dans un volume
Nous définissons la spécification suivante dans le fichier messages-vol.yaml
apiVersion: v1
kind: Pod
metadata:
name: messages-vol
spec:
containers:
- name: messages
image: registry.gitlab.com/lucj/messages:v1.0.5
volumeMounts:
- name: mongo-creds
mountPath: "/app/db"
readOnly: true
volumes:
- name: mongo-creds
secret:
secretName: mongo
Si vous avez donné un autre nom que mongo_url à la clé du Secret (vous l’avez par exemple nommée mongo), vous pouvez mettre à disposition cette clé avec la configuration suivante:
volumeMounts:
- name: mongo-creds
mountPath: "/app/db/mongo_url"
subPath: "mongo"
Nous pouvons alors créer le Pod:
kubectl apply -f messages-vol.yaml
La commande suivante permet d’exposer en localhost l’API tournant dans le container du Pod:
kubectl port-forward messages-vol 3000:3000
Depuis la machine locale, nous pouvons alors envoyer une requête POST sur l’API:
curl -H 'Content-Type: application/json' -XPOST -d '{"msg":"hello from USER_NAME"}' http://localhost:3000/messages
Nous obtenons alors une réponse simimaire à la suivante:
{"msg":"hello from USER_NAME","created_at":"2023-08-02T11:40:26.765Z"}
Nous pouvons ensuite arrêter le port-forward.
5. Cleanup
kubectl delete po messages-env messages-vol
kubectl delete secret mongo