Files
zeekayandHanzo Dev e4d0e884a8 zoo: schedule each workload where its image exists
Every image in zoo-mainnet except consul and the ingress is published for
linux/amd64 alone, and none of these files said so. Unpinned, the scheduler is
free to place them on spark, where the kubelet refuses the pull with `no match
for platform in manifest` -- which reads as a broken image and is a misplaced
pod. zoo-ui, zoo-gym, zoo-bot and zoo-build had been sitting in
ImagePullBackOff there.

The pin follows the artifact: an image that exists for one architecture may
only be scheduled where that architecture is. consul and the ingress are
multi-arch and stay free to land anywhere.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-09 00:19:27 -07:00

75 lines
2.4 KiB
YAML

# Generated from the live zoo-mainnet/zoo-computer Deployment on do-sfo3-lux-k8s
# by hack/live2values.py. Live is the source: a repo of hand-applied
# manifests has unknown currency, the running fleet does not.
# Automated. Drift here is the chart's own doing -- HANZO_VERSION and its
# labels, nothing of this service's own -- and the image in this file is
# the one the running pod pulled three days ago, so the rollout has a
# proven pull behind it. One replica with maxUnavailable 0: the new pod
# must go ready before the old one is taken.
cd:
automated: true
replicas: 1
selectorLabels:
app: zoo-computer
containerName: spa
image:
repository: ghcr.io/zooai/computer
tag: sha-be64237
digest: sha256:96c91ac7440e794df0d35845f381de2379f995dc31a9accd91ad41eebc21a5d6
pullPolicy: Always
resources:
limits:
cpu: 200m
memory: 128Mi
requests:
cpu: 50m
memory: 32Mi
livenessProbe:
failureThreshold: 3
httpGet:
path: /health
port: 3000
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /health
port: 3000
scheme: HTTP
initialDelaySeconds: 2
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
ports:
- containerPort: 3000
# ghcr-zooai, because that is the name this namespace has. `ghcr-luxfi` does
# not exist in zoo-mainnet -- a pod naming it gets no credential at all and the
# kubelet falls back to anonymous, which GHCR answers 403/NotFound for a private
# package. That reads as a missing image and is a missing secret. Verified
# 2026-09-09: ghcr-zooai pulls every repo this namespace references, zooai/* and
# the luxfi/* ones alike.
imagePullSecrets:
- name: ghcr-zooai
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
topologySpread:
enabled: false
lifecycle: null
terminationGracePeriodSeconds: 30
# The image for this workload is published for linux/amd64 only, and this
# cluster has an arm64 node. Unpinned, the scheduler is free to place it on
# spark, where the kubelet refuses the pull with `no match for platform in
# manifest` -- which reads as a broken image and is a misplaced pod. Measured
# 2026-09-09: zoo-ui, zoo-gym, zoo-bot and zoo-build had all been sitting in
# ImagePullBackOff on spark. Pin follows the artifact: an image that exists for
# one architecture may only be scheduled where that architecture is.
nodeSelector:
kubernetes.io/arch: amd64