tidaldb/k8s
jordan 19316227c5 feat(k8s): GKE overlay for the RF3 cluster, internal-only
thepeach's discover corpus should run the CLUSTER, not the standalone, and it
should run on GKE. Both halves are now evidenced rather than assumed.

Cluster, because the reason for the standalone is gone. The standalone was
chosen to work around cluster-mode `POST /signals` silently discarding
user_id/creator_id behind a 204 — fixed at the source in 6ad8c51. Inheriting a
workaround whose defect is fixed is how a temporary choice becomes permanent.

GKE, because that is where the consumer is. k3s-fleet's own history records the
fleet instance holding 1,720m of CPU requests — 17% of fleet allocatable —
while serving NOTHING, with tidaldb-staging at `items: 0` after 53 days,
because "the only in-source consumers ... run on GKE". Cluster-local DNS does
not cross clusters, so the consumer's
`tidaldb.tidaldb-cluster.svc.cluster.local:9500` can only resolve here.

An overlay, not a fork — precedent is ../cluster-local-kind, which patches the
same storage field. Two GKE facts the base cannot know:

1. `storageClassName: local-path` is the k3s provisioner. GKE has no such
   class, so the volumeClaimTemplate would leave every pod Pending
   indefinitely with nothing wrong on the StatefulSet itself. Patched to
   `standard-rwo` (pd.csi, WaitForFirstConsumer — the binding mode a
   StatefulSet wants).

2. The base publishes `tidaldb.threesix.ai`. That is a FLEET hostname with no
   DNS record here that must not get one, and the base's own comment says
   "Remove for internal-only". Deleted rather than left inert, which keeps DNS,
   certificates and load-balancer topology entirely out of this change. Peach
   reaches the service over cluster-local DNS; nothing needs exposing.

Worth recording because it nearly shipped: my first delete patch targeted a
`traefik.io` IngressRoute. The base publishes a plain `networking.k8s.io/v1`
Ingress carrying Traefik ANNOTATIONS, so the patch matched nothing, kustomize
rendered happily, and the Ingress survived — GKE would have published that
hostname. Rendering the overlay and reading the object inventory is what caught
it, so that check is now preflight step 1 with its expected output written
down, not left to memory.

The NetworkPolicy is kept verbatim and needs no widening: its `:9500` rule
carries no `from` selector (deliberate in the base, because kubelet probes come
from the node), which is exactly what lets thepeach-staging reach this
namespace with no cross-namespace rule. I had earlier claimed cross-namespace
was BLOCKED here; that was wrong, from reading a grep-filtered view instead of
the file.

Validated clean against GKE 2026-09-16: all 12 objects pass server dry-run,
warnings only. NOT applied — the base's image pin predates the signal-context
fix, so applying now would deploy the buggy binary. Preflight step 3 is the pin.
2026-09-15 21:15:29 -06:00
..
cluster fix(k8s): reconcile tidaldb StatefulSet resources with live cluster (300m/4Gi requests, 3/7Gi limits) 2026-09-03 05:16:27 -06:00
cluster-gke-peach feat(k8s): GKE overlay for the RF3 cluster, internal-only 2026-09-15 21:15:29 -06:00
cluster-local-kind feat(m12p4): sharded ingestion — scatter-gather pool + cross-shard unified reads (L4) 2026-06-14 15:17:35 -06:00
cluster-t4-kind fix(m12p6): complete T4 TLS scale-up — two-tier PKI + join_boot grpc_tls fallback 2026-06-14 22:41:59 -06:00
discover discover: repin to m12-agesort-20260901 2026-08-31 23:12:08 -06:00
kustomization.yaml feat: kubernetes deployment, OpenAPI spec, guides, and docker consolidation 2026-06-09 17:06:34 -06:00
namespace.yaml feat: kubernetes deployment, OpenAPI spec, guides, and docker consolidation 2026-06-09 17:06:34 -06:00
poddisruptionbudget.yaml feat: kubernetes deployment, OpenAPI spec, guides, and docker consolidation 2026-06-09 17:06:34 -06:00
schema-configmap.yaml feat: kubernetes deployment, OpenAPI spec, guides, and docker consolidation 2026-06-09 17:06:34 -06:00
secret.example.yaml feat: kubernetes deployment, OpenAPI spec, guides, and docker consolidation 2026-06-09 17:06:34 -06:00
service.yaml feat: kubernetes deployment, OpenAPI spec, guides, and docker consolidation 2026-06-09 17:06:34 -06:00
servicemonitor.yaml feat: kubernetes deployment, OpenAPI spec, guides, and docker consolidation 2026-06-09 17:06:34 -06:00
statefulset.yaml fleet remediation: make the workspace gate runnable, then fix what it caught 2026-08-16 12:38:14 -06:00