Skip to main content

Fix: the provision-host ships a Kubernetes client 12 major versions too old

IMPLEMENTATION RULES: Before implementing this plan, read and follow:

Status: Backlog​

Goal: The Ansible layer talks to the cluster with a client the collection actually supports, and that version is pinned rather than inherited.

Created: 2026-08-21 — surfaced by a warning during the Rancher Desktop validation run, see STATUS-rancher-desktop-validation-2026-08-21.

Priority: Medium — nothing is broken today; the failure mode is obscure rather than loud, which is why it is worth fixing before it bites.


Problem​

Every kubernetes.core task emits:

[WARNING]: kubernetes<24.2.0 is not supported or tested. Some features may not work.

Measured inside the running uis-provision-host container, 2026-08-21:

Version
kubernetes (Python client)12.0.1collection requires ≥ 24.2.0
kubernetes.core (collection)6.5.0
Target API serverv1.36

Python client 12.0.1 dates from 2020 and targets Kubernetes ~1.16. It is being used against a v1.36 API server — roughly twenty minor versions apart.

It is not pinned anywhere. Neither Dockerfile.uis-provision-host nor any requirements file names kubernetes, so the version is whatever the base image happens to carry. That means it can also change without anyone choosing to change it — the same class of problem as the unpinned LiteLLM chart in PLAN-service-litellm-002-version-pinning.

Why this matters even though everything passes​

Eleven services deployed and tore down cleanly on 21 August with this client. The risk is not that k8s/k8s_info stop working — it is that they mishandle newer API shapes quietly: fields the old client does not know are dropped from round-trips, and newer resource versions may deserialize incompletely.

That is the same shape as the two defects this platform has already paid for — kubectl run --rm -i returning success with no output, and envsubst rendering an unset key as an empty string. Silent wrong beats loud broken, every time, and costs a day each.


Phase 1: Pin and upgrade​

Tasks​

  • 1.1 Add an explicit kubernetes>=24.2.0 pin (choose a specific version, not a floor) to the provision-host image build
  • 1.2 Decide whether kubernetes.core 6.5.0 is also due an upgrade, and pin it in the same place — a collection and its client should move together
  • 1.3 Rebuild the image and confirm the warning is gone

Validation​

docker exec uis-provision-host python3 -c "import kubernetes; print(kubernetes.__version__)"
./uis deploy whoami # no kubernetes<24.2.0 warning in the output

Phase 2: Prove nothing regressed​

An old client that silently drops fields will also appear to work; so will a new one. The only real check is a broad deploy/undeploy sweep before and after.

Tasks​

  • 2.1 Run ./uis test-all (or the batches used on 21 August) against the old client and capture the results as a baseline
  • 2.2 Repeat against the new client and diff
  • 2.3 Pay particular attention to services using kubernetes.core.k8s with complex objects — IngressRoutes, StatefulSets, PVCs
  • 2.4 Check whether any playbook has a workaround that exists because of the old client, and remove it if so

Validation​

The same set of services deploys, verifies and undeploys on both clients, with no new failures and no newly-empty fields in applied objects.


Acceptance Criteria​

  • The Kubernetes Python client is pinned to an explicit, supported version
  • kubernetes.core tasks emit no support warning
  • The version is declared in the repo, not inherited from a base image
  • A deploy/undeploy sweep passes identically before and after

Implementation Notes​

Do not treat "the warning went away" as the acceptance criterion. Upgrading the client is the easy half; the reason to do it is the silent-mishandling risk, and only the sweep in Phase 2 speaks to that.

Sequencing: this touches the provision-host image, so it lands cleanly alongside other image-level work rather than on its own.


Files to Modify​

  • Dockerfile.uis-provision-host — the pin
  • possibly a requirements.txt for the provision-host, if one is introduced