Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Projet E5 SAB - Urbanisation des SI

Ce document présente la démarche et les étapes réalisées dans le cadre du projet d’urbanisation des systèmes d’information (SI).

Groupe et Références

Partie 0 : Applications sélectionnées

  • Application Rocket Flask Stripe
  • MariaDB
  • PHPMyAdmin

Partie 1 : Mise en place de l’environnement

Choix du framework Kubernetes

Le framework sélectionné pour répondre aux critères du MVP est Minikube.

Minikube correspond à ce framework, il sera donc utilisé pour la suite du projet.

Lancement de Minikube

minikube start --listen-address=0.0.0.0 --memory=max --cpus=max --kubernetes-version=v1.35.0

Résultat de la commande minikube

Chargement de l’image Docker dans Minikube

L’image Docker n’était pas présente dans l’environnement Docker de Minikube, elle avait été construite uniquement dans le Docker local. Il a donc été nécessaire de charger l’image locale dans Minikube pour l’utiliser dans le cluster.

Avant de charger l’image

Avant de charger l’image

Avant de charger l’image

minikube image load rocket:local

Après le chargement de l’image

Après avoir fait fonctionner l’image en local, nous l’avons publiée sur Docker Hub afin que les images des applications soient accessibles depuis un repository Docker Hub.


Publication de l’image sur Docker Hub

Pour permettre le déploiement sur différents environnements et garantir l’accessibilité de l’image, celle-ci a été publiée sur un repository Docker Hub public : warpprod/rocket-ecommerce.

L’image à été envoyée dans DockerHub via la commande suivante :

docker build -t warpprod/rocket-ecommerce .&& docker push warpprod/rocket-ecommerce
[+] Building 14.4s (8/16) docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.09kB 0.0s
=> [internal] load metadata for docker.io/library/python:3.11.5 0.7s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [ 1/11] FROM docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> => resolve docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 24.75kB 0.0s
=> [ 2/11] COPY requirements.txt . 0.3s
=> [ 3/11] RUN pip install --upgrade pip 5.2s
=> [ 4/11] RUN pip install --no-cache-dir -r requirements.txt 7.8s => => # Downloading mysqlclient-2.2.0.tar.gz (89 kB) => => # Installing build dependencies: started => => # Installing build dependencies: finished with status 'done' => => # Getting requirements to build wheel: started => => # Getting requirements to build wheel: finished with status 'done' => => # Preparing metadata (pyproject.toml): started ... etc

Après avoir construit l’image, vous pouvez vérifier qu’elle est bien disponible avec la commande suivante :

docker images | grep warpprod/rocket-ecommerce

On spécifie donc l’image dans nos manifestes Kubernetes comme ceci :

image: warpprod/rocket-ecommerce:latest

Cela assure que toutes les équipes et environnements peuvent accéder à la même version de l’application.

Configuration de l'application pour MariaDB

L'application n'avait pas le connecteur de MariaDB présent dans les requirements de l'aplication, nous avons dû l'ajouter

  1. Installer le connecteur :
    Modifier le fichier requirements.txt pour ajouter la dépendance suivante :

    PyMySQL==1.1.0
  2. Migration de la database : Nous nous sommes connecté à l'un des conteurs via les commandes suivantes :

    minikube ssh
    docker ps
    docker exec -ti container_name /bin/bash

    Nous avons ensuite suivi la documentation de l'application ecommerce et tapé les commandes suivantes :

    python manage.py makemigrations
    python manage.py migrate

    Initialisation de la base de donnée

Nous avons ensuite ajouté un produit Mug dans Stripe, qui apparaît bien dans l’interface du site e-commerce :

Produit ajouté dans StripeAffichage du produit sur le site
Mug dans StripeMug sur le site

Pour valider le parcours d’achat, une transaction a été réalisée depuis le site pour acheter ce Mug. La réussite de la transaction est visible à la fois dans Stripe et sur le site e-commerce :

Transaction réussie dans StripeConfirmation sur le site e-commerce
Transaction StripePage d'achat
Achat réussi

Enfin, les informations de la commande et du produit acheté sont bien enregistrées dans la base de données, consultables via phpMyAdmin :

Commandes dans phpMyAdminProduit acheté
CommandesProduit

Vérification du nombre de réplicas

Pour garantir la haute disponibilité de l’application, le nombre de réplicas a été défini à 3 dans le manifeste Kubernetes :

spec:
replicas: 3

Cela permet d’assurer que trois pods de l’application sont toujours déployés et disponibles dans le cluster.

Partie 2 : Déploiement multi-environnements

Pour permettre l’accès aux applications à plusieurs équipes, des environnements isolés doivent être créés pour :

  • mlops
  • preprod
  • prod

L’infrastructure as code doit être déployée de façon identique dans ces trois environnements.

Déploiement multi-environnements

Trois fichiers de déploiement Kubernetes ont été créés pour isoler les environnements :

Chaque fichier contient la même structure d’infrastructure (namespace, déploiements, services, volumes, etc.), adaptée à l’environnement cible.
Cela permet à chaque équipe de travailler dans un environnement isolé, tout en garantissant la cohérence des ressources déployées.

Commande pour appliquer les environnements

k apply -f prod-deployment.yaml
k apply -f preprod-deployment.yaml
k apply -f mlops-deployment.yaml

Commande pour appliquer les modifications :

  • Apply

Vérification de l'état des déploiements :

  • Commandes de vérification

Chaque environnement dispose ainsi de ses propres ressources, assurant l’isolation et la reproductibilité des déploiements.


Partie 3 : Intégration d’une base de données

Une base de données autre que SQLite doit être déployée et connectée à l’application Stripe.

Exemple de configuration MariaDB dans prod-deployment.yaml

La documentation MariaDB sur Kubernetes de IONOS a été utilisée pour intégrer MariaDB au projet. Le fichier a été adapté pour répondre aux besoins spécifiques.

Nous avons ajouter les namespaces "prod" sur notre fichier pour faire fonctionner MariaDB et PhpMyAdmin (qui permettra à un adaministrateur de maintenir la base de données du site).

Pour voir les infos de mariadb, vous pouvez lire prod-deployment.yaml.

# Principales informations de mariadbapiVersion: v1kind: PersistentVolumemetadata:
name: mariadb-pvspec:
capacity:
storage: 10GiaccessModes:
- ReadWriteOncepersistentVolumeReclaimPolicy: RetainhostPath:
path: /mnt/data/mariadb
---
apiVersion: v1kind: PersistentVolumeClaimmetadata:
name: mariadb-pvcnamespace: prodspec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: ConfigMapmetadata:
name: mariadb-confignamespace: prodlabels:
app: mariadbdata:
my.cnf: | [mysqld] bind-address=0.0.0.0 default_storage_engine=InnoDB innodb_file_per_table=1 max_connections=1000---
apiVersion: apps/v1kind: StatefulSetmetadata:
name: mariadbnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: mariadbserviceName: mariadbtemplate:
metadata:
labels:
app: mariadbspec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORDvalue: "SuperSecurePass123"
- name: MYSQL_DATABASEvalue: "ecommerce"image: mariadb:latestname: mariadbports:
- containerPort: 3306name: mariadbvolumeMounts:
- mountPath: /var/lib/mysqlname: mariadb-storage
- mountPath: /etc/mysql/conf.dname: config-volumevolumes:
- configMap:
name: mariadb-configname: config-volumevolumeClaimTemplates:
- metadata:
name: mariadb-storagespec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: Servicemetadata:
name: mariadbnamespace: prodspec:
ports:
- port: 3306targetPort: 3306selector:
app: mariadb
# Partie pour phpmyadminapiVersion: apps/v1kind: Deploymentmetadata:
name: phpmyadminnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: phpmyadmintemplate:
metadata:
labels:
app: phpmyadminspec:
containers:
- name: phpmyadminimage: phpmyadmin/phpmyadmin:latestenv:
- name: PMA_HOSTvalue: mariadb
- name: PMA_PORTvalue: "3306"
- name: PMA_ARBITRARYvalue: "1"ports:
- containerPort: 80
---
apiVersion: v1kind: Servicemetadata:
name: phpmyadmin-servicenamespace: prodspec:
type: NodePortports:
- port: 8080targetPort: 80nodePort: 30080selector:
app: phpmyadmin
# Afficher toutes les ressources principales Kubernetes dans le namespace courant
k get all

Retour :

NAME READY AGE
statefulset.apps/mariadb 1/1 22s

Accès aux services depuis l'extérieur

Nous avions rencontré des difficultés d'usage avec mikicube port forward qui était extrêmement lent, nous l'avons donc remplacé par socat qui nous a permis de publier nos NodePorts sur l'IP Publique de notre VM avec de bien meilleures performances.

# Commande pour le site e-commerce de Prod
sudo socat TCP-LISTEN:5005,fork,reuseaddr TCP:$(minikube ip):30005
# Commande pour PhpMyAdmin de Prod
sudo socat TCP-LISTEN:8080,fork,reuseaddr TCP:$(minikube ip):30080

Conclusion

Ce projet nous a permis de mettre en pratique les principes fondamentaux de Kubernetes à travers le déploiement d'une application e-commerce et d'une stack complète. Nous avons réussi à containeriser nos services (Flask, MariaDB et PHPMyAdmin), publier une "application métier" sur Docker Hub et les orchestrer via Minikube.

About

Projet E5 SAB - Urbanisation des SI

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - CringeTM/UrbanSI: Projet E5 SAB - Urbanisation des SI · GitHub
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Projet E5 SAB - Urbanisation des SI

Ce document présente la démarche et les étapes réalisées dans le cadre du projet d’urbanisation des systèmes d’information (SI).

Groupe et Références

Partie 0 : Applications sélectionnées

  • Application Rocket Flask Stripe
  • MariaDB
  • PHPMyAdmin

Partie 1 : Mise en place de l’environnement

Choix du framework Kubernetes

Le framework sélectionné pour répondre aux critères du MVP est Minikube.

Minikube correspond à ce framework, il sera donc utilisé pour la suite du projet.

Lancement de Minikube

minikube start --listen-address=0.0.0.0 --memory=max --cpus=max --kubernetes-version=v1.35.0

Résultat de la commande minikube

Chargement de l’image Docker dans Minikube

L’image Docker n’était pas présente dans l’environnement Docker de Minikube, elle avait été construite uniquement dans le Docker local. Il a donc été nécessaire de charger l’image locale dans Minikube pour l’utiliser dans le cluster.

Avant de charger l’image

Avant de charger l’image

Avant de charger l’image

minikube image load rocket:local

Après le chargement de l’image

Après avoir fait fonctionner l’image en local, nous l’avons publiée sur Docker Hub afin que les images des applications soient accessibles depuis un repository Docker Hub.


Publication de l’image sur Docker Hub

Pour permettre le déploiement sur différents environnements et garantir l’accessibilité de l’image, celle-ci a été publiée sur un repository Docker Hub public : warpprod/rocket-ecommerce.

L’image à été envoyée dans DockerHub via la commande suivante :

docker build -t warpprod/rocket-ecommerce .&& docker push warpprod/rocket-ecommerce
[+] Building 14.4s (8/16) docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.09kB 0.0s
=> [internal] load metadata for docker.io/library/python:3.11.5 0.7s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [ 1/11] FROM docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> => resolve docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 24.75kB 0.0s
=> [ 2/11] COPY requirements.txt . 0.3s
=> [ 3/11] RUN pip install --upgrade pip 5.2s
=> [ 4/11] RUN pip install --no-cache-dir -r requirements.txt 7.8s => => # Downloading mysqlclient-2.2.0.tar.gz (89 kB) => => # Installing build dependencies: started => => # Installing build dependencies: finished with status 'done' => => # Getting requirements to build wheel: started => => # Getting requirements to build wheel: finished with status 'done' => => # Preparing metadata (pyproject.toml): started ... etc

Après avoir construit l’image, vous pouvez vérifier qu’elle est bien disponible avec la commande suivante :

docker images | grep warpprod/rocket-ecommerce

On spécifie donc l’image dans nos manifestes Kubernetes comme ceci :

image: warpprod/rocket-ecommerce:latest

Cela assure que toutes les équipes et environnements peuvent accéder à la même version de l’application.

Configuration de l'application pour MariaDB

L'application n'avait pas le connecteur de MariaDB présent dans les requirements de l'aplication, nous avons dû l'ajouter

  1. Installer le connecteur :
    Modifier le fichier requirements.txt pour ajouter la dépendance suivante :

    PyMySQL==1.1.0
  2. Migration de la database : Nous nous sommes connecté à l'un des conteurs via les commandes suivantes :

    minikube ssh
    docker ps
    docker exec -ti container_name /bin/bash

    Nous avons ensuite suivi la documentation de l'application ecommerce et tapé les commandes suivantes :

    python manage.py makemigrations
    python manage.py migrate

    Initialisation de la base de donnée

Nous avons ensuite ajouté un produit Mug dans Stripe, qui apparaît bien dans l’interface du site e-commerce :

Produit ajouté dans StripeAffichage du produit sur le site
Mug dans StripeMug sur le site

Pour valider le parcours d’achat, une transaction a été réalisée depuis le site pour acheter ce Mug. La réussite de la transaction est visible à la fois dans Stripe et sur le site e-commerce :

Transaction réussie dans StripeConfirmation sur le site e-commerce
Transaction StripePage d'achat
Achat réussi

Enfin, les informations de la commande et du produit acheté sont bien enregistrées dans la base de données, consultables via phpMyAdmin :

Commandes dans phpMyAdminProduit acheté
CommandesProduit

Vérification du nombre de réplicas

Pour garantir la haute disponibilité de l’application, le nombre de réplicas a été défini à 3 dans le manifeste Kubernetes :

spec:
replicas: 3

Cela permet d’assurer que trois pods de l’application sont toujours déployés et disponibles dans le cluster.

Partie 2 : Déploiement multi-environnements

Pour permettre l’accès aux applications à plusieurs équipes, des environnements isolés doivent être créés pour :

  • mlops
  • preprod
  • prod

L’infrastructure as code doit être déployée de façon identique dans ces trois environnements.

Déploiement multi-environnements

Trois fichiers de déploiement Kubernetes ont été créés pour isoler les environnements :

Chaque fichier contient la même structure d’infrastructure (namespace, déploiements, services, volumes, etc.), adaptée à l’environnement cible.
Cela permet à chaque équipe de travailler dans un environnement isolé, tout en garantissant la cohérence des ressources déployées.

Commande pour appliquer les environnements

k apply -f prod-deployment.yaml
k apply -f preprod-deployment.yaml
k apply -f mlops-deployment.yaml

Commande pour appliquer les modifications :

  • Apply

Vérification de l'état des déploiements :

  • Commandes de vérification

Chaque environnement dispose ainsi de ses propres ressources, assurant l’isolation et la reproductibilité des déploiements.


Partie 3 : Intégration d’une base de données

Une base de données autre que SQLite doit être déployée et connectée à l’application Stripe.

Exemple de configuration MariaDB dans prod-deployment.yaml

La documentation MariaDB sur Kubernetes de IONOS a été utilisée pour intégrer MariaDB au projet. Le fichier a été adapté pour répondre aux besoins spécifiques.

Nous avons ajouter les namespaces "prod" sur notre fichier pour faire fonctionner MariaDB et PhpMyAdmin (qui permettra à un adaministrateur de maintenir la base de données du site).

Pour voir les infos de mariadb, vous pouvez lire prod-deployment.yaml.

# Principales informations de mariadbapiVersion: v1kind: PersistentVolumemetadata:
name: mariadb-pvspec:
capacity:
storage: 10GiaccessModes:
- ReadWriteOncepersistentVolumeReclaimPolicy: RetainhostPath:
path: /mnt/data/mariadb
---
apiVersion: v1kind: PersistentVolumeClaimmetadata:
name: mariadb-pvcnamespace: prodspec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: ConfigMapmetadata:
name: mariadb-confignamespace: prodlabels:
app: mariadbdata:
my.cnf: | [mysqld] bind-address=0.0.0.0 default_storage_engine=InnoDB innodb_file_per_table=1 max_connections=1000---
apiVersion: apps/v1kind: StatefulSetmetadata:
name: mariadbnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: mariadbserviceName: mariadbtemplate:
metadata:
labels:
app: mariadbspec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORDvalue: "SuperSecurePass123"
- name: MYSQL_DATABASEvalue: "ecommerce"image: mariadb:latestname: mariadbports:
- containerPort: 3306name: mariadbvolumeMounts:
- mountPath: /var/lib/mysqlname: mariadb-storage
- mountPath: /etc/mysql/conf.dname: config-volumevolumes:
- configMap:
name: mariadb-configname: config-volumevolumeClaimTemplates:
- metadata:
name: mariadb-storagespec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: Servicemetadata:
name: mariadbnamespace: prodspec:
ports:
- port: 3306targetPort: 3306selector:
app: mariadb
# Partie pour phpmyadminapiVersion: apps/v1kind: Deploymentmetadata:
name: phpmyadminnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: phpmyadmintemplate:
metadata:
labels:
app: phpmyadminspec:
containers:
- name: phpmyadminimage: phpmyadmin/phpmyadmin:latestenv:
- name: PMA_HOSTvalue: mariadb
- name: PMA_PORTvalue: "3306"
- name: PMA_ARBITRARYvalue: "1"ports:
- containerPort: 80
---
apiVersion: v1kind: Servicemetadata:
name: phpmyadmin-servicenamespace: prodspec:
type: NodePortports:
- port: 8080targetPort: 80nodePort: 30080selector:
app: phpmyadmin
# Afficher toutes les ressources principales Kubernetes dans le namespace courant
k get all

Retour :

NAME READY AGE
statefulset.apps/mariadb 1/1 22s

Accès aux services depuis l'extérieur

Nous avions rencontré des difficultés d'usage avec mikicube port forward qui était extrêmement lent, nous l'avons donc remplacé par socat qui nous a permis de publier nos NodePorts sur l'IP Publique de notre VM avec de bien meilleures performances.

# Commande pour le site e-commerce de Prod
sudo socat TCP-LISTEN:5005,fork,reuseaddr TCP:$(minikube ip):30005
# Commande pour PhpMyAdmin de Prod
sudo socat TCP-LISTEN:8080,fork,reuseaddr TCP:$(minikube ip):30080

Conclusion

Ce projet nous a permis de mettre en pratique les principes fondamentaux de Kubernetes à travers le déploiement d'une application e-commerce et d'une stack complète. Nous avons réussi à containeriser nos services (Flask, MariaDB et PHPMyAdmin), publier une "application métier" sur Docker Hub et les orchestrer via Minikube.

About

Projet E5 SAB - Urbanisation des SI

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - CringeTM/UrbanSI: Projet E5 SAB - Urbanisation des SI · GitHub
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Projet E5 SAB - Urbanisation des SI

Ce document présente la démarche et les étapes réalisées dans le cadre du projet d’urbanisation des systèmes d’information (SI).

Groupe et Références

Partie 0 : Applications sélectionnées

  • Application Rocket Flask Stripe
  • MariaDB
  • PHPMyAdmin

Partie 1 : Mise en place de l’environnement

Choix du framework Kubernetes

Le framework sélectionné pour répondre aux critères du MVP est Minikube.

Minikube correspond à ce framework, il sera donc utilisé pour la suite du projet.

Lancement de Minikube

minikube start --listen-address=0.0.0.0 --memory=max --cpus=max --kubernetes-version=v1.35.0

Résultat de la commande minikube

Chargement de l’image Docker dans Minikube

L’image Docker n’était pas présente dans l’environnement Docker de Minikube, elle avait été construite uniquement dans le Docker local. Il a donc été nécessaire de charger l’image locale dans Minikube pour l’utiliser dans le cluster.

Avant de charger l’image

Avant de charger l’image

Avant de charger l’image

minikube image load rocket:local

Après le chargement de l’image

Après avoir fait fonctionner l’image en local, nous l’avons publiée sur Docker Hub afin que les images des applications soient accessibles depuis un repository Docker Hub.


Publication de l’image sur Docker Hub

Pour permettre le déploiement sur différents environnements et garantir l’accessibilité de l’image, celle-ci a été publiée sur un repository Docker Hub public : warpprod/rocket-ecommerce.

L’image à été envoyée dans DockerHub via la commande suivante :

docker build -t warpprod/rocket-ecommerce .&& docker push warpprod/rocket-ecommerce
[+] Building 14.4s (8/16) docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.09kB 0.0s
=> [internal] load metadata for docker.io/library/python:3.11.5 0.7s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [ 1/11] FROM docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> => resolve docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 24.75kB 0.0s
=> [ 2/11] COPY requirements.txt . 0.3s
=> [ 3/11] RUN pip install --upgrade pip 5.2s
=> [ 4/11] RUN pip install --no-cache-dir -r requirements.txt 7.8s => => # Downloading mysqlclient-2.2.0.tar.gz (89 kB) => => # Installing build dependencies: started => => # Installing build dependencies: finished with status 'done' => => # Getting requirements to build wheel: started => => # Getting requirements to build wheel: finished with status 'done' => => # Preparing metadata (pyproject.toml): started ... etc

Après avoir construit l’image, vous pouvez vérifier qu’elle est bien disponible avec la commande suivante :

docker images | grep warpprod/rocket-ecommerce

On spécifie donc l’image dans nos manifestes Kubernetes comme ceci :

image: warpprod/rocket-ecommerce:latest

Cela assure que toutes les équipes et environnements peuvent accéder à la même version de l’application.

Configuration de l'application pour MariaDB

L'application n'avait pas le connecteur de MariaDB présent dans les requirements de l'aplication, nous avons dû l'ajouter

  1. Installer le connecteur :
    Modifier le fichier requirements.txt pour ajouter la dépendance suivante :

    PyMySQL==1.1.0
  2. Migration de la database : Nous nous sommes connecté à l'un des conteurs via les commandes suivantes :

    minikube ssh
    docker ps
    docker exec -ti container_name /bin/bash

    Nous avons ensuite suivi la documentation de l'application ecommerce et tapé les commandes suivantes :

    python manage.py makemigrations
    python manage.py migrate

    Initialisation de la base de donnée

Nous avons ensuite ajouté un produit Mug dans Stripe, qui apparaît bien dans l’interface du site e-commerce :

Produit ajouté dans StripeAffichage du produit sur le site
Mug dans StripeMug sur le site

Pour valider le parcours d’achat, une transaction a été réalisée depuis le site pour acheter ce Mug. La réussite de la transaction est visible à la fois dans Stripe et sur le site e-commerce :

Transaction réussie dans StripeConfirmation sur le site e-commerce
Transaction StripePage d'achat
Achat réussi

Enfin, les informations de la commande et du produit acheté sont bien enregistrées dans la base de données, consultables via phpMyAdmin :

Commandes dans phpMyAdminProduit acheté
CommandesProduit

Vérification du nombre de réplicas

Pour garantir la haute disponibilité de l’application, le nombre de réplicas a été défini à 3 dans le manifeste Kubernetes :

spec:
replicas: 3

Cela permet d’assurer que trois pods de l’application sont toujours déployés et disponibles dans le cluster.

Partie 2 : Déploiement multi-environnements

Pour permettre l’accès aux applications à plusieurs équipes, des environnements isolés doivent être créés pour :

  • mlops
  • preprod
  • prod

L’infrastructure as code doit être déployée de façon identique dans ces trois environnements.

Déploiement multi-environnements

Trois fichiers de déploiement Kubernetes ont été créés pour isoler les environnements :

Chaque fichier contient la même structure d’infrastructure (namespace, déploiements, services, volumes, etc.), adaptée à l’environnement cible.
Cela permet à chaque équipe de travailler dans un environnement isolé, tout en garantissant la cohérence des ressources déployées.

Commande pour appliquer les environnements

k apply -f prod-deployment.yaml
k apply -f preprod-deployment.yaml
k apply -f mlops-deployment.yaml

Commande pour appliquer les modifications :

  • Apply

Vérification de l'état des déploiements :

  • Commandes de vérification

Chaque environnement dispose ainsi de ses propres ressources, assurant l’isolation et la reproductibilité des déploiements.


Partie 3 : Intégration d’une base de données

Une base de données autre que SQLite doit être déployée et connectée à l’application Stripe.

Exemple de configuration MariaDB dans prod-deployment.yaml

La documentation MariaDB sur Kubernetes de IONOS a été utilisée pour intégrer MariaDB au projet. Le fichier a été adapté pour répondre aux besoins spécifiques.

Nous avons ajouter les namespaces "prod" sur notre fichier pour faire fonctionner MariaDB et PhpMyAdmin (qui permettra à un adaministrateur de maintenir la base de données du site).

Pour voir les infos de mariadb, vous pouvez lire prod-deployment.yaml.

# Principales informations de mariadbapiVersion: v1kind: PersistentVolumemetadata:
name: mariadb-pvspec:
capacity:
storage: 10GiaccessModes:
- ReadWriteOncepersistentVolumeReclaimPolicy: RetainhostPath:
path: /mnt/data/mariadb
---
apiVersion: v1kind: PersistentVolumeClaimmetadata:
name: mariadb-pvcnamespace: prodspec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: ConfigMapmetadata:
name: mariadb-confignamespace: prodlabels:
app: mariadbdata:
my.cnf: | [mysqld] bind-address=0.0.0.0 default_storage_engine=InnoDB innodb_file_per_table=1 max_connections=1000---
apiVersion: apps/v1kind: StatefulSetmetadata:
name: mariadbnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: mariadbserviceName: mariadbtemplate:
metadata:
labels:
app: mariadbspec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORDvalue: "SuperSecurePass123"
- name: MYSQL_DATABASEvalue: "ecommerce"image: mariadb:latestname: mariadbports:
- containerPort: 3306name: mariadbvolumeMounts:
- mountPath: /var/lib/mysqlname: mariadb-storage
- mountPath: /etc/mysql/conf.dname: config-volumevolumes:
- configMap:
name: mariadb-configname: config-volumevolumeClaimTemplates:
- metadata:
name: mariadb-storagespec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: Servicemetadata:
name: mariadbnamespace: prodspec:
ports:
- port: 3306targetPort: 3306selector:
app: mariadb
# Partie pour phpmyadminapiVersion: apps/v1kind: Deploymentmetadata:
name: phpmyadminnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: phpmyadmintemplate:
metadata:
labels:
app: phpmyadminspec:
containers:
- name: phpmyadminimage: phpmyadmin/phpmyadmin:latestenv:
- name: PMA_HOSTvalue: mariadb
- name: PMA_PORTvalue: "3306"
- name: PMA_ARBITRARYvalue: "1"ports:
- containerPort: 80
---
apiVersion: v1kind: Servicemetadata:
name: phpmyadmin-servicenamespace: prodspec:
type: NodePortports:
- port: 8080targetPort: 80nodePort: 30080selector:
app: phpmyadmin
# Afficher toutes les ressources principales Kubernetes dans le namespace courant
k get all

Retour :

NAME READY AGE
statefulset.apps/mariadb 1/1 22s

Accès aux services depuis l'extérieur

Nous avions rencontré des difficultés d'usage avec mikicube port forward qui était extrêmement lent, nous l'avons donc remplacé par socat qui nous a permis de publier nos NodePorts sur l'IP Publique de notre VM avec de bien meilleures performances.

# Commande pour le site e-commerce de Prod
sudo socat TCP-LISTEN:5005,fork,reuseaddr TCP:$(minikube ip):30005
# Commande pour PhpMyAdmin de Prod
sudo socat TCP-LISTEN:8080,fork,reuseaddr TCP:$(minikube ip):30080

Conclusion

Ce projet nous a permis de mettre en pratique les principes fondamentaux de Kubernetes à travers le déploiement d'une application e-commerce et d'une stack complète. Nous avons réussi à containeriser nos services (Flask, MariaDB et PHPMyAdmin), publier une "application métier" sur Docker Hub et les orchestrer via Minikube.

About

Projet E5 SAB - Urbanisation des SI

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - CringeTM/UrbanSI: Projet E5 SAB - Urbanisation des SI · GitHub
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Projet E5 SAB - Urbanisation des SI

Ce document présente la démarche et les étapes réalisées dans le cadre du projet d’urbanisation des systèmes d’information (SI).

Groupe et Références

Partie 0 : Applications sélectionnées

  • Application Rocket Flask Stripe
  • MariaDB
  • PHPMyAdmin

Partie 1 : Mise en place de l’environnement

Choix du framework Kubernetes

Le framework sélectionné pour répondre aux critères du MVP est Minikube.

Minikube correspond à ce framework, il sera donc utilisé pour la suite du projet.

Lancement de Minikube

minikube start --listen-address=0.0.0.0 --memory=max --cpus=max --kubernetes-version=v1.35.0

Résultat de la commande minikube

Chargement de l’image Docker dans Minikube

L’image Docker n’était pas présente dans l’environnement Docker de Minikube, elle avait été construite uniquement dans le Docker local. Il a donc été nécessaire de charger l’image locale dans Minikube pour l’utiliser dans le cluster.

Avant de charger l’image

Avant de charger l’image

Avant de charger l’image

minikube image load rocket:local

Après le chargement de l’image

Après avoir fait fonctionner l’image en local, nous l’avons publiée sur Docker Hub afin que les images des applications soient accessibles depuis un repository Docker Hub.


Publication de l’image sur Docker Hub

Pour permettre le déploiement sur différents environnements et garantir l’accessibilité de l’image, celle-ci a été publiée sur un repository Docker Hub public : warpprod/rocket-ecommerce.

L’image à été envoyée dans DockerHub via la commande suivante :

docker build -t warpprod/rocket-ecommerce .&& docker push warpprod/rocket-ecommerce
[+] Building 14.4s (8/16) docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.09kB 0.0s
=> [internal] load metadata for docker.io/library/python:3.11.5 0.7s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [ 1/11] FROM docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> => resolve docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 24.75kB 0.0s
=> [ 2/11] COPY requirements.txt . 0.3s
=> [ 3/11] RUN pip install --upgrade pip 5.2s
=> [ 4/11] RUN pip install --no-cache-dir -r requirements.txt 7.8s => => # Downloading mysqlclient-2.2.0.tar.gz (89 kB) => => # Installing build dependencies: started => => # Installing build dependencies: finished with status 'done' => => # Getting requirements to build wheel: started => => # Getting requirements to build wheel: finished with status 'done' => => # Preparing metadata (pyproject.toml): started ... etc

Après avoir construit l’image, vous pouvez vérifier qu’elle est bien disponible avec la commande suivante :

docker images | grep warpprod/rocket-ecommerce

On spécifie donc l’image dans nos manifestes Kubernetes comme ceci :

image: warpprod/rocket-ecommerce:latest

Cela assure que toutes les équipes et environnements peuvent accéder à la même version de l’application.

Configuration de l'application pour MariaDB

L'application n'avait pas le connecteur de MariaDB présent dans les requirements de l'aplication, nous avons dû l'ajouter

  1. Installer le connecteur :
    Modifier le fichier requirements.txt pour ajouter la dépendance suivante :

    PyMySQL==1.1.0
  2. Migration de la database : Nous nous sommes connecté à l'un des conteurs via les commandes suivantes :

    minikube ssh
    docker ps
    docker exec -ti container_name /bin/bash

    Nous avons ensuite suivi la documentation de l'application ecommerce et tapé les commandes suivantes :

    python manage.py makemigrations
    python manage.py migrate

    Initialisation de la base de donnée

Nous avons ensuite ajouté un produit Mug dans Stripe, qui apparaît bien dans l’interface du site e-commerce :

Produit ajouté dans StripeAffichage du produit sur le site
Mug dans StripeMug sur le site

Pour valider le parcours d’achat, une transaction a été réalisée depuis le site pour acheter ce Mug. La réussite de la transaction est visible à la fois dans Stripe et sur le site e-commerce :

Transaction réussie dans StripeConfirmation sur le site e-commerce
Transaction StripePage d'achat
Achat réussi

Enfin, les informations de la commande et du produit acheté sont bien enregistrées dans la base de données, consultables via phpMyAdmin :

Commandes dans phpMyAdminProduit acheté
CommandesProduit

Vérification du nombre de réplicas

Pour garantir la haute disponibilité de l’application, le nombre de réplicas a été défini à 3 dans le manifeste Kubernetes :

spec:
replicas: 3

Cela permet d’assurer que trois pods de l’application sont toujours déployés et disponibles dans le cluster.

Partie 2 : Déploiement multi-environnements

Pour permettre l’accès aux applications à plusieurs équipes, des environnements isolés doivent être créés pour :

  • mlops
  • preprod
  • prod

L’infrastructure as code doit être déployée de façon identique dans ces trois environnements.

Déploiement multi-environnements

Trois fichiers de déploiement Kubernetes ont été créés pour isoler les environnements :

Chaque fichier contient la même structure d’infrastructure (namespace, déploiements, services, volumes, etc.), adaptée à l’environnement cible.
Cela permet à chaque équipe de travailler dans un environnement isolé, tout en garantissant la cohérence des ressources déployées.

Commande pour appliquer les environnements

k apply -f prod-deployment.yaml
k apply -f preprod-deployment.yaml
k apply -f mlops-deployment.yaml

Commande pour appliquer les modifications :

  • Apply

Vérification de l'état des déploiements :

  • Commandes de vérification

Chaque environnement dispose ainsi de ses propres ressources, assurant l’isolation et la reproductibilité des déploiements.


Partie 3 : Intégration d’une base de données

Une base de données autre que SQLite doit être déployée et connectée à l’application Stripe.

Exemple de configuration MariaDB dans prod-deployment.yaml

La documentation MariaDB sur Kubernetes de IONOS a été utilisée pour intégrer MariaDB au projet. Le fichier a été adapté pour répondre aux besoins spécifiques.

Nous avons ajouter les namespaces "prod" sur notre fichier pour faire fonctionner MariaDB et PhpMyAdmin (qui permettra à un adaministrateur de maintenir la base de données du site).

Pour voir les infos de mariadb, vous pouvez lire prod-deployment.yaml.

# Principales informations de mariadbapiVersion: v1kind: PersistentVolumemetadata:
name: mariadb-pvspec:
capacity:
storage: 10GiaccessModes:
- ReadWriteOncepersistentVolumeReclaimPolicy: RetainhostPath:
path: /mnt/data/mariadb
---
apiVersion: v1kind: PersistentVolumeClaimmetadata:
name: mariadb-pvcnamespace: prodspec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: ConfigMapmetadata:
name: mariadb-confignamespace: prodlabels:
app: mariadbdata:
my.cnf: | [mysqld] bind-address=0.0.0.0 default_storage_engine=InnoDB innodb_file_per_table=1 max_connections=1000---
apiVersion: apps/v1kind: StatefulSetmetadata:
name: mariadbnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: mariadbserviceName: mariadbtemplate:
metadata:
labels:
app: mariadbspec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORDvalue: "SuperSecurePass123"
- name: MYSQL_DATABASEvalue: "ecommerce"image: mariadb:latestname: mariadbports:
- containerPort: 3306name: mariadbvolumeMounts:
- mountPath: /var/lib/mysqlname: mariadb-storage
- mountPath: /etc/mysql/conf.dname: config-volumevolumes:
- configMap:
name: mariadb-configname: config-volumevolumeClaimTemplates:
- metadata:
name: mariadb-storagespec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: Servicemetadata:
name: mariadbnamespace: prodspec:
ports:
- port: 3306targetPort: 3306selector:
app: mariadb
# Partie pour phpmyadminapiVersion: apps/v1kind: Deploymentmetadata:
name: phpmyadminnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: phpmyadmintemplate:
metadata:
labels:
app: phpmyadminspec:
containers:
- name: phpmyadminimage: phpmyadmin/phpmyadmin:latestenv:
- name: PMA_HOSTvalue: mariadb
- name: PMA_PORTvalue: "3306"
- name: PMA_ARBITRARYvalue: "1"ports:
- containerPort: 80
---
apiVersion: v1kind: Servicemetadata:
name: phpmyadmin-servicenamespace: prodspec:
type: NodePortports:
- port: 8080targetPort: 80nodePort: 30080selector:
app: phpmyadmin
# Afficher toutes les ressources principales Kubernetes dans le namespace courant
k get all

Retour :

NAME READY AGE
statefulset.apps/mariadb 1/1 22s

Accès aux services depuis l'extérieur

Nous avions rencontré des difficultés d'usage avec mikicube port forward qui était extrêmement lent, nous l'avons donc remplacé par socat qui nous a permis de publier nos NodePorts sur l'IP Publique de notre VM avec de bien meilleures performances.

# Commande pour le site e-commerce de Prod
sudo socat TCP-LISTEN:5005,fork,reuseaddr TCP:$(minikube ip):30005
# Commande pour PhpMyAdmin de Prod
sudo socat TCP-LISTEN:8080,fork,reuseaddr TCP:$(minikube ip):30080

Conclusion

Ce projet nous a permis de mettre en pratique les principes fondamentaux de Kubernetes à travers le déploiement d'une application e-commerce et d'une stack complète. Nous avons réussi à containeriser nos services (Flask, MariaDB et PHPMyAdmin), publier une "application métier" sur Docker Hub et les orchestrer via Minikube.

About

Projet E5 SAB - Urbanisation des SI

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - CringeTM/UrbanSI: Projet E5 SAB - Urbanisation des SI · GitHub
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Projet E5 SAB - Urbanisation des SI

Ce document présente la démarche et les étapes réalisées dans le cadre du projet d’urbanisation des systèmes d’information (SI).

Groupe et Références

Partie 0 : Applications sélectionnées

  • Application Rocket Flask Stripe
  • MariaDB
  • PHPMyAdmin

Partie 1 : Mise en place de l’environnement

Choix du framework Kubernetes

Le framework sélectionné pour répondre aux critères du MVP est Minikube.

Minikube correspond à ce framework, il sera donc utilisé pour la suite du projet.

Lancement de Minikube

minikube start --listen-address=0.0.0.0 --memory=max --cpus=max --kubernetes-version=v1.35.0

Résultat de la commande minikube

Chargement de l’image Docker dans Minikube

L’image Docker n’était pas présente dans l’environnement Docker de Minikube, elle avait été construite uniquement dans le Docker local. Il a donc été nécessaire de charger l’image locale dans Minikube pour l’utiliser dans le cluster.

Avant de charger l’image

Avant de charger l’image

Avant de charger l’image

minikube image load rocket:local

Après le chargement de l’image

Après avoir fait fonctionner l’image en local, nous l’avons publiée sur Docker Hub afin que les images des applications soient accessibles depuis un repository Docker Hub.


Publication de l’image sur Docker Hub

Pour permettre le déploiement sur différents environnements et garantir l’accessibilité de l’image, celle-ci a été publiée sur un repository Docker Hub public : warpprod/rocket-ecommerce.

L’image à été envoyée dans DockerHub via la commande suivante :

docker build -t warpprod/rocket-ecommerce .&& docker push warpprod/rocket-ecommerce
[+] Building 14.4s (8/16) docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.09kB 0.0s
=> [internal] load metadata for docker.io/library/python:3.11.5 0.7s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [ 1/11] FROM docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> => resolve docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 24.75kB 0.0s
=> [ 2/11] COPY requirements.txt . 0.3s
=> [ 3/11] RUN pip install --upgrade pip 5.2s
=> [ 4/11] RUN pip install --no-cache-dir -r requirements.txt 7.8s => => # Downloading mysqlclient-2.2.0.tar.gz (89 kB) => => # Installing build dependencies: started => => # Installing build dependencies: finished with status 'done' => => # Getting requirements to build wheel: started => => # Getting requirements to build wheel: finished with status 'done' => => # Preparing metadata (pyproject.toml): started ... etc

Après avoir construit l’image, vous pouvez vérifier qu’elle est bien disponible avec la commande suivante :

docker images | grep warpprod/rocket-ecommerce

On spécifie donc l’image dans nos manifestes Kubernetes comme ceci :

image: warpprod/rocket-ecommerce:latest

Cela assure que toutes les équipes et environnements peuvent accéder à la même version de l’application.

Configuration de l'application pour MariaDB

L'application n'avait pas le connecteur de MariaDB présent dans les requirements de l'aplication, nous avons dû l'ajouter

  1. Installer le connecteur :
    Modifier le fichier requirements.txt pour ajouter la dépendance suivante :

    PyMySQL==1.1.0
  2. Migration de la database : Nous nous sommes connecté à l'un des conteurs via les commandes suivantes :

    minikube ssh
    docker ps
    docker exec -ti container_name /bin/bash

    Nous avons ensuite suivi la documentation de l'application ecommerce et tapé les commandes suivantes :

    python manage.py makemigrations
    python manage.py migrate

    Initialisation de la base de donnée

Nous avons ensuite ajouté un produit Mug dans Stripe, qui apparaît bien dans l’interface du site e-commerce :

Produit ajouté dans StripeAffichage du produit sur le site
Mug dans StripeMug sur le site

Pour valider le parcours d’achat, une transaction a été réalisée depuis le site pour acheter ce Mug. La réussite de la transaction est visible à la fois dans Stripe et sur le site e-commerce :

Transaction réussie dans StripeConfirmation sur le site e-commerce
Transaction StripePage d'achat
Achat réussi

Enfin, les informations de la commande et du produit acheté sont bien enregistrées dans la base de données, consultables via phpMyAdmin :

Commandes dans phpMyAdminProduit acheté
CommandesProduit

Vérification du nombre de réplicas

Pour garantir la haute disponibilité de l’application, le nombre de réplicas a été défini à 3 dans le manifeste Kubernetes :

spec:
replicas: 3

Cela permet d’assurer que trois pods de l’application sont toujours déployés et disponibles dans le cluster.

Partie 2 : Déploiement multi-environnements

Pour permettre l’accès aux applications à plusieurs équipes, des environnements isolés doivent être créés pour :

  • mlops
  • preprod
  • prod

L’infrastructure as code doit être déployée de façon identique dans ces trois environnements.

Déploiement multi-environnements

Trois fichiers de déploiement Kubernetes ont été créés pour isoler les environnements :

Chaque fichier contient la même structure d’infrastructure (namespace, déploiements, services, volumes, etc.), adaptée à l’environnement cible.
Cela permet à chaque équipe de travailler dans un environnement isolé, tout en garantissant la cohérence des ressources déployées.

Commande pour appliquer les environnements

k apply -f prod-deployment.yaml
k apply -f preprod-deployment.yaml
k apply -f mlops-deployment.yaml

Commande pour appliquer les modifications :

  • Apply

Vérification de l'état des déploiements :

  • Commandes de vérification

Chaque environnement dispose ainsi de ses propres ressources, assurant l’isolation et la reproductibilité des déploiements.


Partie 3 : Intégration d’une base de données

Une base de données autre que SQLite doit être déployée et connectée à l’application Stripe.

Exemple de configuration MariaDB dans prod-deployment.yaml

La documentation MariaDB sur Kubernetes de IONOS a été utilisée pour intégrer MariaDB au projet. Le fichier a été adapté pour répondre aux besoins spécifiques.

Nous avons ajouter les namespaces "prod" sur notre fichier pour faire fonctionner MariaDB et PhpMyAdmin (qui permettra à un adaministrateur de maintenir la base de données du site).

Pour voir les infos de mariadb, vous pouvez lire prod-deployment.yaml.

# Principales informations de mariadbapiVersion: v1kind: PersistentVolumemetadata:
name: mariadb-pvspec:
capacity:
storage: 10GiaccessModes:
- ReadWriteOncepersistentVolumeReclaimPolicy: RetainhostPath:
path: /mnt/data/mariadb
---
apiVersion: v1kind: PersistentVolumeClaimmetadata:
name: mariadb-pvcnamespace: prodspec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: ConfigMapmetadata:
name: mariadb-confignamespace: prodlabels:
app: mariadbdata:
my.cnf: | [mysqld] bind-address=0.0.0.0 default_storage_engine=InnoDB innodb_file_per_table=1 max_connections=1000---
apiVersion: apps/v1kind: StatefulSetmetadata:
name: mariadbnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: mariadbserviceName: mariadbtemplate:
metadata:
labels:
app: mariadbspec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORDvalue: "SuperSecurePass123"
- name: MYSQL_DATABASEvalue: "ecommerce"image: mariadb:latestname: mariadbports:
- containerPort: 3306name: mariadbvolumeMounts:
- mountPath: /var/lib/mysqlname: mariadb-storage
- mountPath: /etc/mysql/conf.dname: config-volumevolumes:
- configMap:
name: mariadb-configname: config-volumevolumeClaimTemplates:
- metadata:
name: mariadb-storagespec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: Servicemetadata:
name: mariadbnamespace: prodspec:
ports:
- port: 3306targetPort: 3306selector:
app: mariadb
# Partie pour phpmyadminapiVersion: apps/v1kind: Deploymentmetadata:
name: phpmyadminnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: phpmyadmintemplate:
metadata:
labels:
app: phpmyadminspec:
containers:
- name: phpmyadminimage: phpmyadmin/phpmyadmin:latestenv:
- name: PMA_HOSTvalue: mariadb
- name: PMA_PORTvalue: "3306"
- name: PMA_ARBITRARYvalue: "1"ports:
- containerPort: 80
---
apiVersion: v1kind: Servicemetadata:
name: phpmyadmin-servicenamespace: prodspec:
type: NodePortports:
- port: 8080targetPort: 80nodePort: 30080selector:
app: phpmyadmin
# Afficher toutes les ressources principales Kubernetes dans le namespace courant
k get all

Retour :

NAME READY AGE
statefulset.apps/mariadb 1/1 22s

Accès aux services depuis l'extérieur

Nous avions rencontré des difficultés d'usage avec mikicube port forward qui était extrêmement lent, nous l'avons donc remplacé par socat qui nous a permis de publier nos NodePorts sur l'IP Publique de notre VM avec de bien meilleures performances.

# Commande pour le site e-commerce de Prod
sudo socat TCP-LISTEN:5005,fork,reuseaddr TCP:$(minikube ip):30005
# Commande pour PhpMyAdmin de Prod
sudo socat TCP-LISTEN:8080,fork,reuseaddr TCP:$(minikube ip):30080

Conclusion

Ce projet nous a permis de mettre en pratique les principes fondamentaux de Kubernetes à travers le déploiement d'une application e-commerce et d'une stack complète. Nous avons réussi à containeriser nos services (Flask, MariaDB et PHPMyAdmin), publier une "application métier" sur Docker Hub et les orchestrer via Minikube.

About

Projet E5 SAB - Urbanisation des SI

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - CringeTM/UrbanSI: Projet E5 SAB - Urbanisation des SI · GitHub
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Projet E5 SAB - Urbanisation des SI

Ce document présente la démarche et les étapes réalisées dans le cadre du projet d’urbanisation des systèmes d’information (SI).

Groupe et Références

Partie 0 : Applications sélectionnées

  • Application Rocket Flask Stripe
  • MariaDB
  • PHPMyAdmin

Partie 1 : Mise en place de l’environnement

Choix du framework Kubernetes

Le framework sélectionné pour répondre aux critères du MVP est Minikube.

Minikube correspond à ce framework, il sera donc utilisé pour la suite du projet.

Lancement de Minikube

minikube start --listen-address=0.0.0.0 --memory=max --cpus=max --kubernetes-version=v1.35.0

Résultat de la commande minikube

Chargement de l’image Docker dans Minikube

L’image Docker n’était pas présente dans l’environnement Docker de Minikube, elle avait été construite uniquement dans le Docker local. Il a donc été nécessaire de charger l’image locale dans Minikube pour l’utiliser dans le cluster.

Avant de charger l’image

Avant de charger l’image

Avant de charger l’image

minikube image load rocket:local

Après le chargement de l’image

Après avoir fait fonctionner l’image en local, nous l’avons publiée sur Docker Hub afin que les images des applications soient accessibles depuis un repository Docker Hub.


Publication de l’image sur Docker Hub

Pour permettre le déploiement sur différents environnements et garantir l’accessibilité de l’image, celle-ci a été publiée sur un repository Docker Hub public : warpprod/rocket-ecommerce.

L’image à été envoyée dans DockerHub via la commande suivante :

docker build -t warpprod/rocket-ecommerce .&& docker push warpprod/rocket-ecommerce
[+] Building 14.4s (8/16) docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.09kB 0.0s
=> [internal] load metadata for docker.io/library/python:3.11.5 0.7s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [ 1/11] FROM docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> => resolve docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 24.75kB 0.0s
=> [ 2/11] COPY requirements.txt . 0.3s
=> [ 3/11] RUN pip install --upgrade pip 5.2s
=> [ 4/11] RUN pip install --no-cache-dir -r requirements.txt 7.8s => => # Downloading mysqlclient-2.2.0.tar.gz (89 kB) => => # Installing build dependencies: started => => # Installing build dependencies: finished with status 'done' => => # Getting requirements to build wheel: started => => # Getting requirements to build wheel: finished with status 'done' => => # Preparing metadata (pyproject.toml): started ... etc

Après avoir construit l’image, vous pouvez vérifier qu’elle est bien disponible avec la commande suivante :

docker images | grep warpprod/rocket-ecommerce

On spécifie donc l’image dans nos manifestes Kubernetes comme ceci :

image: warpprod/rocket-ecommerce:latest

Cela assure que toutes les équipes et environnements peuvent accéder à la même version de l’application.

Configuration de l'application pour MariaDB

L'application n'avait pas le connecteur de MariaDB présent dans les requirements de l'aplication, nous avons dû l'ajouter

  1. Installer le connecteur :
    Modifier le fichier requirements.txt pour ajouter la dépendance suivante :

    PyMySQL==1.1.0
  2. Migration de la database : Nous nous sommes connecté à l'un des conteurs via les commandes suivantes :

    minikube ssh
    docker ps
    docker exec -ti container_name /bin/bash

    Nous avons ensuite suivi la documentation de l'application ecommerce et tapé les commandes suivantes :

    python manage.py makemigrations
    python manage.py migrate

    Initialisation de la base de donnée

Nous avons ensuite ajouté un produit Mug dans Stripe, qui apparaît bien dans l’interface du site e-commerce :

Produit ajouté dans StripeAffichage du produit sur le site
Mug dans StripeMug sur le site

Pour valider le parcours d’achat, une transaction a été réalisée depuis le site pour acheter ce Mug. La réussite de la transaction est visible à la fois dans Stripe et sur le site e-commerce :

Transaction réussie dans StripeConfirmation sur le site e-commerce
Transaction StripePage d'achat
Achat réussi

Enfin, les informations de la commande et du produit acheté sont bien enregistrées dans la base de données, consultables via phpMyAdmin :

Commandes dans phpMyAdminProduit acheté
CommandesProduit

Vérification du nombre de réplicas

Pour garantir la haute disponibilité de l’application, le nombre de réplicas a été défini à 3 dans le manifeste Kubernetes :

spec:
replicas: 3

Cela permet d’assurer que trois pods de l’application sont toujours déployés et disponibles dans le cluster.

Partie 2 : Déploiement multi-environnements

Pour permettre l’accès aux applications à plusieurs équipes, des environnements isolés doivent être créés pour :

  • mlops
  • preprod
  • prod

L’infrastructure as code doit être déployée de façon identique dans ces trois environnements.

Déploiement multi-environnements

Trois fichiers de déploiement Kubernetes ont été créés pour isoler les environnements :

Chaque fichier contient la même structure d’infrastructure (namespace, déploiements, services, volumes, etc.), adaptée à l’environnement cible.
Cela permet à chaque équipe de travailler dans un environnement isolé, tout en garantissant la cohérence des ressources déployées.

Commande pour appliquer les environnements

k apply -f prod-deployment.yaml
k apply -f preprod-deployment.yaml
k apply -f mlops-deployment.yaml

Commande pour appliquer les modifications :

  • Apply

Vérification de l'état des déploiements :

  • Commandes de vérification

Chaque environnement dispose ainsi de ses propres ressources, assurant l’isolation et la reproductibilité des déploiements.


Partie 3 : Intégration d’une base de données

Une base de données autre que SQLite doit être déployée et connectée à l’application Stripe.

Exemple de configuration MariaDB dans prod-deployment.yaml

La documentation MariaDB sur Kubernetes de IONOS a été utilisée pour intégrer MariaDB au projet. Le fichier a été adapté pour répondre aux besoins spécifiques.

Nous avons ajouter les namespaces "prod" sur notre fichier pour faire fonctionner MariaDB et PhpMyAdmin (qui permettra à un adaministrateur de maintenir la base de données du site).

Pour voir les infos de mariadb, vous pouvez lire prod-deployment.yaml.

# Principales informations de mariadbapiVersion: v1kind: PersistentVolumemetadata:
name: mariadb-pvspec:
capacity:
storage: 10GiaccessModes:
- ReadWriteOncepersistentVolumeReclaimPolicy: RetainhostPath:
path: /mnt/data/mariadb
---
apiVersion: v1kind: PersistentVolumeClaimmetadata:
name: mariadb-pvcnamespace: prodspec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: ConfigMapmetadata:
name: mariadb-confignamespace: prodlabels:
app: mariadbdata:
my.cnf: | [mysqld] bind-address=0.0.0.0 default_storage_engine=InnoDB innodb_file_per_table=1 max_connections=1000---
apiVersion: apps/v1kind: StatefulSetmetadata:
name: mariadbnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: mariadbserviceName: mariadbtemplate:
metadata:
labels:
app: mariadbspec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORDvalue: "SuperSecurePass123"
- name: MYSQL_DATABASEvalue: "ecommerce"image: mariadb:latestname: mariadbports:
- containerPort: 3306name: mariadbvolumeMounts:
- mountPath: /var/lib/mysqlname: mariadb-storage
- mountPath: /etc/mysql/conf.dname: config-volumevolumes:
- configMap:
name: mariadb-configname: config-volumevolumeClaimTemplates:
- metadata:
name: mariadb-storagespec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: Servicemetadata:
name: mariadbnamespace: prodspec:
ports:
- port: 3306targetPort: 3306selector:
app: mariadb
# Partie pour phpmyadminapiVersion: apps/v1kind: Deploymentmetadata:
name: phpmyadminnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: phpmyadmintemplate:
metadata:
labels:
app: phpmyadminspec:
containers:
- name: phpmyadminimage: phpmyadmin/phpmyadmin:latestenv:
- name: PMA_HOSTvalue: mariadb
- name: PMA_PORTvalue: "3306"
- name: PMA_ARBITRARYvalue: "1"ports:
- containerPort: 80
---
apiVersion: v1kind: Servicemetadata:
name: phpmyadmin-servicenamespace: prodspec:
type: NodePortports:
- port: 8080targetPort: 80nodePort: 30080selector:
app: phpmyadmin
# Afficher toutes les ressources principales Kubernetes dans le namespace courant
k get all

Retour :

NAME READY AGE
statefulset.apps/mariadb 1/1 22s

Accès aux services depuis l'extérieur

Nous avions rencontré des difficultés d'usage avec mikicube port forward qui était extrêmement lent, nous l'avons donc remplacé par socat qui nous a permis de publier nos NodePorts sur l'IP Publique de notre VM avec de bien meilleures performances.

# Commande pour le site e-commerce de Prod
sudo socat TCP-LISTEN:5005,fork,reuseaddr TCP:$(minikube ip):30005
# Commande pour PhpMyAdmin de Prod
sudo socat TCP-LISTEN:8080,fork,reuseaddr TCP:$(minikube ip):30080

Conclusion

Ce projet nous a permis de mettre en pratique les principes fondamentaux de Kubernetes à travers le déploiement d'une application e-commerce et d'une stack complète. Nous avons réussi à containeriser nos services (Flask, MariaDB et PHPMyAdmin), publier une "application métier" sur Docker Hub et les orchestrer via Minikube.

About

Projet E5 SAB - Urbanisation des SI

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - CringeTM/UrbanSI: Projet E5 SAB - Urbanisation des SI · GitHub
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Projet E5 SAB - Urbanisation des SI

Ce document présente la démarche et les étapes réalisées dans le cadre du projet d’urbanisation des systèmes d’information (SI).

Groupe et Références

Partie 0 : Applications sélectionnées

  • Application Rocket Flask Stripe
  • MariaDB
  • PHPMyAdmin

Partie 1 : Mise en place de l’environnement

Choix du framework Kubernetes

Le framework sélectionné pour répondre aux critères du MVP est Minikube.

Minikube correspond à ce framework, il sera donc utilisé pour la suite du projet.

Lancement de Minikube

minikube start --listen-address=0.0.0.0 --memory=max --cpus=max --kubernetes-version=v1.35.0

Résultat de la commande minikube

Chargement de l’image Docker dans Minikube

L’image Docker n’était pas présente dans l’environnement Docker de Minikube, elle avait été construite uniquement dans le Docker local. Il a donc été nécessaire de charger l’image locale dans Minikube pour l’utiliser dans le cluster.

Avant de charger l’image

Avant de charger l’image

Avant de charger l’image

minikube image load rocket:local

Après le chargement de l’image

Après avoir fait fonctionner l’image en local, nous l’avons publiée sur Docker Hub afin que les images des applications soient accessibles depuis un repository Docker Hub.


Publication de l’image sur Docker Hub

Pour permettre le déploiement sur différents environnements et garantir l’accessibilité de l’image, celle-ci a été publiée sur un repository Docker Hub public : warpprod/rocket-ecommerce.

L’image à été envoyée dans DockerHub via la commande suivante :

docker build -t warpprod/rocket-ecommerce .&& docker push warpprod/rocket-ecommerce
[+] Building 14.4s (8/16) docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.09kB 0.0s
=> [internal] load metadata for docker.io/library/python:3.11.5 0.7s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [ 1/11] FROM docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> => resolve docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 24.75kB 0.0s
=> [ 2/11] COPY requirements.txt . 0.3s
=> [ 3/11] RUN pip install --upgrade pip 5.2s
=> [ 4/11] RUN pip install --no-cache-dir -r requirements.txt 7.8s => => # Downloading mysqlclient-2.2.0.tar.gz (89 kB) => => # Installing build dependencies: started => => # Installing build dependencies: finished with status 'done' => => # Getting requirements to build wheel: started => => # Getting requirements to build wheel: finished with status 'done' => => # Preparing metadata (pyproject.toml): started ... etc

Après avoir construit l’image, vous pouvez vérifier qu’elle est bien disponible avec la commande suivante :

docker images | grep warpprod/rocket-ecommerce

On spécifie donc l’image dans nos manifestes Kubernetes comme ceci :

image: warpprod/rocket-ecommerce:latest

Cela assure que toutes les équipes et environnements peuvent accéder à la même version de l’application.

Configuration de l'application pour MariaDB

L'application n'avait pas le connecteur de MariaDB présent dans les requirements de l'aplication, nous avons dû l'ajouter

  1. Installer le connecteur :
    Modifier le fichier requirements.txt pour ajouter la dépendance suivante :

    PyMySQL==1.1.0
  2. Migration de la database : Nous nous sommes connecté à l'un des conteurs via les commandes suivantes :

    minikube ssh
    docker ps
    docker exec -ti container_name /bin/bash

    Nous avons ensuite suivi la documentation de l'application ecommerce et tapé les commandes suivantes :

    python manage.py makemigrations
    python manage.py migrate

    Initialisation de la base de donnée

Nous avons ensuite ajouté un produit Mug dans Stripe, qui apparaît bien dans l’interface du site e-commerce :

Produit ajouté dans StripeAffichage du produit sur le site
Mug dans StripeMug sur le site

Pour valider le parcours d’achat, une transaction a été réalisée depuis le site pour acheter ce Mug. La réussite de la transaction est visible à la fois dans Stripe et sur le site e-commerce :

Transaction réussie dans StripeConfirmation sur le site e-commerce
Transaction StripePage d'achat
Achat réussi

Enfin, les informations de la commande et du produit acheté sont bien enregistrées dans la base de données, consultables via phpMyAdmin :

Commandes dans phpMyAdminProduit acheté
CommandesProduit

Vérification du nombre de réplicas

Pour garantir la haute disponibilité de l’application, le nombre de réplicas a été défini à 3 dans le manifeste Kubernetes :

spec:
replicas: 3

Cela permet d’assurer que trois pods de l’application sont toujours déployés et disponibles dans le cluster.

Partie 2 : Déploiement multi-environnements

Pour permettre l’accès aux applications à plusieurs équipes, des environnements isolés doivent être créés pour :

  • mlops
  • preprod
  • prod

L’infrastructure as code doit être déployée de façon identique dans ces trois environnements.

Déploiement multi-environnements

Trois fichiers de déploiement Kubernetes ont été créés pour isoler les environnements :

Chaque fichier contient la même structure d’infrastructure (namespace, déploiements, services, volumes, etc.), adaptée à l’environnement cible.
Cela permet à chaque équipe de travailler dans un environnement isolé, tout en garantissant la cohérence des ressources déployées.

Commande pour appliquer les environnements

k apply -f prod-deployment.yaml
k apply -f preprod-deployment.yaml
k apply -f mlops-deployment.yaml

Commande pour appliquer les modifications :

  • Apply

Vérification de l'état des déploiements :

  • Commandes de vérification

Chaque environnement dispose ainsi de ses propres ressources, assurant l’isolation et la reproductibilité des déploiements.


Partie 3 : Intégration d’une base de données

Une base de données autre que SQLite doit être déployée et connectée à l’application Stripe.

Exemple de configuration MariaDB dans prod-deployment.yaml

La documentation MariaDB sur Kubernetes de IONOS a été utilisée pour intégrer MariaDB au projet. Le fichier a été adapté pour répondre aux besoins spécifiques.

Nous avons ajouter les namespaces "prod" sur notre fichier pour faire fonctionner MariaDB et PhpMyAdmin (qui permettra à un adaministrateur de maintenir la base de données du site).

Pour voir les infos de mariadb, vous pouvez lire prod-deployment.yaml.

# Principales informations de mariadbapiVersion: v1kind: PersistentVolumemetadata:
name: mariadb-pvspec:
capacity:
storage: 10GiaccessModes:
- ReadWriteOncepersistentVolumeReclaimPolicy: RetainhostPath:
path: /mnt/data/mariadb
---
apiVersion: v1kind: PersistentVolumeClaimmetadata:
name: mariadb-pvcnamespace: prodspec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: ConfigMapmetadata:
name: mariadb-confignamespace: prodlabels:
app: mariadbdata:
my.cnf: | [mysqld] bind-address=0.0.0.0 default_storage_engine=InnoDB innodb_file_per_table=1 max_connections=1000---
apiVersion: apps/v1kind: StatefulSetmetadata:
name: mariadbnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: mariadbserviceName: mariadbtemplate:
metadata:
labels:
app: mariadbspec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORDvalue: "SuperSecurePass123"
- name: MYSQL_DATABASEvalue: "ecommerce"image: mariadb:latestname: mariadbports:
- containerPort: 3306name: mariadbvolumeMounts:
- mountPath: /var/lib/mysqlname: mariadb-storage
- mountPath: /etc/mysql/conf.dname: config-volumevolumes:
- configMap:
name: mariadb-configname: config-volumevolumeClaimTemplates:
- metadata:
name: mariadb-storagespec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: Servicemetadata:
name: mariadbnamespace: prodspec:
ports:
- port: 3306targetPort: 3306selector:
app: mariadb
# Partie pour phpmyadminapiVersion: apps/v1kind: Deploymentmetadata:
name: phpmyadminnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: phpmyadmintemplate:
metadata:
labels:
app: phpmyadminspec:
containers:
- name: phpmyadminimage: phpmyadmin/phpmyadmin:latestenv:
- name: PMA_HOSTvalue: mariadb
- name: PMA_PORTvalue: "3306"
- name: PMA_ARBITRARYvalue: "1"ports:
- containerPort: 80
---
apiVersion: v1kind: Servicemetadata:
name: phpmyadmin-servicenamespace: prodspec:
type: NodePortports:
- port: 8080targetPort: 80nodePort: 30080selector:
app: phpmyadmin
# Afficher toutes les ressources principales Kubernetes dans le namespace courant
k get all

Retour :

NAME READY AGE
statefulset.apps/mariadb 1/1 22s

Accès aux services depuis l'extérieur

Nous avions rencontré des difficultés d'usage avec mikicube port forward qui était extrêmement lent, nous l'avons donc remplacé par socat qui nous a permis de publier nos NodePorts sur l'IP Publique de notre VM avec de bien meilleures performances.

# Commande pour le site e-commerce de Prod
sudo socat TCP-LISTEN:5005,fork,reuseaddr TCP:$(minikube ip):30005
# Commande pour PhpMyAdmin de Prod
sudo socat TCP-LISTEN:8080,fork,reuseaddr TCP:$(minikube ip):30080

Conclusion

Ce projet nous a permis de mettre en pratique les principes fondamentaux de Kubernetes à travers le déploiement d'une application e-commerce et d'une stack complète. Nous avons réussi à containeriser nos services (Flask, MariaDB et PHPMyAdmin), publier une "application métier" sur Docker Hub et les orchestrer via Minikube.

About

Projet E5 SAB - Urbanisation des SI

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - CringeTM/UrbanSI: Projet E5 SAB - Urbanisation des SI · GitHub
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Projet E5 SAB - Urbanisation des SI

Ce document présente la démarche et les étapes réalisées dans le cadre du projet d’urbanisation des systèmes d’information (SI).

Groupe et Références

Partie 0 : Applications sélectionnées

  • Application Rocket Flask Stripe
  • MariaDB
  • PHPMyAdmin

Partie 1 : Mise en place de l’environnement

Choix du framework Kubernetes

Le framework sélectionné pour répondre aux critères du MVP est Minikube.

Minikube correspond à ce framework, il sera donc utilisé pour la suite du projet.

Lancement de Minikube

minikube start --listen-address=0.0.0.0 --memory=max --cpus=max --kubernetes-version=v1.35.0

Résultat de la commande minikube

Chargement de l’image Docker dans Minikube

L’image Docker n’était pas présente dans l’environnement Docker de Minikube, elle avait été construite uniquement dans le Docker local. Il a donc été nécessaire de charger l’image locale dans Minikube pour l’utiliser dans le cluster.

Avant de charger l’image

Avant de charger l’image

Avant de charger l’image

minikube image load rocket:local

Après le chargement de l’image

Après avoir fait fonctionner l’image en local, nous l’avons publiée sur Docker Hub afin que les images des applications soient accessibles depuis un repository Docker Hub.


Publication de l’image sur Docker Hub

Pour permettre le déploiement sur différents environnements et garantir l’accessibilité de l’image, celle-ci a été publiée sur un repository Docker Hub public : warpprod/rocket-ecommerce.

L’image à été envoyée dans DockerHub via la commande suivante :

docker build -t warpprod/rocket-ecommerce .&& docker push warpprod/rocket-ecommerce
[+] Building 14.4s (8/16) docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.09kB 0.0s
=> [internal] load metadata for docker.io/library/python:3.11.5 0.7s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [ 1/11] FROM docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> => resolve docker.io/library/python:3.11.5@sha256:2e376990a11f1c1e03796d08db0e99c36eadb4bb6491372b227f1e53c3482914 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 24.75kB 0.0s
=> [ 2/11] COPY requirements.txt . 0.3s
=> [ 3/11] RUN pip install --upgrade pip 5.2s
=> [ 4/11] RUN pip install --no-cache-dir -r requirements.txt 7.8s => => # Downloading mysqlclient-2.2.0.tar.gz (89 kB) => => # Installing build dependencies: started => => # Installing build dependencies: finished with status 'done' => => # Getting requirements to build wheel: started => => # Getting requirements to build wheel: finished with status 'done' => => # Preparing metadata (pyproject.toml): started ... etc

Après avoir construit l’image, vous pouvez vérifier qu’elle est bien disponible avec la commande suivante :

docker images | grep warpprod/rocket-ecommerce

On spécifie donc l’image dans nos manifestes Kubernetes comme ceci :

image: warpprod/rocket-ecommerce:latest

Cela assure que toutes les équipes et environnements peuvent accéder à la même version de l’application.

Configuration de l'application pour MariaDB

L'application n'avait pas le connecteur de MariaDB présent dans les requirements de l'aplication, nous avons dû l'ajouter

  1. Installer le connecteur :
    Modifier le fichier requirements.txt pour ajouter la dépendance suivante :

    PyMySQL==1.1.0
  2. Migration de la database : Nous nous sommes connecté à l'un des conteurs via les commandes suivantes :

    minikube ssh
    docker ps
    docker exec -ti container_name /bin/bash

    Nous avons ensuite suivi la documentation de l'application ecommerce et tapé les commandes suivantes :

    python manage.py makemigrations
    python manage.py migrate

    Initialisation de la base de donnée

Nous avons ensuite ajouté un produit Mug dans Stripe, qui apparaît bien dans l’interface du site e-commerce :

Produit ajouté dans StripeAffichage du produit sur le site
Mug dans StripeMug sur le site

Pour valider le parcours d’achat, une transaction a été réalisée depuis le site pour acheter ce Mug. La réussite de la transaction est visible à la fois dans Stripe et sur le site e-commerce :

Transaction réussie dans StripeConfirmation sur le site e-commerce
Transaction StripePage d'achat
Achat réussi

Enfin, les informations de la commande et du produit acheté sont bien enregistrées dans la base de données, consultables via phpMyAdmin :

Commandes dans phpMyAdminProduit acheté
CommandesProduit

Vérification du nombre de réplicas

Pour garantir la haute disponibilité de l’application, le nombre de réplicas a été défini à 3 dans le manifeste Kubernetes :

spec:
replicas: 3

Cela permet d’assurer que trois pods de l’application sont toujours déployés et disponibles dans le cluster.

Partie 2 : Déploiement multi-environnements

Pour permettre l’accès aux applications à plusieurs équipes, des environnements isolés doivent être créés pour :

  • mlops
  • preprod
  • prod

L’infrastructure as code doit être déployée de façon identique dans ces trois environnements.

Déploiement multi-environnements

Trois fichiers de déploiement Kubernetes ont été créés pour isoler les environnements :

Chaque fichier contient la même structure d’infrastructure (namespace, déploiements, services, volumes, etc.), adaptée à l’environnement cible.
Cela permet à chaque équipe de travailler dans un environnement isolé, tout en garantissant la cohérence des ressources déployées.

Commande pour appliquer les environnements

k apply -f prod-deployment.yaml
k apply -f preprod-deployment.yaml
k apply -f mlops-deployment.yaml

Commande pour appliquer les modifications :

  • Apply

Vérification de l'état des déploiements :

  • Commandes de vérification

Chaque environnement dispose ainsi de ses propres ressources, assurant l’isolation et la reproductibilité des déploiements.


Partie 3 : Intégration d’une base de données

Une base de données autre que SQLite doit être déployée et connectée à l’application Stripe.

Exemple de configuration MariaDB dans prod-deployment.yaml

La documentation MariaDB sur Kubernetes de IONOS a été utilisée pour intégrer MariaDB au projet. Le fichier a été adapté pour répondre aux besoins spécifiques.

Nous avons ajouter les namespaces "prod" sur notre fichier pour faire fonctionner MariaDB et PhpMyAdmin (qui permettra à un adaministrateur de maintenir la base de données du site).

Pour voir les infos de mariadb, vous pouvez lire prod-deployment.yaml.

# Principales informations de mariadbapiVersion: v1kind: PersistentVolumemetadata:
name: mariadb-pvspec:
capacity:
storage: 10GiaccessModes:
- ReadWriteOncepersistentVolumeReclaimPolicy: RetainhostPath:
path: /mnt/data/mariadb
---
apiVersion: v1kind: PersistentVolumeClaimmetadata:
name: mariadb-pvcnamespace: prodspec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: ConfigMapmetadata:
name: mariadb-confignamespace: prodlabels:
app: mariadbdata:
my.cnf: | [mysqld] bind-address=0.0.0.0 default_storage_engine=InnoDB innodb_file_per_table=1 max_connections=1000---
apiVersion: apps/v1kind: StatefulSetmetadata:
name: mariadbnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: mariadbserviceName: mariadbtemplate:
metadata:
labels:
app: mariadbspec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORDvalue: "SuperSecurePass123"
- name: MYSQL_DATABASEvalue: "ecommerce"image: mariadb:latestname: mariadbports:
- containerPort: 3306name: mariadbvolumeMounts:
- mountPath: /var/lib/mysqlname: mariadb-storage
- mountPath: /etc/mysql/conf.dname: config-volumevolumes:
- configMap:
name: mariadb-configname: config-volumevolumeClaimTemplates:
- metadata:
name: mariadb-storagespec:
accessModes:
- ReadWriteOnceresources:
requests:
storage: 10Gi
---
apiVersion: v1kind: Servicemetadata:
name: mariadbnamespace: prodspec:
ports:
- port: 3306targetPort: 3306selector:
app: mariadb
# Partie pour phpmyadminapiVersion: apps/v1kind: Deploymentmetadata:
name: phpmyadminnamespace: prodspec:
replicas: 3selector:
matchLabels:
app: phpmyadmintemplate:
metadata:
labels:
app: phpmyadminspec:
containers:
- name: phpmyadminimage: phpmyadmin/phpmyadmin:latestenv:
- name: PMA_HOSTvalue: mariadb
- name: PMA_PORTvalue: "3306"
- name: PMA_ARBITRARYvalue: "1"ports:
- containerPort: 80
---
apiVersion: v1kind: Servicemetadata:
name: phpmyadmin-servicenamespace: prodspec:
type: NodePortports:
- port: 8080targetPort: 80nodePort: 30080selector:
app: phpmyadmin
# Afficher toutes les ressources principales Kubernetes dans le namespace courant
k get all

Retour :

NAME READY AGE
statefulset.apps/mariadb 1/1 22s

Accès aux services depuis l'extérieur

Nous avions rencontré des difficultés d'usage avec mikicube port forward qui était extrêmement lent, nous l'avons donc remplacé par socat qui nous a permis de publier nos NodePorts sur l'IP Publique de notre VM avec de bien meilleures performances.

# Commande pour le site e-commerce de Prod
sudo socat TCP-LISTEN:5005,fork,reuseaddr TCP:$(minikube ip):30005
# Commande pour PhpMyAdmin de Prod
sudo socat TCP-LISTEN:8080,fork,reuseaddr TCP:$(minikube ip):30080

Conclusion

Ce projet nous a permis de mettre en pratique les principes fondamentaux de Kubernetes à travers le déploiement d'une application e-commerce et d'une stack complète. Nous avons réussi à containeriser nos services (Flask, MariaDB et PHPMyAdmin), publier une "application métier" sur Docker Hub et les orchestrer via Minikube.

About

Projet E5 SAB - Urbanisation des SI

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors