docs(devops): record team access, RBAC enablement and training infra - #34
Merged
Conversation
The setup log stopped at §11 (DVC, 16 July). This adds what was done on 7 August. - §12 Team access and RBAC: the shared-root-plus-per-person-key model, the sshd drop-in and why its name must start with 99-, why PermitRootLogin has to be prohibit-password rather than no, and why LogLevel VERBOSE is the only attribution mechanism a shared account has. Also the separate unprivileged account for the ML team and the reasoning behind it. - §13 Training infrastructure: the base-image decision, the registry tagging rule, the dedicated ml-trainer MinIO user, the /dev/shm trap, and the end-to-end verification result. - Error #10, RBAC was never enabled: symptom, cause, fix, lesson. The first check on a new cluster is the authorization mode itself, not auth can-i. - Error #11, MLflow OOMKilled during artifact upload: the memory cost of proxied uploads, why the loop was self-sustaining (the Job must be deleted first), and how the limit was measured from Prometheus. - Updated the final status and the open-work table; resources applied by hand and still outside GitOps (ml-trainer RBAC, monitoring) each get their own row. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
docs(devops): record team access, RBAC enablement and training infra
The setup log stopped at §11 (DVC, 16 July). This brings it current with what
was done on 7 August, in the same format as the rest of the document.
New sections
§12 — Team access and RBAC. The SSH model (shared
rootplus a per-personkey), the sshd drop-in, and the three things about it that are easy to get
wrong: the filename must start with
99-because cloud-init writesPasswordAuthentication yesinto50-cloud-init.conf;PermitRootLoginmustbe
prohibit-passwordrather thannoor the whole team is locked out; andLogLevel VERBOSEis the only attribution a shared account has, which is whythe name comments in
authorized_keysmust not be disturbed. Also covers theseparate unprivileged account created for the ML team, and why a scoped
kubeconfig would have been pointless without it.
The setup log stopped at §11 (DVC, 16 July). This brings it current
was done on 7 August, in the same format as the rest of the document.
New sections
§12 — Team access and RBAC. The SSH model (shared
rootplus akey), the sshd drop-in, and the three things about it that are easy to get
wrong: the filename must start with
99-because cloud-init writesPasswordAuthentication yesinto50-cloud-init.conf;PermitRootLoginmustbe
prohibit-passwordrather thannoor the whole team is lockedLogLevel VERBOSEis the only attribution a shared account has, whithe name comments in
authorized_keysmust not be disturbed. Also covers theseparate unprivileged account created for the ML team, and why a scoped
kubeconfig would have been pointless without it.
§13 — Training infrastructure. The base-image decision, the registry
tagging rule, the dedicated
ml-trainerMinIO user (rather than reusingml-team, whose password people also depend on), the/dev/shmdefault thatkills DataLoader workers, and the end-to-end verification result.
New error entries
#10 — RBAC was never enabled. The cluster ran with
--authorization-mode=AlwaysAllowfor 24 days, so every ServiceAccount in itwas effectively cluster-admin and the RBAC manifests that had been written
were never enforced. The entry records the diagnosis path — a namespace-scoped
Role cannot grant cluster-wide access, so the permissions had to be
from somewhere else — along with the three pre-flight checks that made the fix
safe, and the lesson: on a new cluster, check the authorization mode itself
before trusting
auth can-i.#11 — MLflow
OOMKilledduring artifact upload. Why proxied uploads costmemory, why the crash loop sustained itself (the client retried and
server again on each restart, so the Job has to be deleted first), and how the
limit was sized from a Prometheus measurement —
kubectl topdoes not work onthis cluster.
Status and open work
The closing status now reflects RBAC being enforced, key-only SSH, and
training running as a Job. The open-work table is re-prioritised, wi
MLflow Postgres backup called out as the highest priority — it is the only
item on the list whose failure mode is unrecoverable. Resources that
applied by hand and never made it into GitOps (
ml-trainerRBAC, monitoring)now each have their own row, since both disappear if the cluster is