4204d4

ESH26 - Énoncé du projet de session

💡 Acte d’énoncer, d’exprimer en termes nets.

Version 1.0:2026.05.15


Remise de la partie 1 (20/35) - Dimanche le 17 mai


Examen de fin de session (35/35) - 19 et 22 mai

Détails sur l’examen théorique


Ce projet comporte deux étapes de réalisation.


Étape 1 - Déployer des applications en mode local - 👉 remise le 17 mai


Captures d’écrans et détails sur les applications


Harbor



Homepage

Détails

NOTE: 🛑 Si harbor a été démarré avec le mot de passe par défaut, il faudra effacer la base de données et recommencer la configuration:

sudo docker-compose down -v
rm -r /data/database
rm -r /data/registry
sudo ./prepare
sudo docker-compose up -d

Wordpress

Contenu NFS des thèmes Wordpress


Node-red


Contenu NFS de Node-red


Mattermost


Jenkins

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  resources:
    requests:
      storage: 5Gi


💡 Voici des astuces d’aide à la réalisation du projet

Certificats pour Harbor

# Générer le certificat
sudo certbot certonly --standalone -d 4204d4.duckdns.org

# Renseigner le fichier `harbor.yml`
nano harbor.yml
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /etc/letsencrypt/live/4204d4.duckdns.org/fullchain.pem
  private_key: /etc/letsencrypt/live/4204d4.duckdns.org/privkey.pem


Exemples de PV, PVC à partir d’un volume NFS

Voir ici

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-node-red
spec:
  ...
  storageClassName: nfs-node-red
  nfs:
    server: esh26-mon-matricule.duckdns.org
    path: /esh26/node-red

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs-node-red
spec:
  storageClassName: nfs-node-red
  ...


Renseigner un fichier à partir d’un configMap

# ============================================================
# ConfigMap — config.yaml de Homepage
# ============================================================
apiVersion: v1
kind: ConfigMap
metadata:
  name: homepage-config
data:
  config.yaml: |
    title: Homepage
    theme: dark
    color: slate
  
    allowedHosts: homepage.esh26

Exemple d’utilisation du dépôt harbor

apiVersion: apps/v1
kind: Deployment
metadata:
  name: homepage
spec:
  replicas: 1
  selector:
    matchLabels:
      app: homepage
  template:
    metadata:
      labels:
        app: homepage
    spec:
      containers:
      - name: homepage
        image: harbor.matricule.duckdns.org/esh26/homepage:esh26

### Lancer une application multi-fichiers YAML

# kustomization.yaml
# kubectl apply -k ./
resources:
  - esh26.yaml
  - traefik-ns.yaml
  - jenkins.yaml
  - node-red.yaml
  - wordpress.yaml

PV et PVC

Dans les notes de cours, il est indiqué qu’un PVC est toujours dépendant d’un PV.

Par contre, pour un volume local il est possible d’utiliser la classe storageClassName: local-path si le service local-path à été installé.

# Installation d'un `local-path-storage`
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.32/deploy/local-path-storage.yaml

Liste des ressources du projet - partie 01

$ kga
NAME                              READY   STATUS    RESTARTS   AGE
pod/homepage-76fb784c47-gqspg     1/1     Running   0          24h
pod/jenkins-55b96dfc79-t9h4n      1/1     Running   0          23h
pod/mariadb-8544495789-4s4sv      1/1     Running   0          24h
pod/mattermost-69f568bcf9-rtk76   1/1     Running   0          24h
pod/node-red-68b55c5bfb-xhz65     1/1     Running   0          24h
pod/wordpress-5d9548759d-v7dh5    1/1     Running   0          24h

NAME                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)            AGE
service/homepage             ClusterIP   10.109.226.194   <none>        80/TCP             24h
service/kubernetes           ClusterIP   10.96.0.1        <none>        443/TCP            24h
service/mariadb-service      ClusterIP   10.100.209.86    <none>        3306/TCP           24h
service/service-jenkins      ClusterIP   10.103.139.150   <none>        80/TCP,50000/TCP   23h
service/service-mattermost   ClusterIP   10.107.102.101   <none>        8065/TCP           24h
service/service-node-red     ClusterIP   10.100.73.1      <none>        80/TCP             24h
service/wordpress-service    ClusterIP   10.104.185.125   <none>        80/TCP             24h

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/homepage     1/1     1            1           24h
deployment.apps/jenkins      1/1     1            1           23h
deployment.apps/mariadb      1/1     1            1           24h
deployment.apps/mattermost   1/1     1            1           24h
deployment.apps/node-red     1/1     1            1           24h
deployment.apps/wordpress    1/1     1            1           24h

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/homepage-76fb784c47     1         1         1       24h
replicaset.apps/jenkins-55b96dfc79      1         1         1       23h
replicaset.apps/mariadb-8544495789      1         1         1       24h
replicaset.apps/mattermost-69f568bcf9   1         1         1       24h
replicaset.apps/node-red-68b55c5bfb     1         1         1       24h
replicaset.apps/wordpress-5d9548759d    1         1         1       24h

Étape 2 - Déployer des applications en nuage - remise le 25 mai


Dans un cluster k8s de type auto-pilote, sur google, nommé tu-parles-dun-projet


💡💡💡 Faire des tests en mode local avant le déploiement final sur gcloud. Cette section représente des coûts d’environ 8$ par jour. Idéalement, il faudrait déployer sur gcloud autour de la date de remise.


2.1 - Homepage - partie 2


2.2 - Le dashboard de traefik

Le dashboard de traefik doit être protégé par un mot de passe:

Avec Traefik, on utilise le middleware BasicAuth.

htpasswd -nb admin leMotDePasseHyperSecret
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: basic-auth
  namespace: traefik
spec:
  basicAuth:
    secret: traefik-auth-secret
---
apiVersion: v1
kind: Secret
metadata:
  name: traefik-auth-secret
  namespace: traefik
type: Opaque
stringData:
  users: "admin:$apr1$......"   # ← coller le résultat de htpasswd ici

Puis, référer au Middleware dans le fichier values.yaml de traefik

helm upgrade traefik traefik/traefik -n traefik -f values.yaml


2.3 - Démo d’un auto-scaling sur K8s

À partir du manifeste disponible –> ICI, déployer l’application de démonstration de la fonction K8s d’auto-scaling.



Ce projet permet d’expérimenter avec le scaling des pods en fonction de la demande. Le bouton Démarrer la charge va lancer un pod qui va saturer le site web. Par conséquent, le réplicatset va augmenter le nombre de pods pour maintenir le pression cpu sous 50%.


😉 Dans ce manifeste, il ne manque que la route ingress.

NOTE: 🛑 Les ressources de ce manifeste ne seront pas créées dans le namespace default. Par défaut, traefik ne voit pas les services qui sont dans un autre espace de nom que default.

💡Indice:

  kubernetesCRD:
    allowCrossNamespace: true   # ← ajouter ceci



2.4 - Immich : Librairie de photos

Il faut déployer le gestionnaire de photos Immich en utilisant un volume NFS pour le contenu.




#/etc/export
/esh26/immich  *(rw,sync,no_subtree_check,all_squash,anonuid=65534,anongid=65534,insecure)

NOTE: 🛑 Les ressources de ce manifeste ne seront pas créées dans le namespace default. Par défaut, traefik ne voit pas les services qui sont dans un autre espace de nom que default.


Liste des dépots harbor et des applications dans le nuage

Matricule Nom Prénom Liens
1146373 Charbonneau Félix 👍harbor
‼️Traefik
‼️scaling
1929205 Moussette David ‼️harbor
‼️Traefik
‼️scaling
2133738 Boudreault Charles 👍harbor
👍Traefik
👍scaling
2135251 Latreille Léa 👍harbor
👍Traefik
👍scaling
2176750 Lamonde Louis 👍harbor
👍Traefik
👍scaling
2236171 Papineau Émy 👍 harbor
👍Traefik
👍scaling
2248071 Bilodeau Lilianne 👍 harbor
👍Traefik
👍scaling
2251141 Bouchareb Saad 👍harbor
👍Traefik
👍scaling
2464026 Ezzahiri Adam 👍harbor
👍Traefik
👍scaling
2467525 Guertin Ubert 👍harbor
👍Traefik
👍scaling
2482651 Korotkov Maxim 👍harbor
👍Traefik
👍scaling
2487266 Goudreau Gabriel 👍 harbor
👍Traefik
👍scaling
6226374 Gosselin-Beaudoin Xavier 👍harbor
‼️Traefik
‼️scaling
6294775 Paradis Laury-Ann 👍 harbor
‼️Traefik
‼️scaling
6313976 Lamirande Xavier 👍harbor
👍Traefik
👍scaling
1191869 Bebnowski-Lavoie Guillaume 👍 harbor
🤔Traefik
👍scaling
1970541 Asfaw Marcus 👍 harbor
👍Traefik
👍scaling
2156548 Mechmachi Achraf 👍 harbor
👍Traefik
‼️scaling
2241079 Légaré Christopher 👍 harbor
👍Traefik
👍scaling
2257181 Rivet Olivier ‼️harbor
‼️Traefik
‼️scaling
2357057 Rimpel Morel Chelsey 👍harbor
👍Traefik
👍scaling
2383950 Lalonde Félix 👍 harbor
👍Traefik
🛑scaling
2384502 Guay Raphaël 👍 harbor
‼️Traefik
‼️scaling
2482798 Archambault Derek 👍 harbor
👍Traefik
👍scaling
6220854 Paradis Louam 👍 harbor
👍Traefik
👍scaling
6235015 Diallo Abdoulaye 👍 harbor
👍Traefik
👍scaling
6289173 Dubois Zachary 👍 harbor
👍Traefik
👍scaling
6297476 Forget Antoine 👍 harbor
👍Traefik
👍scaling
6313680 Nibimenya Maëlys ‼️harbor
‼️Traefik
‼️scaling