Harbor, Gitea, Argo CD, Jenkins, Vault, Grafana and vmui now answer on
their deployshed.com names alone. Each was already serving both while the
move was proved out; this removes the nip.io half.
The dual-hostname workarounds go with it. Jenkins' secondaryingress existed
only because its chart's primary ingress takes one hostName and a
certificate could not span both names — the real domain moves onto the
primary with jenkins-tls, which it already holds. Argo CD gets extraTls
rather than ingress.tls, because the boolean hardcodes secretName
argocd-server-tls and would request a second certificate for a name that
already has a valid one in argocd-deployshed-tls.
Harbor also changes in two ways beyond the hostname:
- externalURL moves to https://harbor.infra.deployshed.com. Harbor hands
this to docker clients in its own API responses and builds the push
commands shown in its UI from it, so a stale value is what makes a
correctly-configured registry still advertise the old address.
- updateStrategy is now Recreate. Its jobservice and registry volumes are
standard-rwo (ReadWriteOnce), and a RollingUpdate starts the new pod
before the old one releases the disk, so the replacement hangs forever
on Multi-Attach. The cluster was sitting in exactly that state, old pods
serving while new ones stayed in ContainerCreating. The chart's own
comment on this value recommends Recreate when RWM is unavailable. The
cost is a brief outage during upgrades, which beats a rollout that
cannot complete.
The private registry CA is not removed yet. Apps deployed before this move
recorded nip.io image references that only change when each is rebuilt, so
the old hostname stays served by a standalone Ingress until then.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LEsTefWWifp4ikvhHF5s6N
Each of these now answers on <name>.infra.deployshed.com alongside the
nip.io name it already had. Both are kept on purpose: nothing that
currently references the old name breaks, and the new one can be proved
before anything depends on it. Removing nip.io is a separate step, and a
larger one, because Harbor's name is embedded in every running app's image
reference.
TLS covers the real domain only. Let's Encrypt cannot issue for nip.io —
it is not on the public suffix list and every *.nip.io certificate shares
one rate limit — so a tls block naming both would request one certificate
spanning them and receive nothing for either. Each tls block therefore
lists exactly the one new hostname, which is why they are written out
rather than derived from the host list beside them.
The charts disagree about how to express a second host, so each is done
the way its own chart supports:
gitea, grafana, vault, victoria-metrics-single take host lists, so the
new name joins the existing one on a single Ingress.
jenkins' primary ingress accepts exactly one hostName, so the new name
goes on secondaryingress — a whole second Ingress object at the same
backend. paths must be set explicitly there; left at the chart's default
of [] it renders zero routes and the hostname answers nothing.
argo-cd takes extraHosts natively, but its ingress.tls is a boolean bound
to one fixed secret covering every host at once. Turning it on would
request a certificate including nip.io and fail, and there is no extraTls
to scope it. So ArgoCD gains the hostname now and its certificate when
nip.io goes.
Harbor is untouched here. It has no multi-host mechanism at all, so its
second hostname needs a standalone Ingress, and its externalURL is what
docker clients are handed — both deserve their own change rather than
riding along with a hostname tidy-up.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LEsTefWWifp4ikvhHF5s6N
Removes the cause of the diff failures that ServerSideDiff worked around:
v2.13.8 diffs against a Kubernetes schema compiled into its own binary,
and this cluster is newer than that schema.
Three things needed real changes, none of them mechanical:
- applicationSet.enabled no longer exists, and there is no replacement
gate — unlike dex and notifications, the ApplicationSet controller's
Deployment carries no conditional at all. Helm ignores unknown keys, so
carrying the old value forward would have quietly started a controller
nothing here uses. replicas: 0 is the only lever.
- The image tag pin is dropped rather than moved to v3.5.2. The chart's
appVersion governs, so image and chart cannot drift; a pin outliving its
chart is close to the failure being fixed here.
- server.insecure moved from server.extraArgs to configs.params, which is
what the chart renders into argocd-cmd-params-cm. Caught by rendering:
an earlier version of this commit deleted the extra arg on the strength
of a comment claiming configs.params already set it, which it did not —
Argo CD would have served its own TLS behind Contour and produced a
redirect loop.
Verified in the rendered output: image v3.5.2 and no v2.13.8 anywhere,
server.insecure true, dex and notifications absent, ApplicationSet at zero
replicas, both HPAs intact with replicas omitted, ingress on Contour, repo
Secrets on cluster DNS.
Behaviour changes in v3 that apply here, none needing a values change:
logs RBAC is now enforced (jenkins-ci only syncs), update/delete no longer
inherit to sub-resources, and resource tracking moves from labels to
annotations, so the first sync re-stamps every managed resource.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LEsTefWWifp4ikvhHF5s6N
A new cluster directory rather than edits to k8s-admin-prd-ase1, so no
homelab value is ever reused for GCP by accident. Charts are the ones
already vendored here (gitea 12.7.0, argo-cd 7.7.23, cert-manager
v1.20.1); only the values are new. Verified with helm template.
What differs from the homelab, and why:
- gitea: storageClass standard-rwo, and Recreate for a different reason
than the homelab's LevelDB lock — three nodes and a ReadWriteOnce disk
mean a rolling update's new pod waits forever on Multi-Attach. The
admin password comes from a Secret created at bootstrap instead of the
chart's published default, which would otherwise be live on a public
IP. Registration is disabled and webhooks are limited to private
ranges, for the same reason.
- argocd: single ingress host (no Tailscale), and the homelab's Ingress
health override is dropped, since Contour writes real load balancer
status here. server and repoServer autoscale 1-3 on CPU; the chart
omits replicas when autoscaling is on, so the HPA and ArgoCD's own
self-management do not fight over the count. Memory is deliberately
not a scaling metric: Go does not return memory promptly, so a memory
target scales up and never back down.
- cert-manager: written fresh, not copied. The homelab file was never
adapted from the fleet — it pulls from a private Meesho registry and
pins pods to a node pool that does not exist here. The chart's own
values.yaml carries that registry too, so imageRegistry and
imageNamespace are overridden back to upstream's quay.io/jetstack.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LEsTefWWifp4ikvhHF5s6N