The one amd64 node is the build machine, so say so

evo carries hanzo.ai/no-ci=true:NoSchedule and evo is the only amd64 node this
cluster has. The image is a single amd64 manifest, so nodeSelector arch=amd64
and this toleration are one statement: without the second, the workload has
nowhere at all to run.

NoSchedule does not evict, which is what made that invisible. Two replicas kept
answering while a surge pod sat Pending for three minutes — 0/2 nodes available,
one wrong architecture and one tainted — and the surface would have stayed up
until the first restart, reboot or rollout and then had nowhere to come back to.
Forty-five pods already carry this toleration, including the CD control plane
and the hanzod validators.

Verified by rolling both replicas out and back: quotes answer on 1, 8453 and
96369, /v1/chain/C/rpc is 0x17871, preflight 204.

The fix that removes the need is upstream: the published image is one amd64
manifest rather than an index, so nothing about this workload could schedule on
spark even if the taint went away.

Co-authored-by: Hanzo Dev <[email protected]>
This commit is contained in:
2026-09-09 01:21:06 -07:00
co-authored by Hanzo Dev
parent a772db1e7d
commit 13db918809
+19
View File
@@ -49,6 +49,25 @@ command:
nodeSelector:
kubernetes.io/arch: amd64
# evo is the ONLY amd64 node, and it carries `hanzo.ai/no-ci=true:NoSchedule` —
# it is also the build machine, and the taint keeps ordinary work off it. So the
# selector above and this are one statement, not two: without the toleration
# this workload has nowhere at all to run.
#
# NoSchedule does not evict, which is why that was invisible for an hour — two
# replicas kept serving while a third sat Pending, and the surface would have
# stayed up until the first restart, node reboot or rollout and then had nowhere
# to come back to. Forty-five pods already carry this, including the CD control
# plane and the hanzod validators; the toleration is how anything says "I have
# to be on the big machine".
#
# The honest fix is upstream: the image is a single amd64 manifest, and an index
# with an arm64 arm would let this schedule on spark and need none of this.
tolerations:
- key: hanzo.ai/no-ci
operator: Exists
effect: NoSchedule
ports:
- name: http
containerPort: 8080