Files
universe/infra/k8s/arc/values-build-amd64.yaml
T

87 lines
3.8 KiB
YAML

# ARC Runner Scale Set: lux-build
#
# Provisions ephemeral amd64 build runners for luxfi/* GitHub workflows
# that target `runs-on: lux-build`. Cluster: do-sfo3-lux-k8s, namespace:
# arc-system. Node pool: lux-runners-amd64 (DOKS managed, autoscales
# 1->4 amd64 droplets on demand; taint dedicated=ci-runner:NoSchedule).
#
# Why: org separation per CLAUDE.md — luxfi/* workflows MUST use
# lux-build (this pool), hanzoai/* workflows MUST use
# hanzo-build-linux-amd64 (separate cluster). Cross-org runs-on
# queues silently and times out at 24h.
#
# Install:
# helm pull oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set --version 0.14.0 --destination /tmp
# helm --kube-context=do-sfo3-lux-k8s -n arc-system install lux-build \
# /tmp/gha-runner-scale-set-0.14.0.tgz \
# -f infra/k8s/arc/values-build-amd64.yaml
#
# Note: 2026-06-02 — pool was missing on do-sfo3-lux-k8s; v1.28.19
# build sat queued for 28+ minutes until this pool was reinstalled.
# Pinning the values file here so future install/uninstall cycles
# always reproduce the same shape.
#
# Recurrence, and why the selector changed:
#
# The pool went missing AGAIN. `doctl kubernetes cluster node-pool list
# lux-k8s` returns exactly one pool — lux-nodes — so every ephemeral runner
# pod on this cluster has been unschedulable. Measured: all five lux scale
# sets (lux-build 9, lux-build-amd64 10, lux-docs-build 1, plus
# lux-build-linux-amd64 and lux-apps-build at 0) sitting on
# 0/10 nodes are available: 10 node(s) didn't match Pod's node
# affinity/selector … 1 max node group size reached
# for 13h. Consequence: luxfi/cloud queued four Docker builds for 5-10h and
# lux.cloud served a bundle six commits stale, still calling the retired
# /v1/chain/C/rpc — so the console reported a live trillion-LUX treasury as
# 0 LUX and every Lux chain's height as an em-dash.
#
# The selector was also WRONG independently of the missing pool: `arch:
# amd64` is not a label any DOKS node carries. Verified both directions —
# `kubectl get nodes -l arch=amd64` returns "No resources found" while
# `-l kubernetes.io/arch=amd64` returns all 10. It is now the pair hanzo's
# ARC values already use (hanzo/universe:infra/k8s/arc/*.values.yaml):
# the DOKS pool name plus the well-known arch label.
#
# Pinning the POOL NAME is deliberate and load-bearing. Selecting on arch
# alone would let 2-CPU/4Gi runner pods (8-CPU/16Gi limits) schedule onto
# lux-nodes, which hosts mainnet luxd-0..4 and the whole lux surface at
# 68-94% memory-requested. CI must never compete with a validator for a
# node. With the pool named, this chart is fail-CLOSED: until the pool
# exists the runners stay Pending — visibly broken — rather than quietly
# landing on the validator pool.
#
# The one owner-gated step to unblock (creates billable droplets):
# doctl kubernetes cluster node-pool create lux-k8s \
# --name lux-runners-amd64 --size s-8vcpu-16gb-amd \
# --auto-scale --min-nodes 1 --max-nodes 4 \
# --label arch=amd64 --taint dedicated=ci-runner:NoSchedule
# The --label is what the arch selector below matches; the taint is what
# the toleration below clears. Nothing else needs to change.
githubConfigUrl: https://github.com/luxfi
githubConfigSecret: arc-github-secret
minRunners: 0
maxRunners: 10
containerMode:
type: dind
template:
spec:
nodeSelector:
doks.digitalocean.com/node-pool: lux-runners-amd64
kubernetes.io/arch: amd64
tolerations:
- key: dedicated
operator: Equal
value: ci-runner
effect: NoSchedule
containers:
- name: runner
image: ghcr.io/actions/actions-runner:latest
command: ["/home/runner/run.sh"]
resources:
requests:
cpu: "2"
memory: 4Gi
limits:
cpu: "8"
memory: 16Gi