Kubernetes exemple avec Minikube

Exemple de déploiement d'une application flask avec postgres en backend et vue.js en front

Pré requis 📎

  • Docker et compose plugin 🐳
  • Virtualbox 💻
  • Minikube (mini K8S)

Installation Docker et compose

wget https://git.legaragenumerique.fr/GARAGENUM/docker/raw/branch/main/docker-install.sh && bash ./docker-install.sh

##~ Installation de Virtualbox

wget -O- -q https://www.virtualbox.org/download/oracle_vbox_2016.asc | sudo gpg --dearmour -o /usr/share/keyrings/oracle_vbox_2016.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/oracle_vbox_2016.gpg] http://download.virtualbox.org/virtualbox/debian bookworm contrib" | sudo tee /etc/apt/sources.list.d/virtualbox.list
sudo apt update
sudo apt install virtualbox-7.0

Installation Minikube

Installer et lancer Minikube:

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
  • Démarrer le cluster:
minikube start --vm-driver=virtualbox --nodes 2
minikube dashboard

La dashboard pop dans le navigateur 📊

Déploiement des services 🚀

Volume persistant

  • Créer le volume persistant:
kubectl apply -f ./kubernetes/persistent-volume.yml
  • Créer le volume claim:
kubectl apply -f ./kubernetes/persistent-volume-claim.yml

Secrets 🔒

  • Créer un objet secret (database user + password):
kubectl apply -f ./kubernetes/secret.yml

Les secrets sont encodés sur base 64

echo -n "pleasechangeme" | base64
# output:
cGxlYXNlY2hhbmdlbWU=

echo -n "sample" | base64
# output:
c2FtcGxl

Postgres

  • Créer le deployement:
kubectl create -f ./kubernetes/postgres-deployment.yml
  • Créer le service:
kubectl create -f ./kubernetes/postgres-service.yml
  • Créer la database:
POD_NAME=$(kubectl get pod -l service=postgres -o jsonpath="{.items[0].metadata.name}")
kubectl exec $POD_NAME --stdin --tty -- createdb -U sample books

Flask

  • Créer le deployement:
kubectl create -f ./kubernetes/flask-deployment.yml
  • Créer le service:
kubectl create -f ./kubernetes/flask-service.yml
  • Appliquer la migration et la source de la database:
FLASK_POD_NAME=$(kubectl get pod -l app=flask -o jsonpath="{.items[0].metadata.name}")
kubectl exec $FLASK_POD_NAME --stdin --tty -- python manage.py recreate_db
kubectl exec $FLASK_POD_NAME --stdin --tty -- python manage.py seed_db

Vue

  • Créer le deployement:
kubectl create -f ./kubernetes/vue-deployment.yml
  • Créer le service:
kubectl create -f ./kubernetes/vue-service.yml

Ingress 🚪

  • Installer et démarrer l'ingress:
minikube addons enable ingress
kubectl apply -f ./kubernetes/minikube-ingress.yml
  • Ajouter une entrée au fichier /etc/hosts:
echo "$(minikube ip) flask.k8s" | sudo tee -a /etc/hosts

Résultat 🏁

  • L'application est disponible à l'adresse:

📌 http://flask.k8s/

  • Tester les différents pods du replica set flask:
for ((i=1;i<=10;i++)); do curl http://flask.k8s/books/ping; done

Version semi automatisée (deploy.sh)

./deploy.sh
# attendre que la dashboard pop dans le navigateur, puis:
POD_NAME=$(kubectl get pod -l service=postgres -o jsonpath="{.items[0].metadata.name}")
kubectl exec $POD_NAME --stdin --tty -- createdb -U sample books
FLASK_POD_NAME=$(kubectl get pod -l app=flask -o jsonpath="{.items[0].metadata.name}")
kubectl exec $FLASK_POD_NAME --stdin --tty -- python manage.py recreate_db
kubectl exec $FLASK_POD_NAME --stdin --tty -- python manage.py seed_db

Si vous rencontrez des erreurs avec les commandes, attendre un peu que les pods soient déployés

Commandes utiles 👍

  • Infos:
kubectl get pods
kubectl get deployment
  • Scaler des les services:
kubectl scale deployment flask --replicas=5
kubectl scale deployment vue --replicas=2
  • Pods logs:
kubectl logs <POD_NAME>

Debug 😭

  • En cas de problèmes avec Minikube, reinstaller celui-ci:
minikube stop; minikube delete
sudo rm /usr/local/bin/minikube
rm -rf ~/.minikube
# re-download minikube
minikube start

Cheatsheet 😜

Kubernetes commandes

Todo 📋

  • commandes kubectl utiles + mise à l'échelle
  • changer flask.book
  • transposer ver K8S multinode
  • traduire vue.js templates

Source

source testdriven.io.

Description
Kubernetes déploiement via Minikube, Kind et Vagrant
Readme 211 KiB
Languages
JavaScript 44.7%
Vue 24.3%
Shell 16.8%
Python 11.8%
Dockerfile 1.8%
Other 0.6%