Two ways origin/main disagreed with the live cluster, both of which only bite on the next clean `apply -k`: NETWORK_HEALTH_MIN_CONN_PEERS was absent. A single-validator devnet has no peers, so luxd's default health gate (min 1 connected peer) holds the pod at 0/1 forever. The LIVE StatefulSet already runs --network-health-min-conn-peers=0; trunk just had no way to reproduce it. The key went missing when HTTP_ALLOWED_HOSTS was added to this same `config:` block — the edit landed beside it and took its sibling with it. tag was pinned to 0.2.0 while the live node runs ghcr.io/zooai/node:0.2.2 (the plugin-dir fix). Applying trunk downgraded the validator. Neither showed up as an outage because nothing re-applies this overlay on a schedule — no flux, no argo, no cronjob on zoo-k8s. It would have detonated under whoever ran the next apply, which is the worst time to find it. `kubectl kustomize k8s/zoo-devnet` now renders NETWORK_HEALTH_MIN_CONN_PEERS "0" and tag 0.2.2, matching production. Co-authored-by: Hanzo Dev <[email protected]>
77 lines
2.6 KiB
YAML
77 lines
2.6 KiB
YAML
# Zoo devnet — 1 validator joining the Lux devnet primary network (networkId 3)
|
|
# and tracking the Zoo devnet EVM chain (chainID 200202). Shape matches the
|
|
# v0.1.1 operator's ZooNetworkSpec (src/controller.rs::create_network):
|
|
# validators:<int> + image{repository,tag} + resources{cpu/mem Req/Limit} +
|
|
# storage{storageClass,size} + config{} (flat map → ZOO_* env on each pod).
|
|
apiVersion: zoo.network/v1alpha1
|
|
kind: ZooNetwork
|
|
metadata:
|
|
name: zoo-chain
|
|
spec:
|
|
networkId: 3
|
|
validators: 1
|
|
# zooai/node (zood) — Zoo EVM + AI precompiles (0x0303 inference, 0x0304
|
|
# aivmbridge). devnet is the lowest-risk place to bring Beluga up as a real
|
|
# L3 (1 fresh validator, no live L2 traffic). Floating `latest` is acceptable
|
|
# ONLY on devnet; testnet/mainnet pin the immutable CI semver. See
|
|
# statefulset-patch.yaml (./luxd -> zood).
|
|
image:
|
|
repository: ghcr.io/zooai/node
|
|
tag: 0.2.2
|
|
pullPolicy: IfNotPresent
|
|
resources:
|
|
cpuRequest: "200m"
|
|
cpuLimit: "1"
|
|
memoryRequest: 2Gi
|
|
memoryLimit: 4Gi
|
|
storage:
|
|
storageClass: do-block-storage
|
|
size: 20Gi
|
|
# luxd ignores ZOO_* env for http-host/bootstrap flags; the real flags are
|
|
# injected via statefulset-patch.yaml (see kustomization.yaml).
|
|
config:
|
|
# Devnet has no sybil protection (Lux primary networkID 3 convention).
|
|
SYBIL_PROTECTION_ENABLED: "false"
|
|
# luxd defaults --http-allowed-hosts to localhost, so every in-cluster
|
|
# caller addressing the node as `zoo-chain-rpc` got 403 Forbidden — the
|
|
# explorer could reach the Service and still index nothing. The Service is
|
|
# ClusterIP and devnet is not publicly routed.
|
|
HTTP_ALLOWED_HOSTS: "*"
|
|
# Single-validator devnet has no peers, so the default network-health gate
|
|
# (min 1 connected peer) would hold the pod at 0/1 forever. 0 = healthy alone.
|
|
# The LIVE StatefulSet already runs --network-health-min-conn-peers=0; this
|
|
# key is what makes an apply of this overlay reproduce that rather than hang
|
|
# the validator. It went missing when HTTP_ALLOWED_HOSTS was added to this
|
|
# same block, so trunk drifted out of agreement with production.
|
|
NETWORK_HEALTH_MIN_CONN_PEERS: "0"
|
|
---
|
|
apiVersion: zoo.network/v1alpha1
|
|
kind: ZooChain
|
|
metadata:
|
|
name: zoo-evm
|
|
spec:
|
|
chainId: 200202
|
|
networkRef: zoo-chain
|
|
---
|
|
# Single zoo-operator lives in zoo-system; per-env Deployments scale to 0.
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: zoo-operator
|
|
spec:
|
|
replicas: 0
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: zoo-bridge
|
|
spec:
|
|
replicas: 1
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: zoo-ingress
|
|
spec:
|
|
replicas: 1
|