Helm
Référence complète du chart Helm Scrydon — une installation condensée ainsi que toutes les valeurs exposées par le chart, avec leur rôle, leur justification et leur configuration.
Voici la référence de configuration du chart Helm Scrydon. Ce document présente une installation condensée, puis les groupes de valeurs importants pour l'exploitation — ce que fait chaque clé, pourquoi la modifier et comment procéder. Si vous souhaitez simplement démarrer un cluster le plus rapidement possible, commencez par la page Localisation (On-Premise, Azure (AKS), Air-Gapped) et revenez ici pour les options.
Pour un cluster air-gapped (sans internet sortant), consultez le Déploiement Air-Gapped — le même chart est livré dans un bundle Zarf.
Fonctionnement de la configuration
Trois couches, de la priorité la plus basse à la plus haute :
- Valeurs par défaut du chart — le chart fournit des valeurs de production sensées pour tout. La liste de référence est le
values.yamldu chart lui-même (voir Inspecter le chart localement). - Votre
values.customer.yaml— le fichier que vous passez avec-f. Ne surchargez que ce dont vous avez besoin ; tout le reste hérite de la valeur par défaut. - Flags
--set— priorité maximale, utile pour injecter des secrets au moment de l'installation depuis un gestionnaire de secrets.
helm install scrydon oci://scrydonops.azurecr.io/scrydon/charts/scrydon \
--version <version> -n scrydon-platform \
-f values.customer.yaml \
--set apiTable.secrets.STARROCKS_PASSWORD="$(vault kv get -field=password kv/scrydon/starrocks)"Les secrets vivent dans votre fichier de valeurs.
values.customer.yamlethelm get values <release>reproduisent toutes les valeurs fournies par l'utilisateur. Ne placez pas ce fichier dans un dépôt de code source, ou gérez-le via Sealed Secrets / SOPS / External Secrets Operator, et restreignez le RBAC du cluster sur le Secret de la release.
Inspecter le chart localement
Le chart est un artefact OCI dans scrydonops.azurecr.io — il n'existe pas de miroir Git public. Téléchargez-le pour lire chaque template et le values.yaml par défaut complet :
helm pull oci://scrydonops.azurecr.io/scrydon/charts/scrydon \
--version <version> --untar
less scrydon/values.yaml # la valeur par défaut de référence pour chaque clé ci-dessousValider votre configuration
Le chart embarque un schéma de valeurs (values.schema.json). Il rejette les
clés inconnues ou mal orthographiées au niveau racine et dans les groupes
stricts à haut risque tels que routing, ingress, license, les namespaces,
Pod Security et NetworkPolicy. Certains blocs applicatifs — notamment les clés
imbriquées de runtimePlane dans les charts actuels — restent permissifs : la
validation du schéma est nécessaire, mais pas suffisante. Une faute comme
routing.mdoe échoue immédiatement :
Error: values don't meet the specifications of the schema(s) in the following chart(s):
scrydon:
- routing: Additional property mdoe is not allowedAvant une installation ou une mise à niveau, exécutez un contrôle préalable avec vos valeurs et votre version de Kubernetes :
# 1. Schéma + lint — détecte les clés mal orthographiées et les erreurs de structure
helm lint ./scrydon -f your-values.yaml
# 2. Rendre et valider contre votre version de Kubernetes
# (kubeconform : https://github.com/yannh/kubeconform)
helm template scrydon ./scrydon -f your-values.yaml \
| kubeconform --strict --ignore-missing-schemas \
--kubernetes-version "$(kubectl version -o json | jq -r '.serverVersion.gitVersion' | tr -d v)"
# 3. Simulation d'installation contre le cluster réel (validation côté serveur)
helm install scrydon ./scrydon -f your-values.yaml --dry-run=serverLe chart exige Kubernetes 1.28 ou ultérieur (kubeVersion: ">=1.28.0-0") — helm install refuse les clusters plus anciens avec une
erreur claire plutôt que d'échouer en cours de déploiement.
Installation rapide
Le minimum pour obtenir un cluster opérationnel. Chaque étape est développée avec des notes spécifiques à l'environnement sur les pages Localisation.
# 1. Se connecter au registre (nom d'utilisateur = nom du token ACR fourni par votre équipe)
helm registry login scrydonops.azurecr.io --username <acr-token-name>
# 2. Créer le namespace de la release + un secret d'extraction d'image dans ce namespace.
# Le chart cible par défaut scrydon-platform pour chaque service ; la séparation en
# namespaces est optionnelle via namespaces.* (créer le secret dans chaque namespace ciblé).
kubectl create namespace scrydon-platform 2>/dev/null || true
kubectl create secret docker-registry scrydon-registry --namespace scrydon-platform \
--docker-server=scrydonops.azurecr.io \
--docker-username=<acr-token-name> --docker-password=<acr-token-password># 3. values.customer.yaml — l'installation minimale complète.
global:
imageRegistry: scrydonops.azurecr.io # récupérer les images depuis l'ACR connecté
imagePullSecrets:
- scrydon-registry
storageClass: <your-storage-class> # nom de classe cloud par défaut, ou votre provisionneur on-prem
routing:
host: app.example.com # le nom d'hôte vers lequel pointe votre DNS
ingress:
tls:
enabled: true # le navigateur accède à Scrydon via HTTPS — voir Ingress ci-dessous
infra:
db:
credentials:
password: REPLACE-WITH-DB-PASSWORD # openssl rand -hex 16
auth:
secrets:
AUTH_SECRET: REPLACE-WITH-AUTH-SECRET # openssl rand -hex 32
apiTable:
secrets:
STARROCKS_PASSWORD: REPLACE-WITH-STARROCKS-PW # openssl rand -hex 24# 4. Installer
helm install scrydon oci://scrydonops.azurecr.io/scrydon/charts/scrydon \
--version <version> --namespace scrydon-platform \
-f values.customer.yaml --waitLancer l'assistant de configuration
Ouvrez https://app.example.com/platform/setup (ou /setup si vous avez monté platform à la racine). Cinq étapes :
| # | Étape | Ce qu'elle fait |
|---|---|---|
| 1 | Licence | Collez ou déposez le bundle JSON { jwt, publicKey }. L'assistant vérifie la signature JWT par rapport à la clé publique incluse, contrôle l'expiration et affiche le niveau / CPU / RAM / VRAM. Stocké dans platform_config à l'étape suivante. Le format du bundle est affiché dans le Vérificateur de licence. Les fichiers .jwt seuls sont rejetés — la clé publique doit accompagner le JWT. |
| 2 | Compte administrateur | Créez le premier administrateur (e-mail + mot de passe). À la validation, la licence est persistée et l'utilisateur administrateur créé. |
| 3 | Organisation | Nommez votre organisation — le tenant racine. |
| 4 | Configurez la livraison (Resend, SendGrid, SMTP, ou ignorer — configurable ultérieurement sous Paramètres → Plateforme → E-mail). Sans fournisseur réel, les nouvelles inscriptions ignorent la vérification par e-mail ; une fois un fournisseur configuré, elles reçoivent un OTP. | |
| 5 | Terminer | Marque setup_completed = true et redirige vers l'accueil de la plateforme. |
Pré-injecter la licence
Évitez l'étape licence de l'assistant en injectant le bundle lors de la première installation. Les valeurs sont lues une seule fois pour initialiser la base de données ; ensuite la licence vit dans platform_config et est gérée depuis l'interface :
auth:
secrets:
AUTH_SECRET: REPLACE-WITH-AUTH-SECRET
LICENSE: | # le champ `jwt` du bundle (une ligne)
eyJhbGciOiJSUzI1NiIs...
LICENSE_PUBLIC_KEY: | # le champ `publicKey` du bundle (PEM)
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFA...
-----END PUBLIC KEY-----Lorsque les deux valeurs sont définies, l'étape Licence de l'assistant s'ouvre déjà vérifiée.
Référence de configuration
Chaque groupe ci-dessous correspond à une clé de premier niveau dans le values.yaml du chart, dans l'ordre du fichier. Les valeurs par défaut indiquées sont celles du chart ; ne surchargez que ce dont vous avez besoin.
global — registre, images, stockage
Paramètres à l'échelle du cluster, hérités par chaque service.
| Clé | Défaut | Rôle / justification |
|---|---|---|
global.imageRegistry | "" | Racine du registre d'images de conteneurs (ex. scrydonops.azurecr.io, un Harbor interne, un host:port de homelab). Vide génère des références non préfixées scrydon/<name>:<tag>. À définir par environnement. |
global.imagePullSecrets | [] | Noms des secrets d'extraction ajoutés à chaque pod. Indiquer le secret créé à l'étape 2. |
global.imagePullPolicy | Always | Politique standard de récupération Kubernetes. |
global.storageClass | "" | Le provisionneur pour chaque PVC. Pas de valeur cloud par défaut — définir la classe de votre cloud (managed-csi, gp3, standard-rwo) ou votre provisionneur on-prem (ceph-rbd, vsphere-csi, local-path). |
global.nfs.enabled | false | Utiliser des PV statiques NFS à la place du provisionnement dynamique. Pour les clusters homelab / NFS — définir aussi server + basePath. |
global.azure.enabled | false | Mode Azure Marketplace : les images sont résolues depuis MCR via global.azure.images.* et les composants tiers du data-plane (StarRocks/SeaweedFS) sont désactivés automatiquement. Défini par le package Marketplace, pas manuellement. |
global:
imageRegistry: scrydonops.azurecr.io
imagePullSecrets:
- name: scrydon-registry
storageClass: managed-csinamespaces — placement des charges de travail
Chaque service cible par défaut scrydon-platform. Surchargez par service pour un isolement multi-namespace ; le chart aligne automatiquement les politiques ACL Dapr et le RBAC de lecture des secrets.
namespaces:
infra: scrydon-infra
platform: scrydon-platform
agentic: scrydon-agentic
analytics: scrydon-platform
cortex: scrydon-platformingress — exposition et schéma TLS
| Clé | Défaut | Rôle / justification |
|---|---|---|
ingress.enabled | true | Générer les objets Ingress. Désactivez si vous placez votre propre ingress/gateway devant le cluster. |
ingress.className | traefik | Classe Ingress. N'importe quel contrôleur fonctionne. |
ingress.tls.enabled | true | Critique. Signifie « Scrydon est-il accessible via HTTPS par le navigateur ? » — pilote le schéma des URL publiques, les origines CORS, les cookies sécurisés et l'origine de callback Better-Auth. Par défaut true (sécurisé par défaut), y compris derrière un équilibreur de charge qui termine le TLS (App Gateway / ALB) et transmet du HTTP brut à Traefik — le navigateur reste en HTTPS, donc laisser true. Mettre à false uniquement pour les déploiements HTTP seul (dev local / smoke kind). Mettre false sur une installation frontée HTTPS casse silencieusement la connexion (Mixed Content + origine de callback incompatible). |
ingress.annotations | {} | Annotations spécifiques au contrôleur (émetteur cert-manager, etc.). |
ingress.middleware.forceHttps.enabled | true | Middleware Traefik de redirection vers HTTPS. |
routing — sous-chemin vs sous-domaine
Choisit comment les applications sont exposées. Discussion complète : Modes de routage.
| Clé | Défaut | Rôle / justification |
|---|---|---|
routing.mode | subpath | subpath place toutes les applications sous un même nom d'hôte avec un préfixe de chemin (un enregistrement DNS, un certificat — recommandé pour l'auto-hébergement). subdomain place chaque application sur son propre nom d'hôte (DNS wildcard + certificat — utilisé par notre SaaS). |
routing.host | — | Le nom d'hôte unique vers lequel pointe votre DNS, ex. app.example.com. |
routing.paths.* | /cortex, /agentic, … | Préfixes de chemin par application en mode sous-chemin. Mettre une valeur à "" pour monter cette application à la racine. Les applications consomment le préfixe résolu via BASE_PATH. |
routing:
mode: subpath
host: app.example.com
paths:
cortex: /scrydon/cortex # personnaliser les préfixes si nécessaire
platform: /scrydon/platformdapr — maillage de services et identité
Les appels de service à service utilisent Dapr avec mTLS ; les politiques ACL du chart sont basées sur le domaine de confiance SPIFFE.
| Clé | Défaut | Rôle / justification |
|---|---|---|
dapr.enabled | true | Injection de sidecar + composants crypto + comptes de service. |
dapr.installControlPlane | true | Installer le plan de contrôle Dapr comme sous-chart dans le namespace de la release. Mettre false si Dapr est déjà installé à l'échelle du cluster. |
dapr.controlPlaneNamespace | "" | Quand installControlPlane: false et que Dapr est ailleurs (ex. dapr-system), pointer le binding de lecture des secrets du chart sur ce namespace. |
dapr.trustDomain | scrydon | Domaine de confiance SPIFFE. Toutes les ACL générées en dépendent. Ne surchargez que pour correspondre à un CA Dapr existant — mais cela désactive l'isolation d'identité inter-clusters. |
dapr.global.tag | 1.18.1 | Tag d'image du plan de contrôle Dapr + sidecar, synchronisé avec la dépendance de Chart.yaml. Utilisez cette version testée avec un plan de contrôle externe. |
dapr.crypto.masterKey | "" | Clé maître AES-256. Générée automatiquement à la première installation et préservée lors des mises à jour. BYO : openssl rand -base64 32. |
dapr.secretStore.enabled | true | Créer le composant Dapr SecretStore adossé aux secrets Kubernetes. |
Apporter votre propre Dapr requiert la version testée 1.18.1, le domaine de confiance
scrydonsurdapr-sentry(ou faire correspondre viadapr.trustDomain) et un injecteur de sidecar opérationnel. Voir Installations Dapr existantes.
Base de données — Postgres intégré ou BYO
infra.db contrôle le Postgres intégré (pgvector). Pour une instance externe/managée, la recette complète — notes par fournisseur, clés infra.db.external.*, pré-création des bases — est sur BYO Database.
| Clé | Défaut | Rôle / justification |
|---|---|---|
infra.db.enabled | true | Exécuter le Postgres intégré dans le cluster. Mettre false pour utiliser une instance managée via infra.db.external.*. |
infra.db.credentials.password | postgres | À modifier. openssl rand -hex 16. |
infra.db.storage.size | 5Gi | Taille du PVC pour la base intégrée. |
infra.db.postgres.maxConnections | 250 | max_connections pour Postgres intégré. Gardez cette valeur au-dessus de la somme des pools applicatifs générés, avec une marge pour les migrations et l'administration. |
infra.db.tls.enabled | true | TLS intra-cluster (certificat auto-signé automatique, ISO 27001 A.8.24). Laisser activé pour la base intégrée ; les utilisateurs Postgres managé désactivent et utilisent le TLS du fournisseur. |
infra.db.backup.enabled | false | CronJob pg_dump optionnel (A.8.13). Définir schedule, retentionDays, databases. Les utilisateurs Postgres managé utilisent la sauvegarde du fournisseur. |
infra.db.external.existingSecrets.* | "" | Mode BYO A (recommandé) — noms de Secrets par application contenant DATABASE_URL (auth/agentic), DATABASE_URL_ANALYTICS, etc. |
infra.db.external.<app>Url | "" | Mode BYO B — DSN applicatifs en ligne (apparaissent dans helm get values). sslMode ajouté comme ?sslmode=. |
infra.db.external.lakekeeperUrl | "" | DSN Postgres de Lakekeeper. Requis lorsque infra.db.enabled=false et que Lakekeeper est activé ; utilisé pour les connexions en lecture et en écriture et stocké dans secrets-lakekeeper. |
# Intégré (défaut) — définir juste un mot de passe fort :
infra:
db:
credentials:
password: REPLACE-WITH-DB-PASSWORD
# Postgres managé BYO :
infra:
db:
enabled: false
external:
existingSecrets:
auth: scrydon-auth-db
agentic: scrydon-agentic-db
lakekeeperUrl: "postgres://scrydon:REDACTED@pg.example.com:5432/lakekeeper"
sslMode: requireStarRocks — Tables managées (OLAP)
Pod unique allin1-ubuntu. Alimente l'interface Tables et le fallback d'inférence de schéma agentique. Associé à apiTable.
| Clé | Défaut | Rôle / justification |
|---|---|---|
infra.starrocks.enabled | true | Exécuter StarRocks intégré. Mettre false (avec apiTable.enabled: false, ou pointer apiTable.starrocks.host vers un cluster externe) pour l'ignorer. Désactivé automatiquement en mode Azure. |
infra.starrocks.storage.size | 20Gi | Taille du PVC. |
infra.starrocks.resources | 2–8Gi / 0.5–2 CPU | Le composant data-plane intégré le plus lourd — voir Réduction. |
L'image intégrée livre root sans mot de passe. Définissez apiTable.secrets.STARROCKS_PASSWORD dans les valeurs, puis appliquez-le dans StarRocks après l'installation — voir Identifiants StarRocks. Pour une production multi-AZ, passez à l'starrocks-kubernetes-operator (séparation FE/BE) et pointez apiTable.starrocks.host vers son Service FE.
SeaweedFS — stockage objet
Stockage compatible S3 en pod unique pour les téléversements.
| Clé | Défaut | Rôle / justification |
|---|---|---|
infra.seaweedfs.enabled | true | Exécuter le stockage intégré. Désactivez si vous placez un S3 managé devant la plateforme (AWS S3, Azure Blob via API S3, GCS, MinIO) configuré sous https://<host>/settings/platform/storage. Désactivé automatiquement en mode Azure. |
infra.seaweedfs.s3.existingSecret | "" | Vide → le chart gère des clés d'accès/secret aléatoires (préservées lors des mises à jour, conservées à la désinstallation). Indiquer un Secret pré-créé avec accessKey/secretKey pour BYO. |
infra.seaweedfs.storage.size | 20Gi | Taille du PVC. |
Services applicatifs
Les applications produit — auth (api-platform), platform, cortex, analytics, apiOntology, apiTable, agentic (app + realtime). Chaque bloc partage une forme commune :
| Clé (par application) | Rôle / justification |
|---|---|
<app>.enabled | Générer l'application. La plupart restent activées ; analytics.enabled: false supprime l'interface analytique + marimo (charge de travail optionnelle la plus lourde). |
<app>.replicas | Échelle horizontale. |
<app>.image.tag | Par défaut Chart.AppVersion — laisser vide pour suivre le chart. |
<app>.resources | Requêtes/limites. Les valeurs par défaut sont ajustées d'après les incidents OOM en production (limite agentic : 4Gi, applications SSR : 2Gi) ; ne réduire que sur des clusters d'évaluation. |
<app>.databasePool.max | Limite de pool postgres-js par pod, rendue comme la variable d'environnement générique DATABASE_POOL_MAX. Chaque pool du pod la respecte ; les pods multi-bases (auth, apiTable) ajoutent des clés spécifiques (authMax, agenticMax) rendues comme les surcharges AUTH_DATABASE_POOL_MAX / AGENTIC_DATABASE_POOL_MAX. Réduisez-les pour les petits tiers Postgres managés ; augmentez-les seulement si max_connections dispose de la marge correspondante. |
<app>.ingress.* | Nom d'hôte par application (mode sous-domaine uniquement — ignoré en sous-chemin). |
<app>.corsOrigins | Origines navigateur autorisées. |
<app>.secrets | Secrets par application (voir ci-dessous). |
<app>.dapr.appApiToken | Token sidecar-vers-application par application, unique par application. Vide → généré automatiquement et préservé lors des mises à jour. BYO : openssl rand -base64 32. |
Clés notables spécifiques aux applications :
auth:
secrets:
AUTH_SECRET: REPLACE-WITH-AUTH-SECRET # signature de session — openssl rand -hex 32
auditLog:
enabled: true # transfert SIEM + crons de rétention (ADR 2026-04-16)
chain:
enabled: false # chaîne de hachage infalsifiable — optionnel, coût de signature
analytics:
marimoSidecar:
enabled: true # éditeur de notebooks ; désactiver pour réduire ~2Gi
secrets:
MARIMO_EDIT_TOKEN: "" # vide → généré automatiquement à l'installation, réutilisé entre les mises à niveau
apiTable:
starrocks:
host: "" # vide → Service FE intégré ; indiquer pour StarRocks externe
user: root
secrets:
STARROCKS_PASSWORD: REPLACE-WITH-STARROCKS-PW
agentic:
realtime:
ingress:
annotations: # cookie sticky pour la route WebSocket
traefik.ingress.kubernetes.io/service.sticky.cookie: "true"
passkey:
rpId: app.example.com # DOIT correspondre à routing.host sinon l'enregistrement passkey échoue
origin: https://app.example.com
auth.secrets.SERVICE_ADMIN_TOKENest déprécié — la production utilise Dapr mTLS (SPIFFE). Ne le définir que pour le développement local sans sidecars. Quand les clés avec underscore sont interdites (paramètres protégés Azure Marketplace), utiliserauth.authSecretà la place deauth.secrets.AUTH_SECRET.
runtimePlane — exécution Agent isolée
Le plan d'exécution est opt-in jusqu'à qualification de Kata/KVM et des contrôles réseau. Une fois activé, chaque session Agent standard s'exécute dans un pod Kata neuf à usage unique, avec une boucle modèle/outils/CLI bornée et un /workdir partagé ; elle ne revient jamais à une exécution dans le processus. La politique par défaut est requireTrueVm: true avec fallback: hard_refuse. Un opérateur peut choisir le niveau hardened, explicitement plus faible, uniquement dans un profil de déploiement examiné séparément. Dapr est le chemin de contrôle authentifié : si dapr.enabled global ou runtimePlane.dapr.enabled vaut false, aucun contrôleur n'est généré et l'Agent refuse avec une erreur typée.
Le chart réplique vos global.imagePullSecrets du namespace de la release vers les deux namespaces runtime au moment de l'installation/mise à niveau, donc les registres privés fonctionnent sans étape supplémentaire. (Les pipelines helm template puis apply n'ont pas de cluster à lire — pré-créez les secrets de pull dans les deux namespaces runtime dans ce mode de travail.)
| Clé | Défaut | Rôle / justification |
|---|---|---|
runtimePlane.enabled | false | Activez-le après qualification de Kata/KVM, du callback et des contrôles de sortie. L'Agent exige un plan fonctionnel et ne revient pas à une exécution dans le processus. Effectif seulement quand Dapr est activé (voir ci-dessus). |
runtimePlane.namespace | scrydon-runtimes | Namespace du contrôleur. Il doit différer du namespace des charges non fiables. |
runtimePlane.workloadNamespace | scrydon-runtime-workloads | Namespace des charges non fiables. Le RBAC du contrôleur peut y gérer les pods exec à usage unique ; le ServiceAccount exec ne reçoit pas de jeton API. |
runtimePlane.replicas | 1 | Topologie à contrôleur unique imposée ; les mises à jour Recreate préservent la propriété exclusive du PVC. |
runtimePlane.persistence.* | 1Gi, classe du cluster | Stockage durable obligatoire des revendications et résultats. Un stockage corrompu ou non inscriptible bloque le démarrage ou la répartition. |
runtimePlane.dapr.enabled | true | Le chemin de contrôle authentifié du plan. Désactiver cette valeur ou dapr.enabled global désactive le plan en échec fermé (rien n'est généré ; les tours Agent refusent avec une erreur typée). |
runtimePlane.image.* | version applicative de la release | Image du contrôleur. Épinglez le tag publié ; n'utilisez pas latest. |
runtimePlane.runnerImage | vide | Vide résout scrydon/bundle-runner à la version applicative du chart (même registre que chaque image d'application). Si défini, la valeur doit être un tag ou un digest épinglé — les profils production épinglent registry/repo@sha256:<digest> ; le schéma rejette latest. |
runtimePlane.enforcerImage | vide | Vide résout scrydon/egress-enforcer à la version applicative du chart. Si défini, épinglez le digest examiné ; le schéma rejette latest. |
runtimePlane.blockedCidrs | plages RFC1918 | Plancher réseau du déploiement inclus dans chaque instantané de sortie Agent. Configurez les CIDR des pods/services, les plages de métadonnées et les réseaux de contrôle privés ; la politique d'organisation ne peut pas les retirer. |
runtimePlane.upstreamDns | 10.0.0.10:53 | Adresse réelle de kube-dns/CoreDNS. Une valeur erronée casse toute sortie par nom d'hôte. |
runtimePlane.execution.isolateUntrusted | true | Valeur de déploiement par défaut pour les étapes classées non fiables. C'est un plancher de sécurité — les organisations peuvent le renforcer, jamais l'affaiblir. |
runtimePlane.execution.requireTrueVm | true | Exige une microVM ou refuse avec ISOLATION_UNAVAILABLE. |
runtimePlane.execution.fallback | hard_refuse | Refuse si aucune microVM qualifiée n'est disponible. hardened est un opt-in opérateur explicite et plus faible ; mediated reste indisponible tant que son mur de sortie est incompatible. |
runtimePlane.execution.maxConcurrentPerTenant | 8 | Nombre maximal d'exécutions en attente/en cours pour un locataire avant une réponse HTTP 429 typée. |
runtimePlane.execution.maxConcurrentGlobal | 128 | Plafond global de surcharge du contrôleur unique ; doit être supérieur ou égal au plafond par locataire. |
runtimePlane.isolation.microvm.enabled | false | Déclare un niveau kata-vm-isolation accessible. Ne l'activez qu'après création du RuntimeClass et du pool Kata/KVM. |
runtimePlane.isolation.microvm.renderRuntimeClass | false | Génère un RuntimeClass Kata autogéré. Laissez false sur AKS Pod Sandboxing, où AKS en est propriétaire. |
networkPolicies.enabled | false | Génère les NetworkPolicies du contrôleur et des charges non fiables. Définissez true avec un CNI qui les applique ; sinon la frontière réseau Kubernetes est absente. |
Deux choix de sécurité fonctionnent aujourd'hui :
- MicroVM Kata :
microvm.enabled: true,requireTrueVm: true,fallback: hard_refuse. Un noyau invité dédié est utilisé, sinon l'exécution est refusée. - Repli durci :
requireTrueVm: false,fallback: hardened. Le noyau hôte est partagé, avec application sans root, capacités abandonnées, seccomp et le même enforcer. Ce niveau est explicitement plus faible.
Le niveau mediated correspond à gVisor runsc, mais il n'est pas utilisable de bout en bout avec le mur réseau natif actuel : gVisor n'expose pas les API netfilter/netlink nécessaires à nftables/nfqueue. Le protocole interne du runtime-plane reste lisible pendant les mises à niveau progressives, mais les entrées Helm, d'environnement et de politique d'organisation refusent mediated ou échouent de manière fermée. Utilisez hard_refuse ou le repli explicitement plus faible hardened jusqu'à la livraison d'un mécanisme de sortie natif gVisor.
networkPolicies:
enabled: true
runtimePlane:
enabled: true
namespace: scrydon-runtimes
workloadNamespace: scrydon-runtime-workloads
persistence:
size: 1Gi
runnerImage: registry.example.com/scrydon/bundle-runner@sha256:<digest>
enforcerImage: registry.example.com/scrydon/egress-enforcer@sha256:<digest>
blockedCidrs:
- "10.0.0.0/8" # remplacer/étendre avec les CIDR réels des pods et services
- "172.16.0.0/12"
- "192.168.0.0/16"
upstreamDns: "10.0.0.10:53"
execution:
isolateUntrusted: true
requireTrueVm: true
fallback: hard_refuse
isolation:
microvm:
enabled: true
renderRuntimeClass: false # AKS possède kata-vm-isolationLe Deployment du contrôleur et l'identité exec consomment global.imagePullSecrets.
Les pods Agent à usage unique utilisent le ServiceAccount sa-runtime-exec, qui appartient au
chart et définit automountServiceAccountToken: false : le code non fiable ne reçoit aucun jeton d'API
Kubernetes, tandis que kubelet peut toujours utiliser l'identifiant de registre configuré.
Ne modifiez pas le ServiceAccount default du namespace. Si le registre exige un secret
d'extraction, créez le Secret portant le même nom dans runtimePlane.namespace,
runtimePlane.workloadNamespace et chaque namespace applicatif activé avant
l'installation, ou fournissez un accès au registre équivalent au niveau des nœuds.
L'enforcer s'exécute avec l'UID 0 et uniquement NET_ADMIN/NET_BIND_SERVICE ; l'application non fiable reste sans root et abandonne toutes les capacités. Un profil Pod Security restricted global rejette l'enforcer. Configurez une exception examinée pour le namespace runtime et validez les pods rendus avec kubectl apply --dry-run=server. Ne désactivez pas l'admission à l'échelle du cluster.
networkPolicies.enabled: true est requis pour la frontière d'entrée entre contrôleur et charges générée par le chart, et ne fonctionne qu'avec un CNI qui applique Kubernetes NetworkPolicy. Une politique rendue sur un CNI qui ne l'applique pas n'est pas un contrôle de sécurité ; prouvez son enforcement pendant la validation du déploiement.
Après le déploiement, vérifiez le rapport de capacités au démarrage et prouvez le niveau choisi sur un pod réel à usage unique. Un contrôleur Ready ne prouve pas à lui seul Kata, l'extraction des images, les rappels, le DNS, la suppression ou l'enforcement de sortie.
opa — point de décision d'autorisation
Chaque décision d'autorisation sur les espaces de travail, workflows et ontologies est évaluée par OPA.
| Clé | Défaut | Rôle / justification |
|---|---|---|
opa.enabled | true | Garder activé. Désactivé (et sans opa.url), ces décisions échouent en mode fermé. |
opa.url | "" | Vide → DNS du Service intra-cluster. Surcharger pour un OPA externe ou un Service non standard. |
opa.logLevel | error | Seuls debug/info/error sont valides — warn fait crashlooper le pod. |
license — posture de validation
| Clé | Défaut | Rôle / justification |
|---|---|---|
license.enabled | true | Flux de licence en ligne — contacte license.scrydon.com toutes les 24h. Les overlays air-gapped mettent false / mode: offline. |
license.mode | online | online contacte le serveur ; offline vérifie uniquement le JWT local. |
license.gracePeriod | 2592000 | Secondes de grâce en cas d'échec du contact (30 jours). |
license.diagnostics.enabled | true | Envoie la version Scrydon installée. Désactivez pour refuser les métadonnées facultatives ; la capacité contractuelle reste transmise. |
license.capacity.acceleratorResources | [] | Mappings indépendants du fournisseur entre ressources étendues et VRAM, utilisés par la mesure horaire. Requis lorsque de la VRAM sous licence est déployée. |
license.publicKeys | {} | Clés publiques supplémentaires pour la rotation de clé sans interruption. |
auth.secrets.LICENSE_PUBLIC_KEY doit être défini chaque fois que license.enabled: true pour qu'api-platform puisse vérifier les signatures JWT. Scrydon doit s'exécuter sur un cluster dédié, car la capacité inclut tous les nœuds workers planifiables. Voir Licences et Rapport de capacité de licence.
Lorsque networkPolicies.enabled=true, définissez networkPolicies.kubernetesApiEgress.enabled=true et son cidr sur l'adresse IP du Service de l'API Kubernetes avec un masque /32. Cela autorise uniquement la connexion à l'API de capacité des nœuds ; le RBAC limite toujours l'identité à get/list sur les nœuds.
packSources — distribution de packs gérée par le chart
| Clé | Défaut | Rôle / justification |
|---|---|---|
packSources.enabled | false | Initialiser les sources de packs depuis les valeurs du chart à chaque mise à jour. |
packSources.sources[] | [] | Liste d'entrées (organization, name, kind, url, …). Les lignes gérées par Helm sont en lecture seule dans l'interface. Les identifiants sont référencés par authSecretRef et provisionnés séparément. Voir Sources de packs. |
Ordonnancement des pods
Les nodeSelector, tolerations et affinity à l'échelle du chart s'appliquent à chaque Deployment, StatefulSet et Job de migration — les pods peuvent ainsi atterrir sur des nœuds dédiés ou marqués avec des teints. Les surcharges par composant ne sont pas exposées.
tolerations:
- { key: workload, operator: Equal, value: scrydon, effect: NoSchedule }
nodeSelector:
workload: scrydon
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- { key: node-role.kubernetes.io/scrydon, operator: Exists }Réduction pour les installations à ressources limitées
Les valeurs par défaut présupposent un cluster de forme production (≥ 8 vCPU / ≥ 32 Gio sur les nœuds). Sur des clusters d'évaluation (4 vCPU / 16 Gio), désactivez les composants optionnels les plus lourds :
infra:
starrocks:
enabled: false # ~2–8 Gio RAM, 20 Gio PVC — seules les Tables managées + l'inférence de schéma agentique sont affectées
apiTable:
enabled: false
analytics:
enabled: false # supprime l'interface analytique + le sidecar marimo (~2 Gio)Recettes de configuration courantes
Personnaliser les chemins de routage
Montez les applications sous des préfixes différents (ex. tout sous /scrydon/...) via routing.paths.* — voir le tableau routing ci-dessus et Modes de routage.
Installations Dapr existantes
Si le cluster exécute déjà Dapr, mettez dapr.installControlPlane: false pour que le chart ne tente pas de le gérer, et pointez dapr.controlPlaneNamespace vers l'emplacement de Dapr :
dapr:
installControlPlane: false
controlPlaneNamespace: dapr-systemVotre Dapr doit satisfaire trois prérequis, faute de quoi la connexion fonctionne mais la création de compte / les appels inter-services échouent avec PermissionDenied :
| Prérequis | Pourquoi |
|---|---|
| Dapr 1.18.1 (version épinglée et testée par le chart) | Les anciennes versions 1.17.3–1.17.6 émettaient un domaine SPIFFE incorrect ; faire correspondre la version évite la dérive du plan de contrôle. |
Domaine de confiance scrydon sur dapr-sentry (ou définir dapr.trustDomain en conséquence) | Toutes les ACL en dépendent. |
| Injecteur de sidecar opérationnel | Sans lui, les pods démarrent 1/1 (sans daprd) et l'invocation de service court-circuite. |
kubectl -n <dapr-ns> get deploy dapr-sentry \
-o jsonpath='{.spec.template.spec.containers[0].image}' # attendre sentry:1.18.1Ingress avancé : derrière un équilibreur de charge qui termine le TLS
Les configurations App Gateway / ALB / GCP LB / F5 nécessitent un ajustement du contrôleur Traefik (trustedIPs, externalTrafficPolicy: Local, la règle de schéma public ingress.tls.enabled, ingress privé, dépannage 502). Guide complet : TLS Offloading.
Identifiants StarRocks
Le StarRocks intégré est livré avec root sans mot de passe. Après helm install, appliquez le mot de passe défini dans apiTable.secrets.STARROCKS_PASSWORD :
NEW_PW="<your-starrocks-password>" # même valeur que apiTable.secrets.STARROCKS_PASSWORD
# StarRocks est dans le namespace de la release par défaut (namespaces.infra → scrydon-platform).
kubectl -n scrydon-platform exec -it deploy/starrocks-fe -- \
mysql -h127.0.0.1 -P9030 -uroot -e "SET PASSWORD FOR 'root' = PASSWORD('${NEW_PW}');"
kubectl -n scrydon-platform rollout restart deployment/svc-api-tableapi-table entre en CrashLoop entre l'installation et cette étape — c'est attendu ; il se stabilise après le redémarrage. Pour apporter votre propre StarRocks :
infra:
starrocks:
enabled: false
apiTable:
starrocks:
host: starrocks-fe.starrocks.svc.cluster.local
user: scrydon
secrets:
STARROCKS_PASSWORD: REPLACE-WITH-STARROCKS-PASSWORDVérifier le déploiement
kubectl get pods -n scrydon-platform # tous Running, 2/2 avec le sidecar Dapr
kubectl get ingress -n scrydon-platform # chaque Ingress a une ADDRESS
kubectl get certificates -A # Certificats cert-manager READY=TrueLes données de licence (niveau, droits, jours avant expiration) apparaissent sous Paramètres de la plateforme → Licence après /setup. Connectez-vous sur https://app.example.com/ et passez d'une application à l'autre via le sélecteur de produit sans vous reconnecter.
Dépannage
| Symptôme | Cause / solution |
|---|---|
Pods 1/1 (pas 2/2) | L'injecteur Dapr ne tourne pas — voir Installations Dapr existantes. |
L'inscription échoue avec PermissionDenied depuis agentic | Mauvais domaine de confiance ou versions Dapr mixtes. kubectl logs deploy/agentic -n scrydon-platform -c daprd | grep spiffe (ou votre surcharge namespaces.agentic) — les ID doivent être spiffe://scrydon/..., pas spiffe://public/.... Alignez le plan de contrôle et les sidecars sur la version testée 1.18.1. |
Job de migration CrashLoopBackOff | Sur Postgres BYO, une base de données n'a pas été pré-créée — voir BYO Database → Pré-créer les bases. |
Init:ImagePullBackOff avec insufficient_scope (403) | La carte de portée de votre token ACR manque un dépôt miroir tiers (scrydon/busybox, scrydon/pgvector, scrydon/opa). Envoyez à votre équipe l'erreur exacte + le chemin du dépôt — seule la carte de portée est mise à jour, pas le token. |
| Connexion silencieusement cassée derrière un équilibreur de charge | ingress.tls.enabled laissé à false — mettre à true (voir Ingress). |
Opérations de jour 2
- Renouveler la licence — collez le bundle renouvelé sous Paramètres → Licence → Mettre à jour la licence ; pas de redémarrage. Licences.
- Sauvegarde & restauration — CronJob Postgres intégré (
infra.db.backup) ou votre fournisseur managé. Sauvegarde & Restauration. - Mises à jour — Mises à jour.
- Observabilité — Observabilité.