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]>
75 lines
2.4 KiB
YAML
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
|