Prevoir une evolution plus complete du projet sans casser la stack Docker Compose actuelle.
Cette option introduit:
- une cible Kubernetes legere avec
K3s - une exposition plus propre des services
- une possibilite d'ajouter Streamlit comme front metier
- un monitoring cluster + applicatif plus complet
K3s est un choix pertinent ici car il est:
- plus leger qu'un cluster Kubernetes classique
- plus simple a lancer en local ou sur petite VM
- suffisant pour montrer la scalabilite, le deploiement et la supervision
La stack actuelle reste la reference pour:
- le developpement
- la demo locale
- la CI
K3s devient une option d'extension si le projet doit aller vers:
- la haute disponibilite
- la replication de services
- l'auto-healing
- une meilleure separation entre front, APIs, monitoring et orchestration
[ User ]
|
v
[ Ingress ]
|
+--> [ Streamlit UI ]
|
+--> [ Gateway ]
|
+--> [ predict-text-api ]
+--> [ predict-image-api ]
+--> [ training-api ]
[ metrics-server ]
|
[ Prometheus ] [ Grafana ] [ Alertmanager ]
|
[ Loki ] [ Promtail ] [ Traefik metrics ]
|
[ Airflow ] [ MLflow ]
gatewaypredict-text-apipredict-image-apitraining-apistreamlit-uimetrics-serverprometheusgrafanaalertmanagerkube-state-metricsnode-exportertraefiklokipromtailmlflow
Pour une evolution K3s credible, il faut superviser a la fois:
- le cluster K3s lui-meme
- l'entree reseau
- les APIs metier
- les logs
metrics-serverPermet de voir CPU et memoire par node et par pod, et sert de base si on ajoute plus tard duHPA.kube-prometheus-stackFournitPrometheus,Grafana,Alertmanager,kube-state-metricsetnode-exporter.Traefik metricsK3s embarque Traefik par defaut, ce qui permet de monitorer l'ingress et les erreurs HTTP a l'entree.
Loki + PromtailPermet de centraliser les logs des pods et de corriger plus vite une panne applicative ou un probleme de routing.
- CPU et memoire des nodes
- CPU et memoire des pods
- nombre de pods redemarrant
- pods
Pending,CrashLoopBackOffouError - disponibilite des deployments
- nombre de replicas prets
- pods non disponibles
- saturation des requests/limits
- evenements de redemarrage
- nombre de requetes Traefik
- taux d'erreur
4xxet5xx - latence moyenne par route
Les APIs actuelles exposent deja des metriques Prometheus, donc il faut continuer a scraper:
gatewaypredict-text-apipredict-image-apitraining-api- plus tard
streamlit-ui
Metriques interessantes a remonter:
mlops_gateway_requests_totalmlops_gateway_request_duration_secondsmlops_predictions_totalmlops_prediction_duration_secondsmlops_training_requests_totalmlops_training_runs_total
Pour une demo K3s claire, il est utile d'avoir 4 dashboards ou vues Grafana.
- CPU node
- memoire node
- nombre de pods
- pods en erreur
- volume de trafic entrant
- latence moyenne
- erreurs
4xx - erreurs
5xx
- trafic du gateway
- latence du gateway
- nombre de predictions par modele
- taux d'erreur sur
predict/svm,predict/cnn,predict/multimodal
- nombre de runs d'entrainement
- duree moyenne de train
- erreurs de train
- disponibilite du
training-api
Des alertes simples suffisent deja a rendre la cible K3s plus industrielle:
- pod
gatewayindisponible - pod
predict-image-apioupredict-text-apiindisponible - plus de
5xxsur le gateway sur 5 minutes - latence moyenne trop elevee sur le gateway
- trop de redemarrages de pods
- manque de memoire sur un node
Migrer uniquement:
gatewaypredict-text-apipredict-image-apitraining-apimetrics-serverkube-prometheus-stack
Ajouter:
streamlit-uiprometheusgrafanaingressalertmanagertraefik metrics
Brancher:
autoscalingpersistent volumessecretsCI/CD deploiement K3slokipromtail- alertes applicatives plus fines
- K3s installe sur la machine cible :
curl -sfL https://get.k3s.io | sh - export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectldisponiblekustomizedisponible (oukubectl>= 1.21 avec support-kintegre)metrics-serverpour le HPA :kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl apply -f options/option_2_k3s_scalability/manifests/namespace.yamlkubectl apply -f options/option_2_k3s_scalability/manifests/configmap.yamlNe pas appliquer secret-template.yaml directement.
Creer le secret avec les vraies valeurs :
kubectl -n mlops create secret generic mlops-secrets \
--from-literal=API_TOKEN=votre-api-token \
--from-literal=DAGSHUB_TOKEN=votre-dagshub-token \
--from-literal=DAGSHUB_USER_TOKEN=votre-dagshub-tokenkubectl apply -k options/option_2_k3s_scalability/manifests/Note :
kustomization.yamlexclutsecret-template.yamlduapply -k. Le secret doit etre cree manuellement avant cette etape.
kubectl -n mlops get pods
kubectl -n mlops get hpa
kubectl -n mlops get ingressAttendre que tous les pods soient Running et Ready.
Ajouter l'entree dans /etc/hosts (ou C:\Windows\System32\drivers\etc\hosts sous Windows) :
<IP_DU_NODE_K3S> mlops.local
Puis ouvrir :
| Service | URL |
|---|---|
| Streamlit UI | http://mlops.local/ |
| Gateway Swagger | http://mlops.local/docs |
| Airflow | http://mlops.local/airflow |
| Grafana | http://mlops.local/grafana |
Rebuild l'image Docker, puis :
kubectl -n mlops rollout restart deployment/<nom-du-service>
# Exemple :
kubectl -n mlops rollout restart deployment/gatewaykubectl delete -k options/option_2_k3s_scalability/manifests/
kubectl -n mlops delete secret mlops-secrets- meilleure scalabilite horizontale des APIs
- separation plus propre des roles techniques
- possibilite de faire evoluer Streamlit en front metier
- meilleure observabilite du cluster et des APIs
- base pour des alertes et de l'auto-healing
- base credible pour un projet plus industriel
- plus complexe que Docker Compose
- demande une gestion des secrets et du stockage plus rigoureuse
- Airflow et MLflow doivent etre consolides avant une vraie mise en production
- la partie monitoring K3s ajoute de nouveaux composants a administrer