Converge k3s-registry role on kai-server: registries.yaml missing the kai-registry.local mirror alias (silent drift) #540
Labels
No labels
burndown-2026-06
coherence-core
consult
headless
interactive
P0
P1
P2
P3
P4
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
coilyco-flight-deck/infrastructure#540
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
kai-server's
/etc/rancher/k3s/registries.yamlis out of sync with thek3s-registryansible role, and nothing catches the drift. The role keys the containerd mirror on the logical aliaskai-registry.local(ansible/roles/k3s-registry/defaults/main.yml:k3s_registry_authority: kai-registry.local->http://192.168.0.194:30500), but the live host file only has the pre-migration IP-keyed mirror:There is no
kai-registry.localmirror entry. Deploy manifests were migrated to pull via the alias (deploy/forgejo-runner-deploy.ymluseskai-registry.local/forgejo-runner-deploy:latest, deploy#122), but the host was never reconverged, so containerd cannot resolvekai-registry.localand the deploy runner sat inImagePullBackOfffor ~2h after the 2026-07-10 reboot (infrastructure#538). The registry itself is healthy - the pod isRunning, the PVC isBound, and the registry servesforgejo-runner-deploy:latestfine at the IP. Only the alias route was missing.The reboot did not cause the drift, it only exposed it: before the reboot the node had the image cached, so the missing mirror alias never mattered until a fresh pull was forced.
Do
k3s-registryrole is actually applied to kai-server: check the host playbook/inventory (ansible/) includes the role for the kai-server host. If it is not wired into the play that converges kai-server, add it, soward exec ansible-sync local=1renders thekai-registry.localmirror.registries.yamlidempotently contain thekai-registry.localmirror alias (and keep the raw192.168.0.194:30500entry only ifgrep -rn "192.168.0.194:30500" deploy/shows manifests still pull via the IP - otherwise the alias alone is correct)./etc/rancher/k3s/registries.yamlcarries thekai-registry.localmirror pointing at the NodePort endpoint. The Gatus fleet-reachability bundle and the post-reboot hardening discussed in infrastructure#538 are the natural home; a role-level assertion (or molecule test) that the template renders the alias key also works.IP:portis the Docker build/push endpoint per the role defaults, while containerd pull goes through thekai-registry.localalias. Keep that split intact.Acceptance
ward exec ansible-sync local=1on kai-server produces aregistries.yamlwhosemirrorsblock includeskai-registry.local -> http://192.168.0.194:30500, idempotently.kai-registry.localmirror is absent from the host registry config, so a future reboot or reconverge cannot silently drop it.forgejo-runner-deploy-0pullskai-registry.local/forgejo-runner-deploy:latestand reachesRunning(operator confirms on the live host - the one-time converge was done during the infrastructure#538 recovery).Context
The one-time live fix (adding the alias to the host file +
systemctl restart k3s --no-block+ deleting the stuck pod) was applied by the operator during the infrastructure#538 recovery to unblock the coilyco-bridge deploy runner. This issue is the durable follow-up so the config lives in the role and the drift is caught by a check, not by the next fleet outage. Sibling hardening from the same incident: infrastructure#539 (runner-token bootstrap script). Refs: infrastructure#538, deploy#122,deploy/registry.yml,deploy/forgejo-runner-deploy.yml,ansible/roles/k3s-registry/.WARD-RESERVATION: held 🔒
reservation details
Holder: container
engineer-claude-infrastructure-540on hostkais-macbook-pro-2.local.Reserved by
ward agent --harness claude(reserved 2026-07-10T17:45:03Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (1h TTL).--forceoverrides.Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).
run seed context — what this run is carrying (ward#609)
coilyco-flight-deck/infrastructure#540· branchissue-540· harnessclaude· workflowdirect-mainengineer-claude-infrastructure-540· wardv0.584.0· dispatched2026-07-10T17:45:03ZStatic container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.584.0).
— Claude (she/her), via
ward agent