Funk-lab/k8s/apps/finlab/deployment.yaml
2026-06-30 15:10:07 +00:00

124 lines
4.5 KiB
YAML

apiVersion: apps/v1
kind: Deployment
metadata:
name: finlab
namespace: ai
spec:
replicas: 1
# HOME + workspace sur un volume RWO (NFS) → pas de rolling à 2 pods sur le même volume.
strategy:
type: Recreate
selector:
matchLabels:
app: finlab
template:
metadata:
labels:
app: finlab
spec:
imagePullSecrets:
- name: ghcr-pull
# PodSecurity « restricted » (ns ai). fsGroup 1000 → PVC NFS monté en /home/finlab.
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
# initContainer : prépare le workspace (seed robuste NFS) AVANT console + dashboard,
# pour qu'il soit peuplé et inscriptible quand les deux conteneurs démarrent.
initContainers:
- name: seed
image: ghcr.io/alkatrazz24/funk-finlab:sha-99ff321
command: ["/usr/local/bin/entrypoint-seed.sh"]
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
volumeMounts:
- name: home
mountPath: /home/finlab
containers:
# ── CONSOLE : Claude Code dans un terminal web (ttyd), sous /console ──
- name: console
image: ghcr.io/alkatrazz24/funk-finlab:sha-99ff321
command: ["/usr/local/bin/entrypoint-console.sh"]
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
ports:
- name: console
containerPort: 7681
readinessProbe:
tcpSocket: { port: 7681 }
initialDelaySeconds: 10
periodSeconds: 15
livenessProbe:
tcpSocket: { port: 7681 }
initialDelaySeconds: 30
periodSeconds: 30
# Claude Code est bursty : CPU moy. ~0,2 cœur mais throttlé ~11 % en pic à 1 cœur
# (mesuré). On double le plafond CPU pour des bursts plus fluides. La RAM n'était pas
# contrainte (~384 Mo) ; un peu de marge par confort. (La latence du modèle, elle,
# reste côté API — non impactée par les ressources du pod.)
resources:
requests: { cpu: 300m, memory: 768Mi }
limits: { cpu: "2", memory: 2Gi }
volumeMounts:
- name: home
mountPath: /home/finlab
# ── DASHBOARD : interface web (FastAPI), graphiques + données finlab ──
- name: dashboard
image: ghcr.io/alkatrazz24/funk-finlab:sha-99ff321
command:
- /opt/venv/bin/uvicorn
- dashboard.server:app
- --host=0.0.0.0
- --port=8800
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
ports:
- name: web
containerPort: 8800
# FINLAB_HOME/PYTHONPATH viennent de l'image ; FINLAB_HOME = workspace (configs live).
readinessProbe:
httpGet: { path: /healthz, port: 8800 }
initialDelaySeconds: 8
periodSeconds: 15
livenessProbe:
httpGet: { path: /healthz, port: 8800 }
initialDelaySeconds: 20
periodSeconds: 30
resources:
requests: { cpu: 100m, memory: 256Mi }
limits: { cpu: 500m, memory: 768Mi }
volumeMounts:
- name: home
mountPath: /home/finlab
# ── WATCHER : alertes de prix par email (boucle 5 min → relais postfix storage-01) ──
- name: watcher
image: ghcr.io/alkatrazz24/funk-finlab:sha-99ff321
command: ["/opt/venv/bin/python", "-m", "finlab.watcher"]
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
env:
# Relais SMTP du lab (storage-01) — accepte les pods k8s (mynetworks), pas de secret.
- { name: SMTP_HOST, value: "192.168.10.1" }
- { name: SMTP_PORT, value: "25" }
- { name: WATCH_INTERVAL, value: "300" }
resources:
requests: { cpu: 25m, memory: 192Mi }
limits: { cpu: 250m, memory: 384Mi }
volumeMounts:
- name: home
mountPath: /home/finlab
volumes:
- name: home
persistentVolumeClaim:
claimName: finlab-data