Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,26 @@ If `sentinel.token` is omitted, the chart generates and preserves a Secret for s

The optional warm-pool HPA requires `warmPool.enabled: true`, `warmPool.autoscaling.enabled: true`, and at least one explicit `autoscaling/v2` metric. The chart intentionally provides no default metric.

### Shared dependency cache (golden uploader)

`depsCache.golden` caches installed dependencies node-locally: the first sandbox on a node to install a given (repo, lockfile) pair pays the cost, and later sandboxes on that same node reflink from it. That cache is per-node and starts empty on every new node.

`goldenUploader` (disabled by default) closes the gap by running a DaemonSet that carries each node's local goldens into a shared, cross-node store, so a sandbox landing on a fresh node can extract a golden another node already produced instead of installing from scratch. A sandbox pod's mount into that shared store is read-only by design, so the uploader — not tenant code — is the only writer.

```yaml
depsCache:
enabled: true
golden: true
remote:
enabled: true

goldenUploader:
enabled: true
intervalSeconds: 300
```

Enabling `goldenUploader` requires `depsCache.enabled` and `depsCache.remote.enabled`, plus a writable volume: either the chart's own PV/PVC, or an existing claim supplied via `goldenUploader.pvcName` (mandatory when `depsCache.remote.storageClassName` is set, since a dynamic StorageClass cannot express the read-only/read-write split this relies on). Goldens are stamped and keyed per organization, so two orgs cloning the same public template never share a cached archive. This feature is additive — clusters that leave it disabled see no behavior change.

### Idle housekeeper

Studio refreshes claim activity, while the optional housekeeper CronJob cleans up idle or unrecoverable claims and orphaned routes/pods. Its defaults run every five minutes and reap claims idle for 15 minutes.
Expand Down Expand Up @@ -323,6 +343,7 @@ These defaults come from `deploy/helm/studio/values.yaml`:
| `netinit.enabled` | Install default iptables egress policy | `true` |
| `readOnlyRootFilesystem` | Read-only sandbox root filesystem | `true` |
| `depsCache.enabled` / `depsCache.golden` | Node-local dependency caches | `false` / `false` |
| `goldenUploader.enabled` | DaemonSet publishing node-local goldens to the shared cross-node store | `false` |
| `warmPool.enabled` / `warmPool.size` | Pre-warmed sandboxes | `false` / `0` |
| `previewGateway.enabled` | Wildcard preview Gateway | `false` |
| `housekeeper.enabled` | Idle-claim cleanup CronJob | `false` |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,26 @@ Se `sentinel.token` for omitido, o chart gera e preserva um Secret para os pods,

O HPA opcional do warm pool exige `warmPool.enabled: true`, `warmPool.autoscaling.enabled: true` e pelo menos uma métrica explícita no formato `autoscaling/v2`. O chart intencionalmente não fornece uma métrica padrão.

### Cache de dependências compartilhado (golden uploader)

`depsCache.golden` faz cache de dependências instaladas em nível de node: o primeiro sandbox de um node a instalar um determinado par (repo, lockfile) paga o custo, e sandboxes seguintes no mesmo node fazem reflink a partir dele. Esse cache é por node e começa vazio em todo node novo.

O `goldenUploader` (desabilitado por padrão) fecha essa lacuna executando um DaemonSet que leva os goldens locais de cada node para um armazenamento compartilhado entre nodes, de modo que um sandbox que caia em um node novo possa extrair um golden que outro node já produziu, em vez de instalar do zero. O mount de um pod de sandbox nesse armazenamento compartilhado é somente leitura por design, então o uploader — e não o código do tenant — é o único que escreve nele.

```yaml
depsCache:
enabled: true
golden: true
remote:
enabled: true

goldenUploader:
enabled: true
intervalSeconds: 300
```

Habilitar `goldenUploader` requer `depsCache.enabled` e `depsCache.remote.enabled`, além de um volume gravável: o próprio PV/PVC do chart, ou um claim existente fornecido via `goldenUploader.pvcName` (obrigatório quando `depsCache.remote.storageClassName` está definido, já que uma StorageClass dinâmica não consegue expressar a separação leitura-somente/leitura-gravação usada aqui). Os goldens são marcados e indexados por organização, então dois orgs que clonam o mesmo template público nunca compartilham um archive em cache. Esse recurso é aditivo — clusters que o deixam desabilitado não têm nenhuma mudança de comportamento.

### Housekeeper de recursos ociosos

O Studio atualiza a atividade dos claims, enquanto o CronJob housekeeper opcional remove claims ociosos ou irrecuperáveis, além de routes e pods órfãos. Os padrões executam a cada cinco minutos e removem claims ociosos há 15 minutos.
Expand Down Expand Up @@ -323,6 +343,7 @@ Estes padrões vêm de `deploy/helm/studio/values.yaml`:
| `netinit.enabled` | Instalar política padrão de egress no iptables | `true` |
| `readOnlyRootFilesystem` | Root filesystem do sandbox somente leitura | `true` |
| `depsCache.enabled` / `depsCache.golden` | Caches de dependências locais ao node | `false` / `false` |
| `goldenUploader.enabled` | DaemonSet que publica goldens locais no armazenamento compartilhado entre nodes | `false` |
| `warmPool.enabled` / `warmPool.size` | Sandboxes pré-aquecidos | `false` / `0` |
| `previewGateway.enabled` | Gateway wildcard de preview | `false` |
| `housekeeper.enabled` | CronJob de limpeza de claims ociosos | `false` |
Expand Down