Installation Helm
Déploiement sur Kubernetes via Helm Chart.
Prérequis
- Kubernetes 1.25+
- Helm 3.10+
- kubectl configuré
- Ingress Controller (nginx recommandé)
- StorageClass disponible
- Credentials Enedis DataHub
# Vérifier les versions
kubectl version --client
helm version
Installation
Étape 1 : Cloner le dépôt
git clone https://github.com/MyElectricalData/myelectricaldata_new.git
cd myelectricaldata_new/helm
Étape 2 : Télécharger les dépendances
helm dependency build ./myelectricaldata-server
Étape 3 : Créer un fichier de valeurs
cat > my-values.yaml << EOF
secrets:
enedis:
clientId:
value: "your-enedis-client-id"
clientSecret:
value: "your-enedis-client-secret"
environment: "production"
rte:
enabled: true
clientId:
value: "your-rte-client-id"
clientSecret:
value: "your-rte-client-secret"
jwt:
secretKey:
value: "your-super-secret-key-minimum-32-characters"
admin:
emails: "admin@example.com"
postgres:
enabled: true
auth:
password: "your-secure-postgres-password"
valkey:
enabled: true
ingress:
enabled: true
className: "nginx"
hosts:
- host: myelectricaldata.example.com
paths:
- path: /
pathType: Prefix
service: frontend
- path: /api
pathType: Prefix
service: backend
tls:
- secretName: myelectricaldata-tls
hosts:
- myelectricaldata.example.com
EOF
Étape 4 : Installer
helm install myelectricaldata ./myelectricaldata-server -f my-values.yaml
Étape 5 : Vérifier
# Statut
helm status myelectricaldata
# Pods
kubectl get pods -l app.kubernetes.io/instance=myelectricaldata
# Services
kubectl get svc -l app.kubernetes.io/instance=myelectricaldata
Architecture déployée
┌────────────────────────────────────────────────────────┐
│ Kubernetes Cluster │
├────────────────────────────────────────────────────────┤
│ ┌─────────────┐ │
│ │ Ingress │ ◄─── myelectricaldata.example.com │
│ └──────┬──────┘ │
│ │ │
│ ┌────┴────┐ │
│ │ │ │
│ ┌─▼───────┐ ┌─▼───────┐ │
│ │Frontend │ │ Backend │───► Enedis API │
│ └─────────┘ └────┬────┘───► RTE API │
│ │ │
│ ┌─────────┼─────────┐ │
│ │ │ │ │
│ ┌──────▼───┐ ┌───▼────┐ ┌──▼──────┐ │
│ │PostgreSQL│ │ Valkey │ │ Secret │ │
│ └──────────┘ └────────┘ └─────────┘ │
└────────────────────────────────────────────────────────┘
Configuration
Secrets Enedis (requis)
secrets:
enedis:
clientId:
value: "xxx"
# Ou avec un secret Kubernetes existant :
# existingSecretRef:
# name: "enedis-credentials"
# key: "client-id"
clientSecret:
value: "xxx"
environment: "production" # ou "sandbox"
redirectUri: "" # Auto-détecté si vide
Secrets RTE (optionnel)
secrets:
rte:
enabled: true
clientId:
value: "xxx"
clientSecret:
value: "xxx"
JWT
secrets:
jwt:
secretKey:
value: "minimum-32-characters-secret-key"
accessTokenExpireDays: 30
PostgreSQL
postgres:
enabled: true
auth:
database: myelectricaldata
username: myelectricaldata
password: "" # Requis
# Ou avec un secret existant :
# existingSecret: "postgres-credentials"
persistence:
enabled: true
size: 20Gi
storageClass: "" # Utilise la default StorageClass
Valkey (Cache)
valkey:
enabled: true
persistence:
enabled: true
size: 5Gi
Ingress
ingress:
enabled: true
className: "nginx"
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
hosts:
- host: myelectricaldata.example.com
paths:
- path: /
pathType: Prefix
service: frontend
- path: /api
pathType: Prefix
service: backend
- path: /docs
pathType: Prefix
service: backend
- path: /oauth
pathType: Prefix
service: backend
tls:
- secretName: myelectricaldata-tls
hosts:
- myelectricaldata.example.com
Ressources
backend:
replicaCount: 2
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
frontend:
replicaCount: 2
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 200m
memory: 128Mi
Autoscaling
backend:
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 80
frontend:
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 5
targetCPUUtilizationPercentage: 80
PodDisruptionBudget
backend:
pdb:
enabled: true
minAvailable: 1
frontend:
pdb:
enabled: true
minAvailable: 1
Commandes utiles
# Statut de la release
helm status myelectricaldata
# Valeurs actuelles
helm get values myelectricaldata
# Mise à jour avec nouvelles valeurs
helm upgrade myelectricaldata ./myelectricaldata-server -f my-values.yaml
# Rollback
helm rollback myelectricaldata 1
# Historique des révisions
helm history myelectricaldata
# Désinstaller
helm uninstall myelectricaldata
# Logs backend
kubectl logs -l app.kubernetes.io/name=myelectricaldata-backend -f
# Logs frontend
kubectl logs -l app.kubernetes.io/name=myelectricaldata-frontend -f
# Shell dans le pod backend
kubectl exec -it deploy/myelectricaldata-backend -- /bin/bash
# Migrations
kubectl exec -it deploy/myelectricaldata-backend -- alembic upgrade head
Dépannage
Pods en erreur
# Événements du pod
kubectl describe pod -l app.kubernetes.io/name=myelectricaldata-backend
# Logs détaillés
kubectl logs -l app.kubernetes.io/name=myelectricaldata-backend --previous
Problèmes de secrets
# Vérifier les secrets créés
kubectl get secrets -l app.kubernetes.io/instance=myelectricaldata
# Décoder un secret
kubectl get secret myelectricaldata-secrets -o jsonpath='{.data.enedis-client-id}' | base64 -d
Ingress non fonctionnel
# Vérifier l'Ingress
kubectl describe ingress myelectricaldata
# Vérifier les endpoints
kubectl get endpoints -l app.kubernetes.io/instance=myelectricaldata
# Logs Ingress Controller
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
PVC en attente
# Vérifier les PVC
kubectl get pvc -l app.kubernetes.io/instance=myelectricaldata
# Vérifier les événements
kubectl describe pvc -l app.kubernetes.io/instance=myelectricaldata
# Vérifier la StorageClass
kubectl get storageclass
Base de données inaccessible
# Vérifier le pod PostgreSQL
kubectl get pods -l app.kubernetes.io/name=postgres
# Logs PostgreSQL
kubectl logs -l app.kubernetes.io/name=postgres
# Tester la connexion depuis le backend
kubectl exec -it deploy/myelectricaldata-backend -- python -c "
from sqlalchemy import create_engine
e = create_engine('postgresql://...')
print(e.execute('SELECT 1').fetchone())
"
Haute disponibilité
Configuration recommandée pour la production
# my-values-prod.yaml
backend:
replicaCount: 3
autoscaling:
enabled: true
minReplicas: 3
maxReplicas: 10
pdb:
enabled: true
minAvailable: 2
resources:
requests:
cpu: 200m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
frontend:
replicaCount: 2
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 5
pdb:
enabled: true
minAvailable: 1
postgres:
primary:
persistence:
size: 50Gi
readReplicas:
replicaCount: 2
valkey:
replica:
replicaCount: 2
sentinel:
enabled: true
Désinstallation
# Supprimer la release
helm uninstall myelectricaldata
# Supprimer les PVC (ATTENTION: perte de données)
kubectl delete pvc -l app.kubernetes.io/instance=myelectricaldata
# Supprimer le namespace (si dédié)
kubectl delete namespace myelectricaldata