Kubernetes Learning Roadmap

From your first container to running production clusters: 33 topics in four stages, each with what to learn, free resources, a hands-on task and links to tools that help. Everything runs on a free local cluster, so you can learn without a cloud bill. Filter by certification to focus on KCNA, CKAD, CKA or CKS. Written for Kubernetes v1.37.

The roadmap in detail

Everything from the map above, on one page. Dashed topics are optional. The hours are rough estimates for reading plus hands-on practice.

Stage 1 · Beginner Foundations

Understand what Kubernetes is for and how it is built, get a cluster running on your laptop and learn to talk to it with kubectl and YAML.

Containers and images

Kubernetes runs containers, so start there. A container image packages your app with everything it needs, and a container is a running instance of it, isolated with Linux namespaces and cgroups. Images are built from a Dockerfile in layers and stored in a registry such as Docker Hub, GitHub Container Registry or Amazon ECR. Kubernetes doesn't use Docker itself to run them. It talks to a runtime such as containerd or CRI-O through the Container Runtime Interface, but images built with Docker work everywhere.

What to learn

  • Images vs containers, layers, and tags vs digests
  • Write a Dockerfile with a multi-stage build and a non-root user
  • Build, run, inspect logs and push to a registry
  • Why images should be small and immutable, and why :latest is a bad tag
  • Container runtimes: containerd, CRI-O and the CRI

Free resources

Practice

Containerise a small web app with a multi-stage Dockerfile that runs as a non-root user, keep the image under 100 MB and push it to a registry.

Tools on this site

Kubernetes architecture

Kubernetes keeps your apps in the state you describe. The control plane holds that desired state and makes it happen: the API server is the front door for everything, etcd stores the state, the scheduler picks a node for each new Pod, and the controller manager runs the loops that keep reality matching what you asked for. Each worker node runs the kubelet (which starts containers through the runtime) and kube-proxy or a CNI plugin for Service networking.

The key idea is declarative configuration: you don't say "start three containers", you say "there should be three". If one dies, a controller notices and replaces it.

What to learn

  • Control plane components and what each does
  • Node components: kubelet, container runtime, kube-proxy
  • Declarative desired state and the reconciliation loop
  • What happens, step by step, when you create a Deployment
  • The cloud native landscape and CNCF projects

Free resources

Practice

On a local cluster, list the control plane Pods in kube-system and explain in one sentence what each one does.

A local cluster: kind, minikube or k3d

You don't need a cloud account to learn Kubernetes. kind runs a whole cluster inside Docker containers and can create multi-node clusters in seconds. minikube is beginner-friendly, with add-ons such as a dashboard and metrics. k3d runs the lightweight k3s distribution. Pick one, learn to create and delete clusters freely, and keep everything you build in YAML files so you can recreate it any time.

For free in-browser practice without installing anything, try the Kubernetes scenarios on Killercoda.

What to learn

  • Install kubectl and one of kind, minikube or k3d
  • Create a multi-node cluster and delete it again
  • Kubeconfig files, contexts and switching clusters
  • Load a locally built image into the cluster

Free resources

Practice

Create a kind cluster with one control-plane and two worker nodes, then switch between it and a second cluster using kubectl contexts.

kubectl and YAML manifests

Every Kubernetes object is described in YAML with four parts: apiVersion, kind, metadata and spec. Apply files with kubectl apply -f and keep them in Git. Learn to generate manifests instead of typing them from memory: kubectl create deployment web --image=nginx --dry-run=client -o yaml gives you a correct starting point. kubectl explain documents every field from the command line. These two habits save a lot of time in hands-on exams.

What to learn

  • YAML syntax: maps, lists, indentation and multi-document files (---)
  • get, describe, apply, delete, logs, exec
  • Generate YAML with --dry-run=client -o yaml
  • Look up fields with kubectl explain pod.spec.containers
  • Output formats: -o wide, -o yaml, -o jsonpath
  • Imperative commands vs declarative apply

Free resources

Practice

Without writing YAML by hand, generate a Deployment manifest, change the replica count to 3 in the file, apply it and print every Pod's IP with -o jsonpath.

Tools on this site

Pods

A Pod is the smallest thing Kubernetes runs: one or more containers that share a network address and can share volumes. Pods are disposable. They get a new IP when replaced and are never "repaired", so you rarely create them directly. Higher-level objects such as Deployments create them for you. Learn the Pod lifecycle (Pending, Running, Succeeded, Failed), restart policies, and how to read kubectl describe pod events. That's where most problems explain themselves.

What to learn

  • Pod spec: containers, image, ports, command and args, env
  • Pod phases, container states and restart policies
  • Read events with kubectl describe
  • kubectl logs (including --previous) and kubectl exec
  • Why you shouldn't create bare Pods in production

Free resources

Practice

Run a Pod with a typo in the image name, find the cause in its events, fix it, then exec into the working Pod and check its environment variables.

Namespaces, labels and selectors

Namespaces divide a cluster into separate areas for teams or environments, each with its own names, permissions and quotas. Labels are key/value tags such as app=web or tier=frontend, and selectors pick objects by label. This is how a Deployment finds its Pods and a Service finds where to send traffic, so a label typo is a classic reason why "my Service has no endpoints". Annotations hold extra information for tools rather than for selection.

What to learn

  • Create namespaces and set a default namespace for your context
  • Labels vs annotations
  • Equality and set-based selectors (-l app=web,tier!=db)
  • ResourceQuotas and LimitRanges per namespace

Free resources

Practice

Create dev and prod namespaces with a ResourceQuota on dev, and try to exceed it.

Linux and networking basics

Kubernetes sits on top of Linux and networking, and troubleshooting quickly takes you there: processes and signals, file permissions, IP addresses and CIDR ranges, ports, DNS and HTTP. If any of these are new, a few hours here will make the rest of the roadmap much easier.

What to learn

  • Shell basics, processes, signals (SIGTERM vs SIGKILL)
  • File permissions and users (why containers shouldn't run as root)
  • IP addresses, CIDR notation and private ranges
  • Ports, DNS records and HTTP status codes

Free resources

Practice

Work out how many addresses a 10.244.0.0/16 Pod network and a 10.96.0.0/12 Service network hold, and check with the CIDR calculator.

Tools on this site

Am I ready? Stage 1 quiz

Which component stores the cluster's state?

  1. The kubelet
  2. etcd
  3. The scheduler
  4. kube-proxy

etcd is the key-value store behind the API server. Back it up and you can recover the cluster's configuration.

Which component decides which node a new Pod runs on?

  1. The kubelet
  2. The API server
  3. The controller manager
  4. The scheduler

The scheduler assigns Pods to nodes. The kubelet on that node then starts the containers.

What's the quickest way to get a correct Deployment manifest to edit?

  1. kubectl create deployment web --image=nginx --dry-run=client -o yaml
  2. Copy one from memory
  3. kubectl get deployment -o wide
  4. kubectl explain deployment and type every field

A client-side dry run prints valid YAML without creating anything. Redirect it to a file and edit.

A Service has no endpoints even though its Pods are running. What is the most likely cause?

  1. The cluster has too few nodes
  2. The image tag is latest
  3. The Service selector doesn't match the Pods' labels
  4. etcd is down

Services find Pods by label. A typo in either the selector or the labels leaves the Service with nothing to send traffic to.

Why shouldn't you create bare Pods for an application?

  1. Pods can't have environment variables
  2. Nothing recreates a bare Pod if it or its node fails
  3. Bare Pods are slower
  4. Bare Pods can't be deleted

Controllers such as Deployments watch their Pods and replace them. A bare Pod is simply gone when its node dies.

Stage 2 · Running applications Deploy, expose and configure apps

The objects you'll use every day to run an application reliably: Deployments, Services, configuration, health checks and resource settings.

Deployments, ReplicaSets and rollouts

A Deployment runs a set number of identical Pods and manages updates to them. Behind the scenes it creates a ReplicaSet per version. When you change the image, it performs a rolling update controlled by maxSurge and maxUnavailable, and you can watch, pause or undo it with kubectl rollout. Blue/green and canary releases are built on the same ideas with labels, two Deployments, or tools such as Argo Rollouts.

What to learn

  • Deployment spec: replicas, selector, Pod template
  • Scale with kubectl scale and change images with kubectl set image
  • Rolling update settings: maxSurge and maxUnavailable
  • kubectl rollout status, history and undo
  • Recreate vs RollingUpdate strategies, blue/green and canary ideas

Free resources

Practice

Deploy version 1 of an app with 4 replicas, roll out a broken version 2, watch the rollout get stuck and roll back with one command.

Services and service discovery

Pods come and go, so other apps can't rely on their IPs. A Service gives a stable virtual IP and DNS name (web.default.svc.cluster.local) and load-balances to whichever Pods match its selector. ClusterIP is reachable inside the cluster only, NodePort opens a port on every node, and LoadBalancer asks the cloud provider for an external load balancer. A headless Service (clusterIP: None) returns the Pod IPs directly, which StatefulSets use.

What to learn

  • ClusterIP, NodePort, LoadBalancer and ExternalName
  • port vs targetPort vs nodePort
  • Service DNS names across namespaces
  • EndpointSlices, and debugging a Service with no endpoints
  • Headless Services

Free resources

Practice

Expose a Deployment with a ClusterIP Service and call it by DNS name from a temporary Pod in another namespace (kubectl run tmp --rm -it --image=busybox).

Tools on this site

ConfigMaps and Secrets

Keep configuration out of images. A ConfigMap holds settings and a Secret holds sensitive values. Both can be injected as environment variables or mounted as files, and mounted files update when the object changes, while environment variables don't. Important: Secret values are only Base64-encoded, not encrypted. Protect them with RBAC, turn on encryption at rest, and consider an external store (such as AWS Secrets Manager or Vault through the External Secrets Operator).

What to learn

  • Create ConfigMaps and Secrets from literals, files and .env files
  • Use them as environment variables (envFrom) and as mounted volumes
  • Which changes reach running Pods and which need a restart
  • Secret types (opaque, TLS, docker-registry) and why Base64 isn't security
  • Encryption at rest and external secret stores

Free resources

Practice

Turn an app's .env file into a ConfigMap and a Secret, mount the Secret as files, then decode a value with kubectl get secret -o jsonpath to see why access must be restricted.

Tools on this site

Health probes

Probes tell Kubernetes whether your container is working. A failing liveness probe restarts the container. A failing readiness probe takes the Pod out of its Services until it recovers, which is what makes rolling updates seamless. A startup probe gives slow-starting apps time before the other probes begin. A common mistake is a liveness probe that checks a database: when the database blips, every Pod restarts at once.

What to learn

  • Liveness vs readiness vs startup probes
  • HTTP, TCP, exec and gRPC probe types
  • initialDelaySeconds, periodSeconds, failureThreshold
  • Graceful shutdown: SIGTERM, terminationGracePeriodSeconds and preStop

Free resources

Practice

Add readiness and liveness probes to your app, then make the readiness endpoint fail on one Pod and confirm it drops out of the Service's endpoints without restarting.

Tools on this site

Resource requests, limits and QoS

Requests are what the scheduler reserves for a container, and limits are the ceiling. Going over the CPU limit slows the container down (throttling). Going over the memory limit kills it (OOMKilled). The combination puts each Pod in a QoS class (Guaranteed, Burstable or BestEffort), which decides who gets evicted first when a node runs short. Pods without requests make scheduling and autoscaling guesswork.

What to learn

  • CPU units (250m) and memory units (256Mi)
  • Requests vs limits, throttling vs OOMKilled
  • QoS classes and eviction order
  • LimitRanges and ResourceQuotas
  • See real usage with kubectl top (needs metrics-server)

Free resources

Practice

Give a container a 64Mi memory limit, run something that uses more, and find OOMKilled in kubectl describe.

Jobs and CronJobs

A Job runs Pods until a task completes, with retries (backoffLimit) and optional parallelism. A CronJob creates Jobs on a schedule written in standard five-field cron syntax, with an optional timeZone. Set concurrencyPolicy to control overlapping runs and history limits so old Jobs get cleaned up.

What to learn

  • Job completions, parallelism, backoffLimit and ttlSecondsAfterFinished
  • CronJob schedules and the timeZone field
  • concurrencyPolicy: Allow, Forbid, Replace
  • Trigger a CronJob by hand with kubectl create job --from=cronjob/…

Free resources

Practice

Write a CronJob that backs up a database every night at 02:30 in your time zone, never runs two copies at once and keeps only the last 3 Jobs.

Tools on this site

Init containers and sidecars

Some Pods need more than one container. Init containers run to completion before the app starts, for example to wait for a database or run migrations. Sidecar containers run alongside the app for its whole life: a log shipper, a proxy, a config reloader. Native sidecars are declared as init containers with restartPolicy: Always, which guarantees they start before and stop after the main container.

What to learn

  • Init containers and their ordering
  • Native sidecar containers (restartPolicy: Always)
  • Sharing files between containers with an emptyDir volume
  • Common patterns: sidecar, ambassador, adapter

Free resources

Practice

Build a Pod whose init container waits until a Service resolves in DNS, and whose sidecar tails the app's log file from a shared emptyDir.

Am I ready? Stage 2 quiz

A container keeps getting restarted with reason OOMKilled. What happened?

  1. Its CPU limit was too low
  2. The readiness probe failed
  3. It used more memory than its limit
  4. The node ran out of disk

Exceeding the memory limit gets the container killed. Exceeding the CPU limit only throttles it.

Which probe takes a Pod out of a Service without restarting it?

  1. Readiness
  2. Liveness
  3. Startup
  4. None, probes always restart

Readiness controls traffic. Liveness controls restarts. Mixing them up causes needless restarts or traffic to broken Pods.

How are values in a Kubernetes Secret stored by default?

  1. Encrypted with AES-256
  2. Hashed with SHA-256
  3. Encrypted with the node's TPM
  4. Base64-encoded, which anyone with read access can decode

Base64 is an encoding, not encryption. Restrict access with RBAC and enable encryption at rest.

Which Service type is reachable only from inside the cluster?

  1. NodePort
  2. ClusterIP
  3. LoadBalancer
  4. ExternalName

ClusterIP is the default and internal-only. The other types build external access on top of it.

A new image version is broken. What rolls the Deployment back to the previous version?

  1. kubectl delete deployment web
  2. kubectl scale deployment web --replicas=0
  3. kubectl rollout undo deployment/web
  4. kubectl restart web

Deployments keep previous ReplicaSets, so rollout undo switches back in one step.

Stage 3 · Intermediate Networking, storage and packaging

Get traffic into the cluster, control how Pods talk to each other, keep data safe across restarts and package applications so they're easy to install and configure.

Gateway API and Ingress

To route HTTP traffic from outside to your Services by host name and path, Kubernetes now recommends the Gateway API. A platform team defines a GatewayClass and a Gateway (the listener, ports and TLS), and app teams attach HTTPRoutes with their routing rules, header matching, traffic splitting for canaries and more. It's implemented by controllers such as Envoy Gateway, Istio, Cilium, NGINX Gateway Fabric and Traefik, and by cloud load balancers.

The older Ingress API still works and you'll meet it in existing clusters. Note that the popular community Ingress NGINX controller was retired in March 2026 and gets no more updates or security fixes, so plan migrations to the Gateway API (the ingress2gateway tool helps).

What to learn

  • GatewayClass, Gateway and HTTPRoute, and who owns each
  • Host and path routing, header matches and weighted traffic splits
  • TLS termination with a certificate Secret (and cert-manager to automate it)
  • Read existing Ingress objects and convert them to HTTPRoutes

Free resources

Practice

Install a Gateway API controller on your local cluster and route app.local/api and app.local/ to two different Services, then send 10% of /api traffic to a new version.

Tools on this site

Cluster networking, DNS and CNI

Kubernetes has a simple network model: every Pod gets its own IP and can reach every other Pod without NAT. A CNI plugin (Calico, Cilium, Flannel and others) makes that happen and often enforces NetworkPolicies too. Services get virtual IPs from a separate range, implemented by kube-proxy or by the CNI (Cilium can replace kube-proxy with eBPF). CoreDNS gives every Service a DNS name. Most "it can't connect" problems are DNS, a wrong port or a policy.

What to learn

  • The Kubernetes network model: Pod IPs, Service IPs, node IPs
  • What a CNI plugin does, and popular choices
  • kube-proxy modes and eBPF alternatives
  • CoreDNS, search domains, and debugging with nslookup from a Pod

Free resources

Practice

From a debug Pod, resolve a Service in another namespace by its short name, its namespaced name and its full name, and explain why the short name fails.

Tools on this site

NetworkPolicies

By default every Pod can talk to every other Pod. NetworkPolicies are firewalls for Pods: once a policy selects a Pod, only the traffic it allows gets through, chosen by Pod labels, namespaces or IP ranges, for ingress, egress or both. Start with a default-deny policy per namespace, then open only what each app needs. Remember that policies only work if your CNI plugin enforces them.

What to learn

  • podSelector, namespaceSelector and ipBlock rules
  • Default-deny ingress and egress policies
  • Allow DNS egress (port 53) so a default-deny doesn't break everything
  • Check which CNI plugins enforce policies

Free resources

Practice

In a namespace with a frontend, an API and a database, apply default-deny, then allow only frontend → API and API → database, plus DNS. Prove that frontend → database is blocked.

Tools on this site

Volumes, PersistentVolumes and StorageClasses

Container files disappear when the container restarts. Volumes fix that: an emptyDir lives as long as the Pod, while a PersistentVolumeClaim asks for durable storage that outlives Pods. A StorageClass tells the cluster how to create that storage on demand through a CSI driver (for example EBS volumes on AWS). Access modes (ReadWriteOnce, ReadWriteMany) and the reclaim policy decide who can mount it and what happens to the data when the claim is deleted.

What to learn

  • emptyDir, hostPath (and why to avoid it), configMap and secret volumes
  • PersistentVolume vs PersistentVolumeClaim, and static vs dynamic provisioning
  • StorageClasses and CSI drivers
  • Access modes and reclaim policies (Retain vs Delete)
  • Volume expansion and snapshots

Free resources

Practice

Run a database with a PersistentVolumeClaim, write some data, delete the Pod and confirm the data is still there when it comes back.

StatefulSets and DaemonSets

A StatefulSet is for apps where each replica has an identity, such as databases and message brokers: Pods get stable names (db-0, db-1), stable DNS through a headless Service, their own PersistentVolumeClaim each, and start and stop in order. A DaemonSet runs one Pod on every node (or every matching node), which is how log collectors, monitoring agents and CNI plugins are deployed.

What to learn

  • StatefulSet identity, ordering and volumeClaimTemplates
  • Headless Services for stable per-Pod DNS
  • DaemonSets, node selectors, taints and tolerations
  • When a managed database beats running one in Kubernetes

Free resources

Practice

Run a 3-replica StatefulSet and reach web-1 directly by its DNS name. Then run a DaemonSet that only lands on nodes with a logging=true label.

Helm

Helm is the package manager for Kubernetes. A chart is a set of templated manifests plus a values.yaml of defaults. Installing it creates a release you can upgrade, roll back and uninstall as a unit. Most third-party software (monitoring stacks, databases, controllers) is installed with Helm, so you'll use other people's charts far more often than you write your own.

What to learn

  • Add repositories, search, install, upgrade, roll back and uninstall
  • Override values with -f values.yaml and --set
  • Render templates locally with helm template to see what will be applied
  • Chart structure, templates and helpers
  • OCI registries for charts

Free resources

Practice

Install a chart from Artifact Hub with custom values, upgrade it, roll back, then package your own app as a chart with a configurable replica count and image tag.

Tools on this site

Kustomize

Kustomize customises plain YAML without templates. You keep a base and add overlays per environment that patch it: more replicas in prod, a different image tag in staging, extra labels everywhere. It's built into kubectl (kubectl apply -k) and works well with GitOps tools. Many teams use Helm for third-party software and Kustomize for their own apps.

What to learn

  • kustomization.yaml: resources, namePrefix, labels, images
  • Bases and overlays for dev / staging / prod
  • Strategic merge and JSON patches
  • configMapGenerator and secretGenerator

Free resources

Practice

Create a base for your app and dev/prod overlays that change replicas, image tag and resource limits. Preview each with kubectl kustomize before applying.

Tools on this site

Am I ready? Stage 3 quiz

In the Gateway API, which object do application teams usually create to route their traffic?

  1. GatewayClass
  2. HTTPRoute
  3. Service of type LoadBalancer
  4. NodePort

Platform teams own GatewayClasses and Gateways. App teams attach HTTPRoutes with their own host and path rules.

You apply a default-deny egress NetworkPolicy and suddenly nothing can reach any Service by name. Why?

  1. NetworkPolicies delete Services
  2. The CNI plugin crashed
  3. Egress policies block Pod IPs but not names
  4. DNS traffic (port 53) to CoreDNS is now blocked too

Name lookups go to CoreDNS. Allow UDP/TCP port 53 egress alongside a default-deny.

Which workload gives each replica a stable name and its own persistent volume?

  1. StatefulSet
  2. Deployment
  3. DaemonSet
  4. ReplicaSet

StatefulSets use volumeClaimTemplates and ordinal names such as db-0, which databases need.

What does a StorageClass do?

  1. Backs up volumes every night
  2. Encrypts Secrets
  3. Describes how to create storage on demand when a PVC asks for it
  4. Limits how much storage a namespace may use

With dynamic provisioning, a PVC that names a StorageClass gets a new volume created by the CSI driver.

How do you see exactly what a Helm chart will create before installing it?

  1. helm install --force
  2. helm template (or install --dry-run)
  3. kubectl get all
  4. helm repo update

Rendering locally shows the final YAML, which is handy for reviews and for diffing upgrades.

Stage 4 · Advanced Production and operations

Secure the cluster, scale with demand, see what's happening, deploy through Git, troubleshoot fast and keep the cluster itself healthy and up to date.

RBAC and ServiceAccounts

Role-based access control decides who may do what. A Role lists allowed verbs (get, list, create…) on resources in one namespace, and a ClusterRole does the same cluster-wide. RoleBindings and ClusterRoleBindings grant them to users, groups or ServiceAccounts, which are the identities Pods use to call the API. Pods get short-lived, automatically rotated tokens. Grant the minimum, and check with kubectl auth can-i.

What to learn

  • Roles vs ClusterRoles, RoleBindings vs ClusterRoleBindings
  • ServiceAccounts and projected, short-lived tokens
  • kubectl auth can-i --as=system:serviceaccount:ns:name
  • Turn off token mounting for Pods that don't call the API
  • How cloud identities map to Kubernetes users (for example EKS access entries)

Free resources

Practice

Create a ServiceAccount that can only list Pods in one namespace, run a Pod with it, and prove with kubectl auth can-i that it can't delete anything.

Tools on this site

Pod security

A container that runs as root, with a writable filesystem and every Linux capability, is a gift to an attacker. Use the securityContext to run as a non-root user, drop capabilities, block privilege escalation and make the root filesystem read-only. Enforce this cluster-wide with Pod Security Admission, which applies the baseline or restricted Pod Security Standards per namespace through labels (it replaced PodSecurityPolicy). For custom rules, use the built-in ValidatingAdmissionPolicy or Kyverno.

What to learn

  • securityContext: runAsNonRoot, readOnlyRootFilesystem, allowPrivilegeEscalation, capabilities
  • Pod Security Standards: privileged, baseline, restricted
  • Pod Security Admission namespace labels (enforce, audit, warn)
  • Policy engines: ValidatingAdmissionPolicy, Kyverno, OPA Gatekeeper

Free resources

Practice

Label a namespace to enforce the restricted standard, watch an ordinary nginx Pod get rejected, then fix its securityContext until it's accepted.

Tools on this site

Autoscaling

Kubernetes can scale at three levels. The Horizontal Pod Autoscaler adds or removes Pods based on CPU, memory or custom metrics (it needs metrics-server and correct resource requests). The Vertical Pod Autoscaler recommends or sets better requests. Node autoscaling with the Cluster Autoscaler or Karpenter adds nodes when Pods can't be scheduled and removes idle ones. For event-driven scaling (queue length, for example), there's KEDA.

What to learn

  • HPA with CPU targets, min/max replicas and scaling behaviour
  • metrics-server and why requests matter for HPA
  • VPA recommendations
  • Cluster Autoscaler vs Karpenter
  • PodDisruptionBudgets so scale-downs and upgrades don't take an app offline

Free resources

Practice

Put an HPA on your app targeting 50% CPU, generate load with a busy-loop Pod and watch replicas climb and then settle back down.

Monitoring and logging

In production you need to know what's happening before users tell you. Prometheus scrapes metrics from your apps and the cluster, Grafana turns them into dashboards, and Alertmanager sends alerts. The kube-prometheus-stack Helm chart installs all three with useful defaults. For logs, a DaemonSet such as Fluent Bit ships container output to a store such as Loki or a cloud service, and OpenTelemetry adds traces that follow a request across services.

What to learn

  • Metrics, logs and traces, and what each is good for
  • Prometheus scraping, PromQL basics and ServiceMonitors
  • Grafana dashboards and Alertmanager rules
  • Log collection with a node agent, and structured (JSON) logs
  • OpenTelemetry basics

Free resources

Practice

Install kube-prometheus-stack with Helm, build a Grafana panel for your app's request rate and create an alert that fires when a Pod restarts more than 3 times in 10 minutes.

Tools on this site

CI/CD and GitOps

A typical pipeline builds and tests the image in CI (for example GitHub Actions), pushes it to a registry, then updates the manifests. With GitOps, a controller inside the cluster (Argo CD or Flux) watches a Git repository and keeps the cluster matching it. Deployments become pull requests, every change has history and review, and drift from manual kubectl edits is undone automatically.

What to learn

  • Build, scan and push images from CI, tagged with the commit SHA
  • GitOps principles: Git as the source of truth, pull-based deploys
  • Argo CD Applications, sync and health status (or Flux Kustomizations)
  • Promote between environments with Kustomize overlays or Helm values

Free resources

Practice

Install Argo CD locally and point it at a Git repo with your Kustomize overlays. Change the replica count in a commit and watch it sync, then edit the Deployment by hand and watch Argo CD revert it.

Tools on this site

Managed Kubernetes: EKS, GKE and AKS

In production most teams use a managed service: Amazon EKS, Google GKE or Azure AKS. The provider runs the control plane, and you choose how nodes are managed (managed node groups, Karpenter, or serverless options such as Fargate and GKE Autopilot). The cloud adds its own integrations: load balancers for Services and Gateways, block storage through CSI drivers, and a way for Pods to get cloud permissions without stored keys (EKS Pod Identity or IRSA, GKE Workload Identity).

What to learn

  • What the provider manages vs what you manage
  • Node options: managed node groups, Karpenter, Fargate / Autopilot
  • Load balancer and storage integrations
  • Pod-level cloud permissions (EKS Pod Identity / IRSA, Workload Identity)
  • Cost: control-plane fees, node sizing, and cleaning up load balancers and volumes

Free resources

Practice

Deploy the app you've built on this roadmap to a managed cluster with a public HTTPS endpoint, then delete the cluster and check that no load balancers or volumes were left behind.

Tools on this site

Troubleshooting

Most problems follow a few patterns. Pending means the scheduler can't place the Pod (not enough resources, taints, an unbound volume). ImagePullBackOff is a wrong image name or missing registry credentials. CrashLoopBackOff means the app starts and exits, so read kubectl logs --previous. A Service that doesn't respond is usually a selector, a port or a NetworkPolicy. Work from the outside in, and let describe and events tell you where to look.

What to learn

  • Pending, ImagePullBackOff, CrashLoopBackOff, OOMKilled and CreateContainerConfigError
  • kubectl get events --sort-by=.lastTimestamp and describe
  • Debug with kubectl debug (ephemeral containers) and port-forward
  • Service → endpoints → Pod checks
  • Node problems: NotReady nodes, kubelet logs, disk and memory pressure

Free resources

Practice

Ask a friend (or write a script) to break your app in five different ways, such as a wrong image, a bad label, a missing ConfigMap, too-small memory and a blocking NetworkPolicy, and find each cause in under five minutes.

Tools on this site

Cluster setup, upgrades and backups

Administrators need to know how a cluster is built and kept alive. kubeadm bootstraps a cluster from plain machines and upgrades it one minor version at a time: control plane first, then each node after draining it. Back up etcd with etcdctl snapshot save and practise restoring it, and use tools such as Velero to back up workloads and volumes. Kubernetes releases about three minor versions a year and each gets roughly a year of patches, so upgrades are routine work, not a one-off.

What to learn

  • Install a cluster with kubeadm on VMs
  • Upgrade the control plane and nodes; drain, cordon and uncordon
  • Back up and restore etcd
  • Certificates and kubeconfig files for admins
  • Workload backups with Velero, and the Kubernetes release and support cycle

Free resources

Practice

Build a one-control-plane, two-worker cluster with kubeadm on VMs, take an etcd snapshot, upgrade it by one minor version, then restore the snapshot to a test cluster.

Supply chain and runtime security

Secure what goes into the cluster and watch what runs there. Scan images for known vulnerabilities (Trivy), sign them and verify signatures before they run (Sigstore cosign plus an admission policy), use minimal or distroless base images, and pin images by digest. At runtime, Falco detects suspicious behaviour, such as a shell starting inside a container. Audit logs record every API request.

What to learn

  • Image scanning in CI and in the registry
  • Image signing and verification
  • Minimal base images and SBOMs
  • Runtime threat detection with Falco, and API audit logging

Free resources

Practice

Add a Trivy scan to your CI pipeline that fails on critical vulnerabilities, then switch your base image until it passes.

Tools on this site

Service mesh

A service mesh adds encryption (mutual TLS), retries, timeouts, traffic splitting and detailed metrics between services without changing application code. Istio (including its sidecar-less ambient mode), Linkerd and Cilium are the common choices. It's powerful but adds moving parts, so reach for it when you have many services and a real need for mTLS or fine-grained traffic control.

What to learn

  • What a mesh adds: mTLS, retries, traffic shifting, observability
  • Sidecar vs sidecar-less (ambient / eBPF) designs
  • How meshes relate to the Gateway API

Free resources

Practice

Install a mesh on your local cluster, turn on mTLS between two services and confirm in its dashboard that traffic is encrypted.

CRDs and operators

Kubernetes can be extended with your own object types. A CustomResourceDefinition (CRD) adds a new kind, such as Certificate or PostgresCluster, and an operator is a controller that watches those objects and does the work, encoding a human operator's knowledge (backups, failover, upgrades) in code. Many tools you've met on this roadmap, such as cert-manager, Argo CD and Prometheus, work this way.

What to learn

  • CRDs: schema, versions and kubectl get on custom kinds
  • The controller pattern and reconciliation loops
  • Install and use an existing operator (for example a database operator)
  • Building operators: kubebuilder or Operator SDK (overview)

Free resources

Practice

Install cert-manager, create a self-signed Issuer and a Certificate, and watch the operator create the TLS Secret for you.

Tools on this site

Certification exam preparation

The Linux Foundation and CNCF run four main Kubernetes exams. KCNA is a 90-minute multiple-choice exam on concepts (US$250). CKAD (developers), CKA (administrators) and CKS (security, requires passing the CKA first) are 2-hour, hands-on exams where you solve tasks in real clusters from a terminal (US$445 each). They're currently based on Kubernetes v1.37, include one free retake and are valid for 2 years. Prices and versions change, so check the official pages.

Hands-on exams reward speed: generate YAML with --dry-run=client -o yaml, use kubectl explain, set an alias (alias k=kubectl), switch to the context each question names, and skip hard questions and come back to them.

What to learn

  • Read the official curriculum for your exam and map it to topics on this page
  • Practise in the exam simulator included with your registration
  • Get fast with imperative commands, explain and vim/nano editing
  • Bookmark the official docs pages you'll need (they're allowed during the exam)
  • Do two full timed practice runs before booking

Free resources

Practice

Finish a full practice exam within the time limit, scoring at least 80%, before you book the real one.

Am I ready? Stage 4 quiz

How do you check whether a ServiceAccount is allowed to delete Pods?

  1. kubectl describe serviceaccount
  2. kubectl get roles
  3. kubectl auth can-i delete pods --as=system:serviceaccount:ns:name
  4. Try it and see

auth can-i evaluates RBAC for any identity without doing anything.

Your HPA shows <unknown> for CPU and never scales. What is the most likely cause?

  1. metrics-server is missing, or the Pods have no CPU requests
  2. The Deployment has too many replicas
  3. The cluster needs a service mesh
  4. HPAs only work on StatefulSets

CPU utilisation is measured against requests, using data from metrics-server. Without either, the HPA has nothing to work with.

A Pod is stuck in CrashLoopBackOff. What should you look at first?

  1. The node's disk usage
  2. The Service selector
  3. The NetworkPolicies
  4. kubectl logs --previous to see why the last run exited

CrashLoopBackOff means the container keeps exiting. The previous run's logs usually say why.

What replaced PodSecurityPolicy for enforcing baseline and restricted Pod settings?

  1. NetworkPolicy
  2. Pod Security Admission
  3. RBAC
  4. ResourceQuota

Pod Security Admission is built in and enforces the Pod Security Standards per namespace through labels.

In GitOps with Argo CD, what happens if someone edits a Deployment by hand with kubectl edit?

  1. Argo CD copies the change back to Git
  2. Nothing, Argo CD only acts on new commits
  3. Argo CD reports drift and, with self-heal on, puts back what Git says
  4. The cluster rejects the edit

Git is the source of truth. The controller detects the difference and can restore the declared state automatically.

How to use this roadmap

  • Learn on a local cluster. Everything up to stage 4's managed-Kubernetes topic works on kind, minikube or k3d on your laptop, or in free browser labs, so there's no cloud bill while you learn.
  • Keep everything in YAML in Git. Build each practice task as files you can re-apply. Deleting and recreating a cluster then takes a minute, and you end up with a portfolio.
  • Track your progress. Tick sub-skills in each topic: ticking the first marks a topic as in progress, ticking them all marks it as done. Use Export to move progress to another device or Share progress to send a link.
  • Aiming for an exam? Use the filter at the top: KCNA for concepts, CKAD for building and deploying apps, CKA for running clusters, CKS for security. Then take the quiz at the end of each stage.
  • Optional topics (dashed borders) don't count towards the percentage.

Which Kubernetes certification first?

If you're new to cloud native, KCNA is a gentle, multiple-choice start. Developers who deploy to Kubernetes usually go for CKAD. Platform and DevOps engineers who build and run clusters take CKA, and CKS builds on it for security. CKAD and CKA overlap a lot, so many people take both within a few months. If you also work with AWS, the AWS learning roadmap covers EKS and the services around it.