Operator topology fix:
- base/operator.yaml: pin ghcr.io/zooai/operator:v0.1.1 (was :main floating).
Add OPERATOR_NAMESPACE env via fieldRef: metadata.namespace so the
leader-election Lease lock is namespace-scoped, not racing in a single
hardcoded 'zoo-system' literal. imagePullPolicy: Always → IfNotPresent
(semver tag is immutable).
- zoo-system/patches.yaml: zoo-operator replicas → 2 (HA, leader-election
picks one). Drop the stale zoo-explorer raw-Deployment patch (operator
emits it now via ZooExplorer CR).
- zoo-{mainnet,testnet,devnet}/network-patch.yaml: scale per-env
zoo-operator → 0. Single zoo-system operator watches every namespace
(--namespace '' default); per-env operators were thrashing the same
Lease and never becoming leader.
CR migration (away from raw manifests):
- base/network.yaml: full rewrite as ZooNetwork + ZooChain + ZooExplorer
+ ZooGateway base CRs (CRDs already installed: zoonetworks /
zoochains / zooexplorers / zoogateways).
- base/explorer.yaml: emptied — ZooExplorer CR replaces the raw
Deployment; operator renders zoo-explorer-explorer Deployment + Svc.
- base/gateway.yaml: Service-only — ZooGateway moved to network.yaml.
- base/ingress.yaml: kind: Ingress → 4 kind: IngressRoute
(hanzo.ai/v1alpha1). Traefik proxy Deployment kept (it IS the
hanzoai/ingress L7 proxy on this cluster).
- zoo-{mainnet,testnet}/network-patch.yaml: env-specific patches —
validators (mainnet=5, testnet=3), bootstrap IPs+IDs from live Lux
mainnet+testnet svcs, TRACK_CHAINS = Zoo blockchainID per env.
- zoo-{testnet,devnet}/ingressroute.yaml: new — api.test.zoo.network,
explore.test.zoo.network, api-explore.test.zoo.network (and dev.*
variants).
- zoo-{system,testnet,devnet}/kustomization.yaml: include new
ingressroute.yaml resource + strip mainnet-only IngressRoutes via
$patch: delete pattern.
- zoo-mainnet/zoo-industries.yaml: kind: Ingress → IngressRoute.
Blockers surfaced (separate followups):
1. Operator does NOT translate `spec.config` env keys to lqd CLI
flags. Rendered StatefulSet sets ZOO_BOOTSTRAP_IPS etc., but
luxd reads LUXD_*-prefixed env. Operator controller.rs needs to
render as CLI args. BLOCKS validators joining Lux primary.
2. hanzo.ai/v1alpha1 IngressRoute CRDs not registered on
do-sfo3-zoo-k8s — current ingress is traefik:v3.3 with
traefik.io/v1alpha1 native. Either install hanzoai/ingress CRDs
OR migrate IngressRoutes to traefik.io group.
3. ZooNetwork operator doesn't emit per-pod LoadBalancer Services
needed for validators to be reachable as external bootstrap peers.
4. Validator staking keys: operator only takes secret_prefix; doesn't
derive from a KMS mnemonic. Need 5 Secrets per env OR operator
extension.
46 lines
802 B
YAML
46 lines
802 B
YAML
# zoo-system: hosts the single zoo-operator that watches every namespace.
|
|
# Everything else is scaled to 0 so the base manifests can co-tenant the
|
|
# namespace without spawning real workloads.
|
|
apiVersion: zoo.network/v1alpha1
|
|
kind: ZooNetwork
|
|
metadata:
|
|
name: zoo-chain
|
|
spec:
|
|
validators: 0
|
|
---
|
|
# Two-replica HA — only one is leader at a time (see src/leader.rs).
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: zoo-operator
|
|
spec:
|
|
replicas: 2
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: zoo-bridge
|
|
spec:
|
|
replicas: 0
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: zoo-ingress
|
|
spec:
|
|
replicas: 0
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: StatefulSet
|
|
metadata:
|
|
name: s3
|
|
spec:
|
|
replicas: 0
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: StatefulSet
|
|
metadata:
|
|
name: kv
|
|
spec:
|
|
replicas: 0
|