Senior Kubernetes Platform - Training Guide

Avance Services | Santa Clara | 6-module single-page course
0% complete

Plan & the whole picture

Target role: Senior Kubernetes Platform Engineer at Avance Services, Santa Clara, California. The JD asks for 7+ years of deep Kubernetes administration, GPU workload support, cluster troubleshooting, and day-2 operations. Your background is strong on AI/ML Kubernetes platform work (Mozn: GKE/EKS + KubeFlow + Databricks) but lighter on day-2 cluster operations at scale. This course fills the gap.

This-week study plan

Six modules, 3-5 hours per day. Mark complete in the checklist below. Stick to the order; each module builds on the last.

Day 1
Module 1 (K8s internals) — finish CKA course Sections 1, 2, 3. Jump to module
Day 2
Module 2 (GPU workloads) — NVIDIA GPU Operator docs, KubeFlow quickstart. Jump to module
Day 3
Module 3 (Lifecycle) — CKA course Section 5 (cluster maintenance), ArgoCD examples repo. Jump to module
Day 4
Module 4 (Observability) — Prometheus/Grafana killercoda labs. Jump to module
Day 5
Module 5 (Troubleshooting) — CKA troubleshooting labs, k8s the hard way. Jump to module
Day 6
Module 6 (Bare-metal + storage) — Rook quickstart, Metal3/Tinkerbell docs. Jump to module

Your 30-second interview story

"I have run production Kubernetes for AI/ML workloads at Mozn in Riyadh — GKE and EKS with KubeFlow and Databricks, hybrid infrastructure across GCP, AWS, and on-prem, managed entirely through Terraform and Ansible. Where I want to grow is deeper day-2 operations: cluster upgrades, etcd backup, GPU device plugin troubleshooting, and SRE-grade observability. This is exactly the work the Avance role is built around, and I have signed up for a focused Kubernetes platform training programme this week to ramp the operational depth."

Study checklist

Tick items as you finish. Progress is shown in the header bar.

Module 1 - K8s internals
etcd + Raft, API server, scheduler, kubelet, kube-proxy. Open
Module 2 - GPU workloads
Device plugin, GPU Operator, KubeFlow operators, MIG vs time-slicing. Open
Module 3 - Cluster lifecycle
Provision, bootstrap, GitOps, upgrades, policy. Open
Module 4 - Observability
Prometheus, Grafana, Loki, Tempo, OTel, SLOs. Open
Module 5 - Troubleshooting
6 commands, symptom tree, DNS, NetworkPolicy, node debug. Open
Module 6 - Bare-metal + storage
Provisioning, Rook/Ceph, parallel filesystems, GPU tuning, air-gapped. Open
Practice: install a cluster end-to-end
Kind or minikube locally; bring up CNI, ingress, ArgoCD, a sample app. Hands-on is what cements the diagrams.
Practice: break and fix things
Kill CoreDNS. Delete a NetworkPolicy. Force a pod into CrashLoop. Use the 6 commands to recover.

Where your gaps are

Honest baseline against the JD:

JD lineYour depthWhat this module does
7+ yrs deep Kubernetes admin~5-6 yrs (Mozn + HL hybrid + Telus container)Module 1 fills the depth gap; modules 3, 5 add the operations years
Cluster troubleshootingOperational, not specialistModule 5 is the bulk of the work
Container runtimes, Helm, GitOpsHelm yes, GitOps partialModule 3 completes the picture
GPU workloads on KubernetesStrong (Mozn)Module 2 sharpens; this is your interview strength
Linux + data centre networkingStrong (Mozn, HL, Elsevier)Module 6 ties it to bare-metal K8s
Python / Bash / Go scriptingPython + Bash yes, Go noPick up Go basics in module 1 (operators are mostly Go)
KubeFlow, Argo, Prometheus, Grafana, Loki, service meshKubeFlow + Databricks yes, the rest partialModules 2 + 4 close the rest
Bare-metal Kubernetes + high-perf storageNone verifiedModule 6 is the gap-filler
Regulated / high-change-control environmentsFCA-regulated, PCI DSS at HLCarry the HL story; no new learning
back to contents ↑

Mind map: the whole course

Senior K8s Avance Services | Santa Clara 1 · K8s internals control plane deep dive etcd + API server scheduler + controllers kubelet + kube-proxy CNI + CSI + CRI 2 · GPU workloads AI/ML on Kubernetes device plugins node health + drivers KubeFlow + GPU sharing 3 · Lifecycle build, upgrade, govern Helm + Kustomize ArgoCD GitOps cluster API + upgrades policy + admission 4 · Observability SRE for K8s Prometheus + Grafana Loki + Tempo + OTel SLOs + error budgets 5 · Troubleshooting day-2 firefighting DNS + CoreDNS CNI debug + NetworkPolicy 6 · Bare-metal on-prem K8s + storage kubeadm vs Tinkerbell Ceph, Rook, high-perf CSI air-gapped registries
The six modules and their load-bearing ideas. The interview lands on one of these branches every time. Free resources are mapped to each branch below.
back to contents ↑

1. Kubernetes internals

Every troubleshooting story starts here. If you cannot draw the control plane, you cannot debug a cluster. The 7+ years requirement in the JD is asking for fluency with the internals, not just operational use.

CONTROL PLANE (master nodes, can be multi-AZ for HA) kube-apiserver REST + watch front door, all components etcd Raft consensus cluster state store kube-scheduler placement filters + scoring controller-manager reconcile loops Deployment, Node, Job cloud-controller cloud glue LB, nodes, routes WORKER NODES (kubelet + kube-proxy + container runtime) Node 1 (control-plane-1) kubelet · kube-proxy containerd / CRI-O CNI plugin (Calico/Cilium) + CSI pods · pods · pods Node 2 (GPU worker) kubelet + nvidia-device-plugin GPU operator + DCGM exporter KubeFlow pods, training jobs taints: nvidia.com/gpu=present Node n (spot/preempt) kubelet, drainable PodDisruptionBudget set ephemeral workloads PDB-aware scheduling Request flow: kubectl to API to scheduler to kubelet to CRI to CNI to CSI to Pod. Failure can be at any layer; you read the symptoms top-down through this diagram. Production clusters run 3 or 5 control-plane nodes for etcd quorum (Raft needs N/2+1).
The Kubernetes control plane + worker node architecture. Memorise the request path and the etcd-as-truth-store pattern; every cluster failure traces back through this diagram.

1.1 Control plane deep dive

The control plane runs the API and decides what should exist. The nodes run what the API decided. In production you have 3 or 5 control-plane nodes for etcd quorum (Raft needs N/2+1, so 3 survives 1 failure, 5 survives 2).

Components, in order of how often you touch them in a debug:

1.2 etcd + Raft

etcd is the source of truth. Everything in the cluster is reconstructable from etcd. The things to know cold:

1.3 API server + auth flow

When a pod is created, the request goes: kubectl apply -> HTTP POST to apiserver -> TLS terminates -> authentication (cert, token, OIDC) -> authorization (RBAC: is this subject allowed to do this verb on this resource?) -> admission (mutating webhooks first, validating webhooks after) -> etcd write -> watch fires to scheduler + controllers + kubelet.

If you can describe that flow out loud, you can debug half the cluster's permission problems. The other half is webhook misconfiguration.

1.4 Scheduler + placement

Two phases: filter then score.

GPU scheduling: device plugin registers nvidia.com/gpu=N as an extended resource. Pod requests resources.limits.nvidia.com/gpu: 1. Filter checks that the candidate node has at least 1 available. Score then ranks.

1.5 Kubelet + container runtime

The kubelet is the agent on every node. It watches the apiserver for pods bound to itself, then asks the container runtime (CRI) to start them. It reports node + pod status back via heartbeat (default every 10s).

Common kubelet issues:

1.6 CNI / CSI / CRI in one mental model

These three interfaces are what makes Kubernetes pluggable. Each one is a separate specification with multiple implementations.

If a problem is "pod cannot start" and the events mention "network not ready" or "plugin not found", it is a CNI problem. If it mentions "volume mount failed" or "PVC stuck Pending", it is CSI.

with the course/lessons, the videos, and the docs -->
M1 · Kubernetes internals · free resources

Udemy (you have a sub):

Official docs (free, authoritative):

Hands-on:

What to learn in order:

  • etcd Raft quorum (why 3 or 5 control-plane nodes), backup/restore procedure (etcdctl snapshot), what happens at split-brain.
  • API server flow: authn -> authz (RBAC) -> admission -> etcd write -> watch -> controller reconcile.
  • Scheduler: filter phase (NodeAffinity, taints, resources) and scoring (least-allocated, balanced).
  • Kubelet: how it knows what to run (apiserver watch), how it reports back (node status heartbeat, default 10s).
  • Kube-proxy modes: iptables (default, slow at scale) vs IPVS (faster).
back to contents ↑

2. GPU workloads on Kubernetes

This is your interview strength. The JD asks for it explicitly. The work at Mozn (GKE + EKS + KubeFlow + Databricks) maps directly. The deepening here is in failure modes, sharing strategies, and the GPU Operator pattern that production clusters use.

Pod manifest resources.limits.nvidia.com/gpu: 1 nodeSelector: gpu=true kube-scheduler filter + score nvidia.com/gpu: 1 available? nvidia-device-plugin DaemonSet registers GPUs as extended resources kubelet on GPU node CRI: containerd nvidia-container-runtime NVIDIA driver /dev/nvidia0, /dev/nvidiactl driver version pinned Container PyTorch / TF / CUDA libs mounts GPU devices DCGM exporter GPU util, mem, temp port 9400 metrics KubeFlow training operator TFJob / PyTorchJob CRDs gang-scheduled workers Prometheus scrape DCGM + kubelet /metrics endpoints Grafana per-GPU dashboards alerts: temp, ECC, throttling Failure modes to know driver mismatch Xid errors in dmesg GPU sharing strategies MIG (A100/H100) time-slicing (T4/L4)
GPU workload placement: device plugin reports capacity, scheduler binds pods, kubelet wires the GPU device into the container, DCGM exports metrics. Failures show up at driver, plugin, or kubelet level.

2.1 The GPU device plugin

The NVIDIA device plugin runs as a DaemonSet on every GPU node. On start, it calls nvidia-smi, counts GPUs, and registers them as extended resources on the node object (e.g. nvidia.com/gpu: 8). The scheduler then treats GPU requests like any other resource.

When a pod requests nvidia.com/gpu: 1, the scheduler filters out nodes that cannot satisfy it. On the chosen node, the kubelet passes the GPU device paths into the container via the nvidia-container-runtime, which translates the request into the right --device flags for containerd/CRI-O.

2.2 Sharing: MIG vs time-slicing vs MPS

You almost always want to share GPUs, because they are expensive and not always fully utilised. Three options:

2.3 KubeFlow training operators

KubeFlow is more than a logo. For training jobs you use the training-operator, which adds CRDs like TFJob and PyTorchJob. These CRDs implement gang scheduling — all worker pods start together, or none start. Without gang scheduling, a 4-GPU job can hang with 1 pod running because the others cannot bind.

For pipelines you use Kubeflow Pipelines (KFP), which is a workflow engine. For AutoML you use Katib. For serving you use KServe.

2.4 Failure modes you will debug

Things that go wrong on GPU clusters, and how to recognise them:

M2 · GPU workloads on Kubernetes · free resources

Udemy:

Official docs + vendor:

Hands-on:

What to learn in order:

  • GPU sharing strategies: MIG (hardware partitioning on A100/H100) vs time-slicing (software, on T4/L4) vs MPS (deprecated, avoid for new work).
  • Failure modes: driver mismatch (Xid errors in dmesg), device plugin crash (extended resources vanish, pods Pending), GPU OOM (CUDA OOM, not Linux OOM).
  • Node taints for GPU workloads: nvidia.com/gpu=present:NoSchedule + toleration on training pods.
  • Topology awareness: NVLink between GPUs on the same node, PCIe between nodes; gang scheduling for multi-GPU jobs.
back to contents ↑

3. Cluster lifecycle

The JD says "cluster lifecycle management" — that means: provision it, bootstrap it, run workloads via GitOps, upgrade it without downtime, and apply policy. This is the difference between "I used Kubernetes" and "I run Kubernetes".

1. Provision kubeadm / Cluster API / Terraform control plane + workers 2. Bootstrap CNI, ingress, cert-manager storage classes, RBAC 3. GitOps ArgoCD app-of-apps Helm + Kustomize + sealed-secrets 4. Operate upgrades, backup, DR drills policy + admission control 5. Observe (cross-cutting) Prometheus + Grafana + Loki SLOs + error budgets UPGRADE PATTERN (n-1 minor version skew, drain + cordon + replace) 1. Cordon node: kubectl cordon <node> (no new pods scheduled) 2. Drain: kubectl drain --ignore-daemonsets --delete-emptydir-data (evicts safely) 3. Upgrade kubelet + containerd on the node, then bring it back Control plane: upgrade one at a time, etcd backup before each, never skip a minor version
Cluster lifecycle in five stages, with observability cutting across all of them. Upgrade is a sub-skill of Operate: cordon, drain, replace, verify, repeat.

3.1 Provision: kubeadm vs Cluster API

Two ways you will provision. Choose by environment.

Managed (EKS/GKE/AKS) is the third option if the customer is on a cloud. But the JD is talking about AI infrastructure that may be on bare-metal, so kubeadm or CAPI on Metal3 is the likely answer.

3.2 Bootstrap: CNI, ingress, cert-manager

After the cluster is up, before any workload runs, you need the platform layer:

3.3 GitOps with ArgoCD

ArgoCD watches a Git repo and applies whatever is there. The cluster's actual state converges to the desired state in Git. The standard pattern is app-of-apps: a root Application that points to a directory of other Applications.

For cluster bootstrap, the GitOps order is: install ArgoCD via Helm first, then have ArgoCD install everything else. This avoids the chicken-and-egg of "GitOps before ArgoCD exists".

Alternatives: Flux CD (CNCF, lighter weight), Jenkins X. ArgoCD has the best UI; Flux has the best GitOps purity.

3.4 Upgrade procedure (cordon/drain/replace)

The discipline:

  1. etcd backup first — non-negotiable.
  2. One control-plane node at a time. Verify with kubectl get nodes after each.
  3. Never skip a minor version. K8s 1.29 -> 1.31 needs 1.29 -> 1.30 -> 1.31, not 1.29 -> 1.31.
  4. For workers: kubectl cordon <node> (no new pods), kubectl drain --ignore-daemonsets --delete-emptydir-data (evict safely), upgrade kubelet + containerd, uncordon.
  5. PodDisruptionBudgets on your workloads prevent drain from removing too many at once.

3.5 Policy + admission control

The cluster's rules. Without these, anyone with namespace access can do anything.

M3 · Cluster lifecycle · free resources

Udemy:

Official docs + projects:

  • Cluster API (CAPI) — declarative cluster lifecycle using Kubernetes-style APIs. Read the book-style concepts doc.
  • ArgoCD — the GitOps tool. Read the "Core Concepts" then the "Operator Manual".
  • Helm — charts, values, hooks, OCI registries.
  • Upgrading kubeadm clusters — the exact procedure.
  • Velero — backup/restore for cluster resources and PV snapshots.

Hands-on:

What to learn in order:

  • Provision: kubeadm (manual, useful for understanding) vs Cluster API (production, declarative) vs managed (EKS/GKE) for cloud.
  • Bootstrap: install CNI, ingress-nginx or traefik, cert-manager, metrics-server, then GitOps.
  • GitOps: ArgoCD watches Git, applies manifests; the app-of-apps pattern keeps clusters consistent.
  • Upgrade procedure: never skip a minor version; one control-plane node at a time; etcd backup before each; verify with kubectl get nodes.
  • Policy: OPA/Gatekeeper or Kyverno for admission control; Pod Security Standards as a starting point.
back to contents ↑

4. Observability

The JD asks for "production monitoring, alerting, logging, and observability frameworks". On Kubernetes the answer is the standard three-pillar stack: metrics + logs + traces, all flowing into Grafana, with SLOs on top.

kubelet /metrics node + pod + container kube-state-metrics Deployment, Pod, Node state node-exporter host CPU, mem, disk, net cAdvisor (built-in) container resource usage Prometheus scrape + TSDB + PromQL Loki log aggregation, LogQL Tempo distributed traces OpenTelemetry Collector unified ingest pipeline Grafana dashboards + alerting cluster overview per-namespace per-pod / per-container GPU dashboard (DCGM) network policy hit/miss apiserver latency SLO control-plane etcd WAL fsync + alerts to Alertmanager + Slack / PagerDuty SLOs that matter apiserver availability 99.9% over 30d pod scheduling latency P95 < 5s node readiness > 99% ready DNS resolution P95 < 50ms error budget burn rate alerts
Observability stack for Kubernetes: three pillars (metrics, logs, traces) through three stores (Prometheus, Loki, Tempo) into one Grafana surface. SLOs turn telemetry into priorities.

4.1 Metrics, logs, traces

Each pillar answers a different question:

4.2 Prometheus + kube-state-metrics

Prometheus scrapes /metrics endpoints. In a cluster you get metrics from:

The prometheus-operator CRDs (ServiceMonitor, PodMonitor, PrometheusRule) make this declarative — you write YAML, the operator configures Prometheus.

4.3 Loki + Tempo + OpenTelemetry

Loki is the log store; labels instead of full-text indexing, so it is cheap to run. The Promtail or Alloy agent ships logs from nodes.

Tempo is the trace store; designed to be cheap, integrated with Grafana, and to use the same labels as metrics + logs (one correlation ID across all three pillars).

OpenTelemetry is the unified SDK. Instrument your app once with OTel, configure the collector, and the same trace + metric + log goes to all three backends. This is the modern default.

4.4 SLOs that matter on Kubernetes

Pick the user-facing ones. For a platform serving AI workloads, the canonical four:

  1. API server availability — 99.9% of requests succeed over 30 days.
  2. Pod scheduling latency — P95 of "time from pod creation to Running" under 5 seconds.
  3. Node readiness — 99% of nodes Ready at any moment.
  4. DNS resolution — P95 of CoreDNS query latency under 50 ms.

Set SLOs as Prometheus rules; track error budget burn rate; alert on multi-window burn (e.g. 2% budget in 1 hour = page).

M4 · Observability · free resources

Udemy:

Official docs:

Hands-on:

What to learn in order:

  • The three pillars: metrics (Prometheus, numeric, queryable), logs (Loki, text, searchable), traces (Tempo/Jaeger, request-path across services).
  • OpenTelemetry: instrument apps with OTel SDK, export to any backend; the same signal goes to all three pillars.
  • SLOs: pick the user-facing availability (e.g. "API 99.9% over 30d"); track burn rate; alert on burn-rate high window.
  • Key Kubernetes dashboards: cluster overview, per-namespace, per-pod (restarts, OOMKilled, throttling), GPU (DCGM), apiserver latency.
back to contents ↑

5. Troubleshooting

This is the bulk of the JD. The interview will have a scenario question: "a pod is Pending, what do you do?" The answer pattern is: symptom -> events -> layer -> fix. Memorise it.

Symptom pick the closest Pod Pending scheduler can't place CrashLoopBackOff container keeps dying Pod NotReady probes failing Node NotReady kubelet heartbeat lost ImagePullBackOff registry unreachable DNS failure name resolution CNI / NetworkPolicy pod-to-pod CSI / volume PVC stuck Pending Control plane etcd, apiserver kubectl describe pod first command kubectl logs --previous last crash logs kubectl get events --sort-by last seen first PRINCIPLE: GO TOP-DOWN, NOT GUESS-AND-CHANGE 1. Identify the symptom (Pending? CrashLoop? 5xx?) 2. Read the events (kubectl describe / kubectl get events) - 80% of failures are explained here 3. Inspect the layer in this order: scheduler -> kubelet -> CRI -> container -> CNI -> CSI -> app For GPU-specific: confirm device plugin healthy, driver version, dmesg for Xid errors, nvidia-smi inside the pod
Troubleshooting decision tree. Always start with kubectl describe and kubectl get events; symptoms tell you the layer, events tell you the cause.

5.1 The 6 commands

These answer 80% of cluster debugging. Practice them on killercoda until they are muscle memory.

  1. kubectl get pods -A — what's the cluster doing right now?
  2. kubectl describe pod <name> -n <ns> — the events section tells you why.
  3. kubectl logs <pod> --previous — what did the container say before it died?
  4. kubectl get events --sort-by='.lastTimestamp' -A — cluster-wide events, newest last.
  5. kubectl exec -it <pod> -- sh — get a shell inside a running container.
  6. kubectl debug node/<name> --image=busybox -it -- chroot /host — get a shell on the node itself.

5.2 Symptom to layer

Every failure fits one of these patterns:

5.3 DNS failure debugging

DNS is the layer that fails silently. 80% of "service cannot connect" issues are DNS.

  1. From inside a pod: nslookup kubernetes.default — if it times out, CoreDNS is the problem.
  2. kubectl get pods -n kube-system -l k8s-app=kube-dns — are CoreDNS pods running?
  3. Check /etc/resolv.conf inside the pod — does it point to CoreDNS service IP?
  4. Check the ndots value — default 5 means short names are tried as FQDN first; this can hide real DNS bugs.
  5. For cross-namespace resolution, FQDN is service-name.namespace.svc.cluster.local.

5.4 NetworkPolicy debugging

Once a NetworkPolicy exists in a namespace, the default-deny effect kicks in. Things that used to work stop working.

5.5 Node debugging

When the node itself is the problem:

M5 · Troubleshooting · free resources

Udemy:

Official docs + runbooks:

Hands-on:

What to learn in order:

  • The 6 commands: kubectl get pods/events/describe pod/logs --previous/exec/debug/node-shell/top. These answer 80% of the questions.
  • Symptom-to-layer mapping: Pending = scheduler; CrashLoop = container; ImagePull = registry; NotReady = probes; 5xx from ingress = upstream or TLS.
  • DNS debugging: nslookup kubernetes.default from inside a debug pod; check CoreDNS pods; check service name typos.
  • NetworkPolicy debugging: cilium hubble observe; from-pod curl with verbose; remember default-deny once a NetworkPolicy exists.
  • Node debugging: kubectl debug node/<name> --image=busybox; check kubelet journalctl; disk pressure; PIDs pressure; memory pressure.
back to contents ↑

6. Bare-metal + storage

The "PREFERRED EXPERIENCE" section of the JD asks for bare-metal Kubernetes and high-performance storage integration. This is your biggest gap. This module closes it.

Kubernetes (control plane + workloads) the API surface you actually expose kubelet + containerd host agents, managed locally Cilium / Calico (CNI) BGP for on-prem routing Rook / Ceph (CSI) block, file, object on bare disks OS (Ubuntu / RHEL) kernel tuning, huge pages for GPU GPU driver + toolkit CUDA, nvidia-container-toolkit Local registry (Harbor) air-gapped friendly, image scanning Hardware servers, NICs, switches, PDUs GPU A100/H100/L4 with NVLink, fabric Storage NVMe, Ceph, high-perf parallel FS BARE-METAL GAPS YOU MUST LEARN - PXE / iPXE boot and Tinkerbell / Metal3 for provisioning (no cloud-init magic) - Kernel modules for GPU passthrough, huge pages, CPU isolation (isolcpus, tuned) - High-performance storage: parallel filesystems (Lustre, GPFS/IBM Spectrum Scale, Weka), RDMA/RoCE for low-latency
Bare-metal Kubernetes stack: layers from hardware up, each with its own failure mode. You must learn the layers below Kubernetes to debug the layers above it.

6.1 Provisioning without cloud magic

On bare-metal there is no cloud-init, no metadata service, no auto-scaling group. You provision with PXE/iPXE boot + a provisioning tool.

The flow is the same in all three: define machine -> PXE boot -> write image to disk -> hand off to kubeadm or Cluster API.

6.2 Rook + Ceph for stateful workloads

Rook runs Ceph as a Kubernetes operator. You define a CephCluster CR; Rook creates MON, MGR, OSD, MDS, RGW as StatefulSets with PersistentVolumes on the raw disks.

For AI workloads the storage class needs high IOPS; tune CRUSH map for the workload, use NVMe SSDs for OSDs, separate pools for hot data (training checkpoints) and cold (archived datasets).

6.3 High-performance filesystems

For AI training that needs many nodes reading the same dataset at once, parallel filesystems are the answer.

You mount these via a POSIX CSI driver; pods use them as a regular PVC. The trick is RDMA/RoCE on the network for low-latency access.

6.4 GPU tuning on bare-metal

Three knobs that matter most:

  1. Huge pages — CUDA allocates large memory blocks. Configure huge pages at boot, expose via sysctl + pod resources.hugepages-*.
  2. CPU isolationisolcpus= on the kernel command line reserves CPUs for GPU work. Pair with irqaffinity to keep interrupts off the isolated CPUs.
  3. NUMA pinning — GPU on PCIe slot 0 is on NUMA node 0; pin the worker thread to NUMA node 0 with numactl or the kubelet topology manager.

Plus the GPU Operator installs the driver, container toolkit, device plugin, and DCGM exporter in one Helm chart. Production should always use it instead of hand-rolled setup.

6.5 Air-gapped registries (Harbor)

On bare-metal in a regulated environment, you cannot pull from Docker Hub. You mirror upstream images into a local registry and use only those.

M6 · Bare-metal + storage · free resources

Udemy:

  • CKA course (above) — Section 6 (Troubleshooting) covers kubeadm and join procedures.
  • Ceph storage on Linux — the most popular Ceph course; the concepts transfer directly to Rook-Ceph on Kubernetes.

Official docs + projects:

  • Rook (Ceph operator for Kubernetes) — the most common way to run stateful workloads on bare-metal K8s.
  • Ceph — CRUSH map, OSD, MON, MDS.
  • Tinkerbell — bare-metal provisioning for Kubernetes-style declarative infrastructure.
  • Metal3.io — Cluster API provider for bare-metal.
  • Harbor — container registry with vulnerability scanning, the standard for on-prem.

Hands-on:

What to learn in order:

  • Provisioning: PXE/iPXE + Tinkerbell or Metal3; the cloud-init magic doesn't exist on bare-metal.
  • Networking: BGP with Cilium for on-prem routing; MTU 9000 (jumbo frames) for high-throughput; RDMA/RoCE for low-latency.
  • Storage: NVMe + Rook-Ceph for block; object via S3-compatible API; parallel filesystems (Lustre, Spectrum Scale, Weka) for AI workloads.
  • GPU: kernel modules (nvidia, nvidia-uvm), huge pages allocation, CPU isolation (isolcpus), tuned profile for low-latency.
  • Air-gapped registry: Harbor mirrors upstream; in-cluster pull; image signing with cosign.
back to contents ↑

All free resources, one page

Everything below is free or included in your Udemy subscription. The per-module resource strips above have the same content in context; this section is the flat list for planning.

Udemy (you have a subscription)

Official documentation (free, authoritative)

Free hands-on environments

Free "do it once, learn everything" projects

Free video series (YouTube)

back to contents ↑