You are the artifact.
This course is the pipeline that ships you to production.
A first-principles path from zero infrastructure experience to designing, securing, automating and operating enterprise cloud-native systems. Every module is a stage; you move through them the way code moves from a commit to a running, observed, scalable service.
01What this is
This is a full DevOps bootcamp fused with a Cloud Architecture specialization — roughly 150–250 hours of guided, practical learning. It does not stop at "here is the command." Every concept is taught from first principles: why it exists, what problem it solves, why enterprises adopt it, when not to use it, and what the trade-offs cost you in money, reliability, and security.
The same systems run at Netflix, Stripe, Uber, Spotify, Airbnb and Shopify; throughout the course you will see how those companies actually solve the problem you are studying, so the patterns stick to something real.
Software delivery is a manufacturing line. Code is raw material; containers are standardized shipping units; Kubernetes is the warehouse robot fleet; CI/CD is the conveyor belt; observability is quality control; the cloud is the rented factory. Hold that picture and every tool below has an obvious place.
02Who it's for
Complete beginners
No Linux, cloud or infra background needed. Module 1 starts at "what is a terminal."
Developers moving to DevOps
You can code, but pipelines, clusters and infra are a black box. This makes them concrete.
Engineers eyeing architect roles
The later modules and the parallel Architect track focus on system design, governance and cost.
03How to use it
- Move through the pipeline in order. Each stage assumes the one before it. The colored rail on the left shows your journey from Foundations (steel) to Architect (amber).
- Do the labs, don't just read them. The terminal cards are meant to be typed out in a real sandbox. Reading a
kubectlcommand teaches nothing; breaking a cluster teaches everything. - Build the projects. Every module ends in something deployable. Push it to a public GitHub repo — that repo becomes your portfolio.
- Map to a certification. Each module lists the exam objectives it covers (CKA, CKAD, Terraform Associate, AWS/Azure/GCP). Use the Certification Roadmap to sequence them.
- Follow the cadence. The Weekly Study Plan turns 200 hours into a realistic 12–16 week schedule at ~12–15 h/week.
04The five tracks of the pipeline
The twelve modules group into five colored phases. Each phase changes what kind of engineer you are.
By the end you can take a raw application and: containerize it, ship it through an automated pipeline onto a highly-available Kubernetes cluster, provision the whole cloud footprint as code across AWS/Azure/GCP, secure the supply chain, instrument it with metrics/logs/traces, and defend the architecture — cost, reliability and DR included — to an executive.
The learning path & teaching method
Ten phases of progression, one rule: every chapter is built so it can only be understood because you understood the last one. No leaps, no assumed knowledge.
01The progression
The course is engineered as a ramp, not a reference manual. You climb through ten escalating phases:
| # | Phase | What changes in you |
|---|---|---|
| 1 | Beginner fundamentals | You stop fearing the terminal and the cloud. |
| 2 | Intermediate practical skills | You can build and run real containerized apps. |
| 3 | Advanced engineering | You operate clusters and write production pipelines. |
| 4 | Enterprise architecture | You design systems, not just deploy them. |
| 5 | Production best practices | You make choices that survive 3 a.m. incidents. |
| 6 | Real-world projects | You have a portfolio of deployable systems. |
| 7 | Interview preparation | You can explain trade-offs under pressure. |
| 8 | Industry certifications | You hold credentials employers filter on. |
| 9 | Case studies | You reason from how real companies solved it. |
| 10 | Future trends | You can place new tools in a stable mental model. |
02First-principles, always
Most material teaches how: "run this command." That produces engineers who are helpless the moment reality differs from the tutorial. This course refuses that. For every technology you will always get six things:
- Why it exists — the pain that created it.
- What problem it solves — stated in plain business terms.
- Why enterprises adopt it — the scale or risk that justifies the complexity.
- When not to use it — the cases where it is over-engineering.
- Alternatives — what else solves the same problem and how they differ.
- Business impact — what it costs and what it earns.
kubectl apply is a button. An engineer who knows why Kubernetes uses a declarative reconciliation loop can debug it, replace it, and decide when a Lambda would have been cheaper. The second engineer gets paid twice as much. This course builds the second engineer.03What every module gives you
Concept layer
- Plain-English explanation before any jargon
- Real-world analogy
- Architecture & flow diagrams
- Internal working & data flow
Practice layer
- Guided labs with real commands
- A deployable project
- Troubleshooting / debugging scenarios
- Reflection questions
Production layer
- Common mistakes & anti-patterns
- Best practices & production recommendations
- Security, cost, scaling, reliability notes
- Decision-making frameworks
Career layer
- Certification objective mapping
- Interview questions with answers
- Curated free / open-source resources
- Real customer implementations
04A note on resources
Everything recommended in this course is free or open-source wherever a free option exists: official documentation, open-source projects, public datasets, free cloud sandboxes and community tooling. You can complete the entire path without paying for a course platform — only optional certification exams cost money.
Cloud Engineer vs Cloud Architect
The same curriculum serves two destinations. The early modules build the Engineer; the later modules and the architectural lens throughout build the Architect. Knowing which you are aiming for changes how you study.
The Cloud / DevOps Engineer
Builds and runs the system. Lives in the terminal and the pipeline. Measured on shipping working software reliably.
- Writes Dockerfiles & optimizes images
- Builds CI/CD pipelines
- Deploys & operates Kubernetes
- Writes Terraform modules
- Debugs infrastructure incidents
- Implements monitoring & alerts
The Cloud Architect
Decides what to build and why. Lives in diagrams, trade-off tables and executive rooms. Measured on systems that scale, survive and stay affordable.
- Designs scalable, resilient systems
- Selects technologies & vendors
- Owns security & DR architecture
- Drives cost optimization & governance
- Plans multi-region & HA strategy
- Communicates with executives
You cannot architect what you have never operated. Every strong architect was first an engineer who felt the pain of bad decisions at 3 a.m. Do the engineering modules properly even if "architect" is your goal — the trade-off intuition you need is forged there, not in slides.
01How the same task looks at each level
| Situation | Engineer asks | Architect asks |
|---|---|---|
| New service to deploy | Which base image and how many replicas? | Should this be a service at all, or an event consumer / serverless function? |
| Traffic is growing | How do I add an HPA and node autoscaling? | What is the cost curve at 10×, and where does this architecture break? |
| A region went down | How do I fail traffic over to the standby? | What RTO/RPO did we promise, and does the spend match the risk? |
| Security review | How do I scan images and rotate secrets? | What is our supply-chain threat model and compliance boundary? |
Linux Foundations
Every container, every server, every Kubernetes node is Linux. If Linux is a mystery, everything above it is magic — and you cannot debug magic. This module makes the operating system concrete.
01Learning objectives
By the end of this module you will be able to:
- Navigate the filesystem, manage files, and read any path on sight
- Understand the user / group / other permission model and fix "permission denied"
- Inspect and control processes, signals, and resource usage
- Read and configure basic Linux networking (interfaces, ports, DNS, firewall)
- Install and manage software with
apt/yum/dnf - Write Bash scripts that automate real server tasks with variables, loops, conditionals and functions
Linux is free, open-source, endlessly scriptable, and stripped down it boots in milliseconds with almost no overhead. That is exactly what you want when you are launching ten thousand identical machines. Over 90% of cloud workloads and effectively all container images are Linux. Windows can be skipped at the start; Linux cannot.
02Core concepts
Everything is a file
Linux's founding idea: a hard disk, a network socket, a running process, even your keyboard — the kernel exposes nearly all of them as files you can read from and write to. This is why the same handful of tools (cat, grep, >) work on everything.
The filesystem hierarchy
There are no drive letters. Everything hangs off a single root /. The important branches: /etc (configuration), /var (logs & changing data), /home (user files), /usr (installed programs), /tmp (scratch), /proc & /sys (live kernel state as files), /bin & /sbin (essential commands).
Permissions: user, group, other
Every file has an owner, a group, and three permission triplets — read (4), write (2), execute (1). chmod 750 deploy.sh means: owner can do everything (7=4+2+1), group can read & execute (5), everyone else gets nothing (0). This single idea is behind most "it works on my machine but not on the server" failures.
flowchart TB U["You — the User / Shell (bash, zsh)"]:::u S["Shell interprets your command
expands variables, globs, pipes"]:::s K["Kernel — schedules CPU, manages memory,
talks to devices, enforces permissions"]:::k H["Hardware — CPU · RAM · Disk · Network"]:::h U -->|"types: ls -l /var"| S S -->|"syscall: openat, read"| K K -->|"electrical signals"| H H -->|"bytes"| K --> S -->|"prints result"| U classDef u fill:#EAF0FF,stroke:#2B57F0,color:#1B3CC0,stroke-width:1.5px; classDef s fill:#EFE8FC,stroke:#7444D9,color:#3d2c63,stroke-width:1.5px; classDef k fill:#FBEFD7,stroke:#D9870C,color:#7a4a06,stroke-width:1.5px; classDef h fill:#E1F4EB,stroke:#0E9C66,color:#0a5c3c,stroke-width:1.5px;
03Hands-on labs
Spin up a free sandbox (killercoda.com or any Ubuntu VM) and run:
# where am I, what's here, who am I $ pwd && ls -la && whoami # make a project, inspect permission bits $ mkdir -p app/logs && touch app/run.sh $ ls -l app # note the -rw-r--r-- string # make the script executable for the owner only $ chmod 744 app/run.sh && ls -l app/run.sh # follow live kernel state — every process is a folder $ ls /proc | head && cat /proc/cpuinfo | grep -m1 "model name"
Reflect: why does /proc/cpuinfo have a size of 0 but still print content?
# top processes by memory, the Unix way: compose small tools $ ps aux --sort=-%mem | head -5 # what's listening on which port? $ sudo ss -tlnp # can I reach the world? resolve DNS + check route $ dig +short github.com && ip route # send a signal: start, find, gracefully stop a process $ sleep 300 & ; jobs -l $ kill -TERM %1
Write bootstrap.sh that prepares a fresh Ubuntu server: updates packages, creates a non-root deploy user, installs a web server, opens the firewall, and logs every step. This is the seed of all infrastructure automation.
#!/usr/bin/env bash # bootstrap.sh — idempotent server setup. Run: sudo ./bootstrap.sh set -euo pipefail # fail fast, fail loud LOG="/var/log/bootstrap.log" log(){ echo "[$(date -Is)] $*" | tee -a "$LOG"; } log "Updating package index" apt-get update -y && apt-get upgrade -y if ! id deploy &>/dev/null; then log "Creating deploy user" useradd -m -s /bin/bash deploy fi for pkg in nginx ufw curl; do log "Installing $pkg"; apt-get install -y "$pkg" done log "Configuring firewall" ufw allow OpenSSH && ufw allow 'Nginx Full' && ufw --force enable log "Done. Nginx status: $(systemctl is-active nginx)"
Extend it: make it accept the package list as arguments; add a --dry-run flag; re-run it twice and confirm it changes nothing the second time (idempotency).
04Common mistakes & best practices
Running everything as root (one typo wipes the box) · chmod 777 to "fix" permissions (it's a security hole, not a fix) · parsing ls output in scripts (it breaks on spaces — use globs/find) · not quoting variables ("$var" not $var).
Always start scripts with set -euo pipefail. Prefer least-privilege users. Make scripts idempotent. Log with timestamps. Use shellcheck on every script before committing.
05Certification mapping
06Interview preparation
Q1What's the difference between a hard link and a symbolic link?
A hard link is a second name pointing at the same inode (same physical data); delete the original and the data survives. A symbolic link is a tiny file containing a path to another file; delete the target and the symlink dangles. Hard links can't cross filesystems or link directories; symlinks can do both.
Q2A process is stuck. Walk me through diagnosing it.
Find it with ps/top; check state (R/S/D/Z) — D means uninterruptible I/O wait, often disk/NFS. Inspect open files with lsof -p PID, syscalls with strace -p PID, and resource limits. Try kill -TERM (graceful) before kill -KILL (forced). A Zombie means the parent never reaped it — fix the parent.
Q3Explain what happens between typing a command and seeing output.
The shell parses the line, expands variables/globs, resolves the binary via $PATH, then fork()s and exec()s it. The kernel schedules the new process, which makes system calls (e.g. read) the kernel services by talking to hardware. Output is written to the file descriptor for stdout, which the terminal renders.
07Free resources
Git & GitHub
Git is the time machine and the collaboration layer for everything you will build. In modern DevOps the Git repository is the single source of truth — pipelines, infrastructure and deployments all trigger from it. Master Git and you've mastered the trigger for the entire pipeline.
01Learning objectives
- Explain Git's three states (working dir → staging → committed) and the object model
- Branch, merge, rebase, and resolve merge conflicts without panic
- Choose between Git Flow and trunk-based development for a given team
- Run a professional Pull Request & code-review workflow
- Use tags, releases, and
.gitignorecorrectly - Recover from mistakes with
reflog,revert, andreset
Before Git, teams emailed zip files and overwrote each other's work. Git is distributed — every clone is a full backup with complete history — and it makes branching nearly free, so a hundred developers can work in parallel and reconcile their work safely. GitOps takes this further: the Git repo becomes the literal definition of what's running in production.
02Core concepts
The three areas
A file moves through three places: the working directory (your edits), the staging area / index (changes marked for the next snapshot), and the repository (committed history). git add stages; git commit snapshots. Understanding this removes 80% of Git confusion.
Commits are snapshots, not diffs
Each commit is a full snapshot of your tree plus a pointer to its parent, identified by a SHA hash. A branch is just a movable pointer to a commit. That's why branching is instant — Git only writes a tiny pointer file.
Merge vs rebase
Merge ties two histories together with a merge commit — it preserves exactly what happened. Rebase replays your commits on top of another branch — it rewrites history for a clean, linear log. Rule of thumb: rebase your local work to tidy it; never rebase commits others have already pulled.
gitGraph
commit id: "init"
commit id: "feat-a"
branch feature-login
checkout feature-login
commit id: "form"
commit id: "validation"
checkout main
commit id: "hotfix"
merge feature-login id: "PR #42 merged"
commit id: "release v1.0" tag: "v1.0"
03Branching strategies — a decision framework
| Strategy | Best for | Trade-off |
|---|---|---|
| Trunk-based | High-velocity teams with strong CI & feature flags (Google, most startups) | Demands excellent automated tests & discipline; tiny short-lived branches. |
| Git Flow | Versioned/released software with formal release cycles | Many long-lived branches; heavier, slower, more merge pain. |
| GitHub Flow | Continuously deployed web apps | Simple (branch → PR → deploy) but assumes deploy-on-merge. |
Most elite-performing teams in the DORA research use trunk-based development with short-lived branches and feature flags, because long-lived branches are where integration pain compounds. Reach for Git Flow only when you genuinely ship versioned releases.
04Hands-on labs
$ git init demo && cd demo $ echo "v1" > app.txt && git add . && git commit -m "init" # two branches edit the SAME line -> a conflict $ git switch -c feature && echo "feature change" > app.txt && git commit -am "feat" $ git switch main && echo "main change" > app.txt && git commit -am "main" $ git merge feature # CONFLICT — open app.txt, pick the right content $ git add app.txt && git commit # conflict resolved # the safety net: see EVERY move you've made $ git reflog
On GitHub: create a repo, protect main (require PR + 1 review + passing checks), then simulate two contributors. Each opens a feature branch, raises a PR, requests review, addresses comments, and merges. Add a CODEOWNERS file and a PR template. You now have the exact workflow used at every serious engineering org.
- Enable branch protection rules on
main - Open 2 PRs that touch overlapping files; resolve the conflict in the PR
- Add a GitHub Actions check so PRs can't merge while tests fail (foreshadows Module 5)
- Tag a release:
git tag -a v1.0 -m "first release" && git push --tags
05Common mistakes & recovery
Committing secrets (.env, keys) — they live in history forever; use .gitignore + secret scanning · giant commits ("fixed stuff") · force-pushing shared branches · committing build artifacts · using reset --hard without understanding it.
Undo a public commit safely: git revert <sha> (new commit that reverses it). Recover "lost" work: git reflog then git checkout <sha>. Unstage: git restore --staged <file>. There is almost nothing in Git you cannot undo — that's the whole point.
06Certification & interview
Q1Difference between git merge and git rebase, and when do you use each?
Merge preserves true history with a merge commit; rebase rewrites your commits onto a new base for a linear history. Use rebase to clean up local commits before sharing; use merge to integrate completed, reviewed branches. Golden rule: never rebase commits that already exist on a remote others use.
Q2How do you remove a secret accidentally committed two weeks ago?
Deleting it in a new commit is not enough — it's still in history. You must rewrite history with git filter-repo (or BFG), force-push, and — critically — rotate the secret, because you must assume it's already compromised. Then add it to .gitignore and enable push protection / secret scanning.
07Free resources
Docker & Containers
"It works on my machine" is the most expensive sentence in software. Containers kill it by packaging your app and its entire environment into one portable, immutable unit that runs identically on a laptop, a CI runner, and a production cluster.
01Learning objectives
- Explain why containers exist and how they differ from virtual machines
- Describe the Docker architecture: client, daemon, images, containers, registry
- Understand image layers, the build cache, volumes and networks
- Write efficient multi-stage Dockerfiles and slash image size
- Orchestrate multi-container apps with Docker Compose
- Apply container security: non-root users, image scanning, minimal base images
02Containers vs Virtual Machines — the key idea
A VM virtualizes hardware: each one carries a full guest operating system, so it's heavy (gigabytes) and slow to boot (minutes). A container virtualizes the operating system: containers share the host kernel and isolate only the application's processes and files using Linux namespaces (isolation) and cgroups (resource limits). The result is megabytes, not gigabytes, and millisecond startup.
flowchart TB
subgraph VM["VIRTUAL MACHINES — heavy"]
direction TB
H1["Host OS + Hypervisor"]:::base
G1["Guest OS"]:::vm --> A1["App A"]:::app
G2["Guest OS"]:::vm --> A2["App B"]:::app
H1 --> G1 & G2
end
subgraph CT["CONTAINERS — lightweight"]
direction TB
H2["Host OS + Container Runtime"]:::base
H2 --> C1["bins/libs → App A"]:::app
H2 --> C2["bins/libs → App B"]:::app
H2 --> C3["bins/libs → App C"]:::app
end
classDef base fill:#0F1A2B,stroke:#2B57F0,color:#cdd9f0;
classDef vm fill:#FBEFD7,stroke:#D9870C,color:#7a4a06;
classDef app fill:#EAF0FF,stroke:#2B57F0,color:#1B3CC0;
03Core concepts
Image vs container
An image is a read-only template (a class). A container is a running instance of that image (an object). Images are built once and run anywhere; you can spawn a hundred identical containers from one image.
Layers & the build cache
An image is a stack of read-only layers, one per Dockerfile instruction. Layers are cached and shared between images. The practical consequence: order your Dockerfile from least- to most-frequently-changing. Copy package.json and install dependencies before copying your source, so a code change doesn't bust the dependency cache.
Volumes & networks
Containers are ephemeral — when one dies its writable layer is gone. Volumes persist data outside the container lifecycle (databases, uploads). Networks let containers talk to each other by name on an isolated virtual network instead of by brittle IP.
04Multi-stage builds — the production technique
Your build tools (compilers, dev dependencies) should never ship to production. Multi-stage builds use one stage to build and a second, tiny stage to run — carrying only the final artifact across. This routinely cuts an image from 1.2 GB to under 50 MB.
# ---- Stage 1: build ---- FROM node:20 AS build WORKDIR /app COPY package*.json ./ RUN npm ci # cached unless deps change COPY . . RUN npm run build # ---- Stage 2: runtime (tiny) ---- FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html USER nginx # never run as root EXPOSE 8080 HEALTHCHECK CMD wget -qO- localhost:8080 || exit 1
05Hands-on labs
$ docker build -t myapp:1.0 . $ docker run -d -p 8080:8080 --name web myapp:1.0 # what's actually inside? layers + size $ docker history myapp:1.0 $ docker images myapp # compare size before/after multi-stage # exec into a running container to debug $ docker exec -it web sh # view logs + resource usage live $ docker logs -f web ; docker stats web
Containerize a real 3-tier app — a React frontend, a backend API (pick Node, Python, Java or Go), and a Postgres database — and wire them together with Docker Compose. This is the canonical "containerize everything" exercise and directly prepares you for Kubernetes.
# docker-compose.yml services: web: build: ./frontend ports: ["3000:80"] depends_on: [api] api: build: ./backend environment: DATABASE_URL: postgres://app:secret@db:5432/app depends_on: [db] db: image: postgres:16-alpine volumes: ["pgdata:/var/lib/postgresql/data"] environment: POSTGRES_PASSWORD: secret volumes: pgdata:
Then run: docker compose up --build. Containerize the same backend in two languages and compare image sizes (Go vs Java is dramatic).
06Mistakes, security & best practices
Running as root inside the container · using :latest (non-reproducible builds) · baking secrets into images (they're extractable from layers) · giant base images (use alpine/distroless) · one process becomes a "fat" container running everything — one concern per container.
Pin versions. Use multi-stage + minimal/distroless bases. Add a USER and a HEALTHCHECK. Scan every image with trivy or docker scout in CI. Use .dockerignore. Consider rootless Docker for defense in depth.
07Enterprise example
Spotify packages hundreds of microservices as containers so any team can deploy independently without coordinating environments. Shopify runs one of the largest containerized Rails fleets in the world — containers let them scale predictably for Black Friday traffic spikes by simply launching more identical units.
08Certification & interview
Q1How do you reduce a Docker image's size?
Multi-stage builds (ship only the artifact); a minimal base (alpine/distroless); combine RUN commands and clean package caches in the same layer; use .dockerignore; remove build-time dependencies. Verify with docker history and dive.
Q2Container exits immediately on start. How do you debug it?
Check docker logs <id> for the crash, and the exit code via docker inspect. A container lives only as long as its main process (PID 1) — if the command finishes or errors, it exits. Common causes: wrong CMD, a foreground process that backgrounds itself, or a missing file. Override the entrypoint to get a shell: docker run -it --entrypoint sh <image>.
09Free resources
Kubernetes
One container is easy. A thousand containers across fifty machines — self-healing, auto-scaling, rolling out new versions with zero downtime — is the hard problem Kubernetes was built to solve. This is the largest and most career-defining module in the course.
01Learning objectives
- Explain the control-plane / worker-node architecture and what each component does
- Work fluently with Pods, ReplicaSets, Deployments, StatefulSets, DaemonSets
- Expose apps with Services, Ingress, and understand cluster DNS & service discovery
- Manage configuration & secrets with ConfigMaps and Secrets
- Handle storage with Persistent Volumes, PVCs and Storage Classes
- Secure access with RBAC and isolate workloads with Namespaces
- Package apps with Helm; autoscale and run highly-available, multi-region clusters
You don't tell Kubernetes how to do things step by step. You declare the desired state ("I want 5 replicas of this image") and a control loop continuously compares desired vs actual state and fixes any drift. A node dies? It reschedules the Pods. A container crashes? It restarts it. This single loop is the source of Kubernetes' self-healing superpower — and of its complexity.
02Architecture
flowchart TB
subgraph CP["CONTROL PLANE — the brain"]
API["kube-apiserver
front door, all traffic"]:::api
ETCD[("etcd
cluster state DB")]:::etcd
SCH["scheduler
places Pods on nodes"]:::cp
CM["controller-manager
runs reconcile loops"]:::cp
API <--> ETCD
SCH --> API
CM --> API
end
subgraph N1["WORKER NODE 1"]
K1["kubelet"]:::node --> P1["Pod"]:::pod
KP1["kube-proxy"]:::node
end
subgraph N2["WORKER NODE 2"]
K2["kubelet"]:::node --> P2["Pod"]:::pod
KP2["kube-proxy"]:::node
end
API -->|"desired state"| K1 & K2
DEV(["You: kubectl apply"]):::dev --> API
classDef api fill:#2B57F0,stroke:#1B3CC0,color:#fff;
classDef etcd fill:#FBEFD7,stroke:#D9870C,color:#7a4a06;
classDef cp fill:#EFE8FC,stroke:#7444D9,color:#3d2c63;
classDef node fill:#DEF3F1,stroke:#0C9488,color:#0a5048;
classDef pod fill:#EAF0FF,stroke:#2B57F0,color:#1B3CC0;
classDef dev fill:#0F1A2B,stroke:#2B57F0,color:#cdd9f0;
| Component | Job (plain English) |
|---|---|
| kube-apiserver | The only front door. Every command and component talks through it. Validates and persists changes. |
| etcd | The cluster's memory — a key-value database holding the entire desired & actual state. Lose it and you lose the cluster. |
| scheduler | Decides which node a new Pod should run on, based on resources, affinity and constraints. |
| controller-manager | Runs the reconcile loops that make reality match desired state. |
| kubelet | The agent on each node. Starts containers and reports health back to the API server. |
| kube-proxy | Programs network rules so Services route traffic to the right Pods. |
03The workload objects
Pod
Smallest unit — one or more tightly-coupled containers sharing network & storage. You rarely create these directly.
Deployment
Manages stateless apps: declares replicas, handles rolling updates & rollbacks. Your default workload object.
StatefulSet
For stateful apps (databases) needing stable identity, ordered startup, and per-Pod persistent storage.
DaemonSet
Runs one Pod on every node — perfect for log collectors, monitoring agents, and CNI plugins.
04A first Deployment + Service
# deployment.yaml — declarative desired state apiVersion: apps/v1 kind: Deployment metadata: {name: web} spec: replicas: 3 selector: {matchLabels: {app: web}} template: metadata: {labels: {app: web}} spec: containers: - name: web image: myapp:1.0 ports: [{containerPort: 8080}] resources: # ALWAYS set these requests: {cpu: 100m, memory: 128Mi} limits: {cpu: 500m, memory: 256Mi} readinessProbe: # don't send traffic until ready httpGet: {path: /healthz, port: 8080}
05Hands-on labs
Use a free local cluster — kind, minikube, or k3d:
$ kubectl apply -f deployment.yaml $ kubectl get pods -o wide # 3 pods across nodes # watch self-healing: delete a pod, it comes back $ kubectl delete pod -l app=web --field-selector ...; kubectl get pods -w # scale by changing desired state $ kubectl scale deploy/web --replicas=10 # zero-downtime rollout + rollback $ kubectl set image deploy/web web=myapp:2.0 $ kubectl rollout status deploy/web $ kubectl rollout undo deploy/web # instant revert
Take your Compose app from Module 3 and run it properly on Kubernetes: Deployments for stateless services, a StatefulSet for Postgres with a PVC, a ConfigMap + Secret for configuration, a Service for internal discovery, and an Ingress for external traffic. Then add a HorizontalPodAutoscaler and package the whole thing as a Helm chart.
- Namespace-isolate the app; apply RBAC so the deploy account has least privilege
- Add liveness + readiness probes to every workload
- Configure an HPA targeting 70% CPU; load-test it and watch Pods scale
- Convert raw YAML into a parameterized Helm chart with
values.yaml - (Stretch) Deploy to a managed cluster (EKS/GKE/AKS) and add a second region
06Mistakes, security & best practices
No resource requests/limits (one Pod starves the node) · no health probes (traffic hits dead Pods) · Secrets as plain ConfigMaps · cluster-admin for everything · treating Pods as pets (they're cattle — designed to die) · running databases in plain Deployments without persistent storage.
Set requests/limits and probes on everything. Use namespaces + RBAC + NetworkPolicies. Externalize config. Use Helm/Kustomize for repeatability. Enable Pod Security Standards. Spread replicas across nodes/zones with topology constraints for HA.
07When NOT to use Kubernetes
Kubernetes is a heavy hammer. For a simple website, a single API, or an early-stage startup, it is often over-engineering — a managed PaaS (Cloud Run, App Runner, Fly.io) or plain serverless will be cheaper, simpler and faster to ship. Adopt Kubernetes when you have many services, need fine-grained control, or genuinely operate at scale. The complexity tax is real; pay it deliberately.
08Enterprise example
Kubernetes itself descends from Google's internal Borg. Airbnb, Spotify and Pinterest run thousands of services on it to give teams self-service deployment. The pattern is consistent: a central platform team operates the clusters; product teams ship to them through paved-road tooling — exactly the Engineer/Architect split from the intro.
09Certification & interview
Q1A Pod is stuck in Pending. What's wrong?
Pending means the scheduler can't place it. Run kubectl describe pod and read Events. Usual causes: insufficient CPU/memory on any node, a node selector/affinity/taint that nothing satisfies, or an unbound PVC (no matching PV/StorageClass). Fix the constraint or add capacity.
Q2Explain the difference between a Deployment and a StatefulSet.
A Deployment manages interchangeable, stateless Pods with random names and no ordering. A StatefulSet gives each Pod a stable, ordinal identity (db-0, db-1), ordered rolling updates, and its own persistent volume that survives rescheduling. Use Deployments for web/API tiers, StatefulSets for databases, Kafka, and anything that needs stable identity or storage.
Q3How does a request reach a Pod from outside the cluster?
External DNS → cloud load balancer → Ingress controller (e.g. NGINX) which routes by host/path → a Service (stable virtual IP) → kube-proxy load-balances to a healthy Pod selected by labels. Cluster DNS (CoreDNS) resolves Service names internally so services find each other by name, not IP.
10Free resources
CI/CD — Continuous Integration & Delivery
This is the conveyor belt of the whole pipeline. CI/CD turns "a human runs some commands and prays" into "every commit is automatically built, tested, scanned and shipped." It is the difference between deploying quarterly and deploying a hundred times a day.
01Learning objectives
- Distinguish Continuous Integration, Delivery and Deployment
- Design a multi-stage pipeline: build → test → scan → package → deploy
- Manage secrets, artifacts and caching in pipelines
- Implement safe deployment strategies: rolling, blue-green, canary, feature flags, shadow
- Build real pipelines in GitHub Actions (and read Jenkins/GitLab CI)
- Add automated rollbacks and notifications
CI = every commit is merged and tested continuously, so integration bugs surface in minutes, not at a painful end-of-quarter "merge week." CD = the tested artifact is automatically pushed toward production. Smaller, more frequent releases are less risky, not more — a tiny change is easy to reason about and trivial to roll back.
02Anatomy of a pipeline
flowchart LR C(["git push"]):::g --> B["Build
compile + image"]:::s B --> T["Test
unit + integration"]:::s T --> Q["Scan
SAST + image CVEs"]:::s Q --> A["Package
push to registry"]:::s A --> ST["Deploy → Staging"]:::d ST --> G{"Gate:
approve?"}:::gate G -->|yes| PR["Deploy → Prod
(canary → full)"]:::p G -->|no| X["Rollback / fix"]:::x classDef g fill:#0F1A2B,stroke:#2B57F0,color:#cdd9f0; classDef s fill:#EAF0FF,stroke:#2B57F0,color:#1B3CC0; classDef d fill:#DEF3F1,stroke:#0C9488,color:#0a5048; classDef p fill:#E1F4EB,stroke:#0E9C66,color:#0a5c3c; classDef gate fill:#FBEFD7,stroke:#D9870C,color:#7a4a06; classDef x fill:#FBEAE8,stroke:#DB433A,color:#8c241d;
03Deployment strategies — the decision table
| Strategy | How it works | Use when |
|---|---|---|
| Rolling | Replace instances gradually, a few at a time | Default; stateless apps, backward-compatible changes |
| Blue-Green | Two identical envs; flip traffic instantly; keep old as instant rollback | Zero-downtime + fast rollback needed; can afford 2× infra briefly |
| Canary | Send 1–5% of traffic to the new version, watch metrics, then ramp | High-risk changes; you have good observability to judge health |
| Feature flags | Ship code dark, toggle features per-user at runtime | Decouple deploy from release; A/B tests; gradual rollout |
| Shadow | Mirror real traffic to the new version without serving its responses | Validate performance/correctness with zero user risk |
04Hands-on project
Build a complete pipeline that triggers on push: runs tests, builds & scans a Docker image, pushes it to a registry, and deploys to your Kubernetes cluster — with a manual approval gate before production.
# .github/workflows/deploy.yml on: { push: { branches: [main] } } jobs: build-test-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci && npm test # CI: fail fast on red tests - run: docker build -t $REG/app:${{ github.sha }} . - run: trivy image --exit-code 1 $REG/app:${{ github.sha }} # block on CVEs - run: docker push $REG/app:${{ github.sha }} - run: kubectl set image deploy/web web=$REG/app:${{ github.sha }}
Extend: add an environment: production with required reviewers (manual gate); add a Slack notification on success/failure; add an automatic rollback step if rollout status fails.
05Tools & when to pick them
| Tool | Sweet spot |
|---|---|
| GitHub Actions | Default for GitHub repos; huge marketplace; YAML, zero infra to run |
| GitLab CI | All-in-one DevOps platform; strong if you live in GitLab |
| Jenkins | Maximum flexibility & plugins; self-hosted; legacy-heavy enterprises |
| Argo CD | GitOps for Kubernetes — Git is the source of truth, Argo reconciles the cluster |
Secrets hardcoded in pipeline YAML (use the platform's secret store + OIDC) · flaky tests that everyone ignores · no rollback path · deploying straight to prod with no staging/canary · slow pipelines nobody waits for (cache dependencies, parallelize).
Keep pipelines fast (<10 min) and deterministic. Fail fast. Scan in-pipeline. Use OIDC for cloud auth instead of long-lived keys. Make every deploy reversible. Tag images by commit SHA, never :latest.
06Certification & resources
Infrastructure as Code
Clicking around a cloud console to build infrastructure is slow, unrepeatable, and undocumented. IaC defines your entire cloud — networks, servers, databases, permissions — in version-controlled code you can review, diff, and recreate identically in seconds.
01Learning objectives
- Explain declarative IaC and why it beats manual/imperative provisioning
- Write Terraform: providers, resources, variables, outputs, modules
- Manage state safely — remote backends, locking, and why state is sacred
- Structure reusable modules and multiple environments with workspaces
- Compare Terraform vs CloudFormation vs Pulumi vs OpenTofu
Manually-built infrastructure suffers configuration drift — environments quietly diverge until "works in staging, breaks in prod." IaC makes infrastructure reproducible, reviewable and disposable: the same code builds dev, staging and prod identically, and a destroyed environment is one apply away from rebirth.
02The Terraform workflow & state
Terraform's loop is write → plan → apply. plan shows you exactly what will change before it happens — the killer feature. The state file is Terraform's map of what it manages in the real world; it is the most sensitive artifact in the system.
# main.tf — a tiny, real example terraform { backend "s3" { bucket = "my-tfstate", key = "prod/net", dynamodb_table = "tf-lock" } } resource "aws_instance" "web" { ami = var.ami_id instance_type = "t3.micro" tags = { Name = "web-${var.env}" } } output "public_ip" { value = aws_instance.web.public_ip }
Never commit state to Git (it contains secrets) · never edit it by hand · always use a remote backend with locking (or two engineers' simultaneous applies corrupt it) · always run plan and read it before apply.
03Tool comparison
| Tool | Language | Notes |
|---|---|---|
| Terraform | HCL (declarative) | Multi-cloud standard; huge provider ecosystem; license now BSL |
| OpenTofu | HCL | Open-source Terraform fork (Linux Foundation); drop-in compatible |
| CloudFormation | YAML/JSON | AWS-native, deeply integrated, but AWS-only |
| Pulumi | Python/TS/Go | Real programming languages; great for complex logic & devs |
04Project
With Terraform (AWS free tier), build a VPC with public/private subnets, a security group, an EC2 instance (or an EKS cluster), and an S3 bucket — all as reusable modules with a remote state backend. Then create dev and prod with the same module and different variables. Destroy and rebuild to prove reproducibility.
- Use a remote S3 + DynamoDB backend with locking
- Parameterize everything via
variables.tf; exposeoutputs.tf - Refactor repeated resources into a
modules/folder - Run
terraform planin CI on every PR (foreshadows policy-as-code in Module 9)
Remote, locked, encrypted state. Small composable modules. Plan-on-PR, apply-on-merge. Pin provider versions. Tag every resource (owner, env, cost-center). Never make manual console changes to IaC-managed resources.
05Certification & resources
Cloud Platforms — AWS · Azure · GCP
The cloud is the rented factory everything runs in. You don't need to memorize all three providers — you need the mental model of cloud building blocks (compute, network, storage, identity) so you can map any service in any provider to a concept you already understand.
01Learning objectives
- Map the core building blocks (compute, networking, storage, IAM, databases) across providers
- Understand regions, availability zones, and the shared responsibility model
- Stand up compute, a VPC/VNet, object storage and managed databases
- Reason about cloud cost models and the basics of cost control
- Deploy the same infrastructure to all three clouds and compare
The cloud trades capital expense (buying servers) for operating expense (renting them by the second), with effectively infinite elasticity. You stop guessing capacity and start paying for exactly what you use — and you inherit global infrastructure no startup could build itself. The trade-off is cost-at-scale and lock-in, which is where the architect earns their salary.
02The same concept, three names
| Concept | AWS | Azure | GCP |
|---|---|---|---|
| VMs | EC2 | Virtual Machines | Compute Engine |
| Serverless functions | Lambda | Functions | Cloud Functions |
| Managed Kubernetes | EKS | AKS | GKE |
| Object storage | S3 | Blob Storage | Cloud Storage |
| Virtual network | VPC | VNet | VPC |
| Managed SQL | RDS | SQL Database | Cloud SQL |
| Identity | IAM | Entra ID | Cloud IAM |
Pick AWS (largest market share, most jobs) or whichever your target employers use, learn it deeply, then the others become a translation exercise. Spreading thin across all three early just produces shallow knowledge of all of them.
03Cost & the shared responsibility model
Two ideas the architect must internalize. Shared responsibility: the provider secures the cloud (hardware, hypervisor); you secure what's in it (your data, IAM, patching). Cost: compute is billed per-second, storage per-GB-month, and — the silent killer — egress (data leaving the cloud) is expensive. Architecture decisions are cost decisions.
04Project
Using Terraform with three providers, deploy the same simple stack (a VM + object storage bucket + firewall rule) to AWS, Azure and GCP. Document the differences in service names, defaults, and — eye-openingly — cost. Use only free-tier resources.
- Reuse one Terraform module structure, swap providers
- Note IAM/identity differences between the three
- Tear everything down with
terraform destroyto avoid charges
Always set a billing alert before you start. Use least-privilege IAM, never the root account for daily work. Tag resources for cost attribution. Deploy across multiple AZs for resilience. Prefer managed services unless you have a strong reason to self-host.
05Certification & resources
Observability
You cannot operate what you cannot see. When a distributed system misbehaves at 3 a.m., observability is the difference between a five-minute fix and a five-hour outage. This is the quality-control station of the pipeline.
01Learning objectives
- Distinguish the three pillars: metrics, logs, traces — and when to use each
- Understand monitoring vs observability
- Collect metrics with Prometheus and visualize with Grafana
- Aggregate logs (Loki / ELK) and trace requests (OpenTelemetry / Jaeger)
- Set meaningful alerts on symptoms, not noise
Monitoring answers known questions ("is CPU high?") with predefined dashboards. Observability lets you ask new questions about novel failures you never anticipated, by exploring rich telemetry. In a monolith, monitoring sufficed. In microservices, where a single request crosses dozens of services, you need observability to follow it.
02The three pillars
Metrics
Numbers over time (CPU, latency, error rate). Cheap to store, great for dashboards & alerts. Prometheus.
Logs
Timestamped event records. Rich detail for the "why," but voluminous. Loki / ELK.
Traces
The path of one request across all services, with timing per hop. Finds the slow link. OpenTelemetry / Jaeger.
03Project
Instrument your Module 4 microservices app: deploy Prometheus to scrape metrics, Grafana for dashboards, Loki for logs, and OpenTelemetry + Jaeger for traces. Build a dashboard showing the "golden signals" (latency, traffic, errors, saturation) and wire one alert.
- Use the
kube-prometheus-stackHelm chart for a one-command setup - Add a RED dashboard (Rate, Errors, Duration) per service in Grafana
- Trace a request end-to-end through Jaeger and find the slowest span
- Define an alert: error rate > 1% for 5 min → notification
Alert on symptoms users feel (high latency, errors) not causes (high CPU). Avoid alert fatigue — every alert must be actionable. Use structured (JSON) logs. Adopt OpenTelemetry as the vendor-neutral standard so you're never locked in. Don't log secrets or PII.
04Resources
Security — DevSecOps
Security bolted on at the end is security that fails. DevSecOps shifts security left — into every stage of the pipeline you've built — so vulnerabilities are caught at commit time, not by an attacker in production.
01Learning objectives
- Apply identity foundations: IAM, RBAC, OAuth, OIDC, SSO — and least privilege
- Manage secrets properly with Vault and cloud secret managers
- Embed scanning in CI: SAST, DAST, dependency & container scanning
- Enforce policy as code (OPA/Gatekeeper, Kyverno)
- Secure the software supply chain: SBOMs, image signing (Sigstore/cosign), SLSA
A vulnerability fixed at coding time costs almost nothing; the same flaw exploited in production can cost millions and your reputation. "Shift left" means every gate you built in Module 5 also enforces security — scanning, signing, policy — so insecure code simply cannot reach production.
02The DevSecOps toolchain by stage
| Pipeline stage | Security control | Example tools |
|---|---|---|
| Code | SAST, secret scanning | Semgrep, gitleaks, CodeQL |
| Dependencies | SCA (known-vuln dependencies) | Trivy, Snyk, Dependabot |
| Build | Image scan, SBOM, signing | Trivy, Syft, cosign |
| Deploy | Policy as code, admission control | OPA/Gatekeeper, Kyverno |
| Runtime | Secrets, RBAC, threat detection | Vault, Falco, NetworkPolicies |
03Core concepts
Least privilege & zero trust
Grant the minimum permissions needed, nothing more — every identity, service and pipeline. Zero trust assumes the network is already hostile: authenticate and authorize every request, never trust based on network location alone.
Supply chain security
Modern apps are 80%+ third-party code. An SBOM (Software Bill of Materials) inventories every component so you can answer "are we affected by this new CVE?" in seconds. Signing (cosign) proves an image is the one you built and wasn't tampered with — the lesson of SolarWinds and Log4Shell.
04Project
Harden the Module 5 pipeline: add secret scanning & SAST on commit, dependency + container scanning that blocks on critical CVEs, generate and attach an SBOM, sign the image with cosign, and add an OPA/Kyverno policy that refuses to admit unsigned images or Pods running as root.
- Move all secrets to Vault or a cloud secret manager + OIDC (no static keys)
- Generate an SBOM with Syft; scan it with Trivy
- Sign images with cosign; verify at admission
- Write a Kyverno policy: deny
:latest, deny privileged, require resource limits
Never store secrets in code or images — inject at runtime, rotate often, prefer short-lived credentials (OIDC). Scan everywhere. Sign artifacts. Enforce policy as code so security is automatic, not a review bottleneck. Patch fast; an SBOM makes it possible.
05Certification & resources
Cloud Architecture
This is where engineer becomes architect. You stop asking "how do I deploy this?" and start asking "what should we build, and why?" — designing systems that scale to millions, survive regional failures, and stay affordable.
01Learning objectives
- Design microservices & event-driven systems — and know when a monolith is better
- Apply service mesh (Istio/Linkerd), API gateways, CQRS and event sourcing appropriately
- Architect for high availability, disaster recovery and multi-region
- Use caching and async messaging to scale
- Make and defend trade-offs across cost, reliability, latency and complexity
02Monolith vs microservices — the central trade-off
Microservices buy independent scaling and deployment — at the cost of enormous operational and distributed-systems complexity. Most systems should start as a well-structured monolith and extract services only where a real bottleneck or team-boundary justifies it. Premature microservices have sunk more startups than monoliths ever did. Amazon and Netflix went micro because they had thousands of engineers and planet-scale traffic — that is not your situation on day one.
03An event-driven reference architecture
flowchart LR U(["Clients"]):::u --> GW["API Gateway
auth · rate-limit · route"]:::gw GW --> S1["Order svc"]:::svc GW --> S2["User svc"]:::svc S1 -->|publish event| Q[("Message broker
Kafka / SQS")]:::q Q --> S3["Inventory svc"]:::svc Q --> S4["Email svc"]:::svc S1 --> CA[("Cache
Redis")]:::ca S1 --> DB[("DB")]:::db classDef u fill:#0F1A2B,stroke:#2B57F0,color:#cdd9f0; classDef gw fill:#FBEFD7,stroke:#D9870C,color:#7a4a06; classDef svc fill:#EAF0FF,stroke:#2B57F0,color:#1B3CC0; classDef q fill:#EFE8FC,stroke:#7444D9,color:#3d2c63; classDef ca fill:#FBEAE8,stroke:#DB433A,color:#8c241d; classDef db fill:#DEF3F1,stroke:#0C9488,color:#0a5048;
04HA & disaster recovery — the language of risk
Architects speak in RTO (how fast you recover) and RPO (how much data you can lose). These dictate — and are dictated by — spend.
| DR strategy | RTO / RPO | Cost |
|---|---|---|
| Backup & restore | Hours / hours | $ — cheapest |
| Pilot light | ~10s of min | $$ |
| Warm standby | Minutes | $$$ |
| Active-active multi-region | ~Zero | $$$$ — most expensive |
05Capstone-style project
Produce an architecture document + diagram for a global video-streaming platform: ingestion, transcoding, a CDN strategy, recommendation service, multi-region active-active, autoscaling, caching layers, and a failure-mode analysis. Justify every choice in cost/reliability/latency terms, and explicitly state what you'd build differently with 10 engineers vs 1,000.
- Diagram the request path for "user presses play"
- Choose data stores per workload (the right tool, not one DB for everything)
- Define SLOs and the DR strategy with explicit RTO/RPO
- Write the one-page executive summary — the real architect deliverable
Design for failure (everything fails eventually). Prefer loose coupling & async. Cache aggressively but invalidate carefully. Don't distribute until you must. Every architecture is a set of trade-offs — your job is to make them explicitly and defend them, not to chase the newest pattern.
06Resources
Enterprise Operations & SRE
Building a system is one thing; running it reliably and affordably for years is another. This module covers the disciplines that keep enterprise platforms alive: SRE, FinOps, governance, compliance and incident response.
01Learning objectives
- Apply SRE: SLIs, SLOs, SLAs and error budgets
- Run effective incident response & blameless postmortems
- Control cloud spend with FinOps practices
- Establish governance & compliance guardrails (SOC 2, ISO 27001, GDPR basics)
- Design backup & DR operations that are actually tested
02The vocabulary of reliability
| Term | Plain meaning |
|---|---|
| SLI | A measured signal of health, e.g. "% of requests under 200ms" |
| SLO | Your internal target for an SLI, e.g. "99.9% of requests under 200ms" |
| SLA | The contractual promise to customers (with penalties), looser than your SLO |
| Error budget | The allowed unreliability (100% − SLO). Spend it on shipping features; if exhausted, freeze and stabilize |
100% reliability is the wrong target — it's infinitely expensive and slows innovation to zero. The error budget reframes reliability as a resource: it ends the eternal dev-vs-ops war by giving both sides the same number to optimize against. This idea, from Google's SRE practice, is the backbone of modern operations.
03FinOps — engineering meets the bill
Cloud spend is a shared, engineering-driven responsibility. FinOps brings visibility (tag & attribute every dollar), optimization (right-size, autoscale, use spot/savings plans, kill idle resources), and accountability (teams see and own their costs).
04Project
Take your full stack (cluster + pipeline + observability) and run it like an SRE for a week of simulated operations: define SLOs and error budgets, build an on-call alert that pages on SLO burn, run a chaos experiment (kill a node), and write a blameless postmortem. Add a cost dashboard and identify three savings.
- Define 2–3 SLOs with error budgets and a burn-rate alert
- Inject a failure (e.g. with a chaos tool); measure recovery; document RTO/RPO
- Write a postmortem: timeline, root cause, action items — no blame
- Produce a cost-attribution view and a right-sizing recommendation
Make on-call humane (actionable alerts only). Postmortems are blameless — humans err, systems should be resilient. Test your backups by restoring them; an untested backup is a hope, not a plan. Treat cost as a first-class engineering metric. Automate toil away.
05Resources
Capstone Projects
Everything converges here. These end-to-end builds are designed to become the centerpiece of your portfolio and your interview stories — each one exercises the entire pipeline from source to operated production.
Pick one or two and take them all the way — a single deeply-finished project impresses far more than five half-built ones. Push everything to public GitHub repos with excellent READMEs and architecture diagrams. These repos are your résumé.
01The capstone tracks
Every capstone must include: containerization, a CI/CD pipeline, IaC-provisioned cloud infra, Kubernetes deployment, observability, security scanning, and a written architecture doc.
🎬 Netflix-style streaming infra
Microservices, CDN strategy, transcoding pipeline, multi-region active-active, autoscaling.
🛒 E-commerce platform
Event-driven orders/inventory/payments, Black-Friday autoscaling, blue-green deploys.
🏦 Banking platform
High compliance, zero-trust security, audited pipelines, strict DR with tested RTO/RPO.
🏥 Healthcare platform
PII/PHI handling, encryption everywhere, policy-as-code guardrails, access auditing.
☁️ Multi-cloud SaaS
Provisioned across two clouds with Terraform, GitOps with Argo CD, per-tenant isolation.
📊 Real-time analytics
Streaming ingestion (Kafka), stream processing, time-series storage, live dashboards.
🤖 AI application deployment
Model serving on Kubernetes with GPU scheduling, autoscaling, canary model rollouts.
🚀 Zero-downtime GitOps platform
Full GitOps with Argo CD, progressive delivery, automated rollback, drift detection.
02Definition of "done"
- One command (or one
git push) takes it from code to running in the cloud - Infrastructure is 100% codified — destroy and rebuild works
- The pipeline blocks insecure or failing changes automatically
- Dashboards show the golden signals; at least one meaningful alert fires correctly
- A clear README + architecture diagram explains every decision and trade-off
- You can whiteboard the whole system and defend it in an interview
If you can build, ship, secure, observe and operate one of these — and explain why every piece is there — you are no longer learning DevOps and cloud architecture. You're doing it. Now go ship the artifact: you.
Certification Roadmap
Certifications are a forcing function for breadth and a filter many employers screen on. Sequence them with the modules — don't chase a cert before you've done the hands-on work behind it. Exam codes, pricing and availability change; always confirm on the official provider site.
01Suggested sequence
| Order | Certification | After module(s) | Why |
|---|---|---|---|
| 1 | AWS Cloud Practitioner (or AZ-900 / GCP CDL) | 7 | Cheap, broad cloud vocabulary; good confidence win |
| 2 | HashiCorp Terraform Associate | 6 | High ROI; IaC is in demand everywhere |
| 3 | CKAD (Certified Kubernetes App Developer) | 4–5 | Hands-on Kubernetes from a developer's angle |
| 4 | CKA (Certified Kubernetes Administrator) | 4, 8 | The flagship K8s cert; strong signal for ops roles |
| 5 | AWS Solutions Architect Associate (or AZ-104 / GCP ACE) | 7, 10 | The cloud cert most recruiters look for |
| 6 | CKS (Certified Kubernetes Security) | 9 | Advanced; requires a valid CKA first |
| 7 | AWS/Azure/GCP DevOps Professional | 5, 11 | Capstone-level; ties the whole pipeline together |
02By domain
Foundations
Containers & Kubernetes
IaC & CI/CD
Cloud platforms
A portfolio of real, deployed projects (your capstones) beats a wall of certificates. Use certs to structure your learning and pass HR filters — not as a substitute for being able to actually build and operate systems. One or two well-chosen certs + strong GitHub repos is the winning combination.
Weekly Study Plan
200 hours feels infinite until you schedule it. At a sustainable ~13 hours/week (≈2 hrs/weekday + a weekend block), the full path takes about 16 weeks. Adjust to your pace — the order matters more than the speed.
01The 16-week schedule
| Week | Focus | Deliverable |
|---|---|---|
| 1–2 | Module 1 · Linux | Server bootstrap script in a repo |
| 3 | Module 2 · Git & GitHub | Multi-dev PR workflow on a protected repo |
| 4–5 | Module 3 · Docker | 3-tier app running under Docker Compose |
| 6–8 | Module 4 · Kubernetes | Microservices on K8s + Helm chart · sit CKAD |
| 9 | Module 5 · CI/CD | Full GitHub Actions pipeline with gates |
| 10 | Module 6 · IaC | Cloud env as Terraform modules · sit Terraform Associate |
| 11 | Module 7 · Cloud | Same stack on AWS/Azure/GCP · sit a Cloud Practitioner cert |
| 12 | Module 8 · Observability | Prometheus/Grafana/Jaeger stack + alerts |
| 13 | Module 9 · Security | Hardened, signed, policy-gated pipeline |
| 14 | Module 10 · Architecture | Netflix-scale design doc + diagram |
| 15 | Module 11 · Enterprise Ops | SLOs, chaos test, postmortem, cost review |
| 16+ | Module 12 · Capstone | One end-to-end project, portfolio-ready |
02A sustainable weekly rhythm
Weekdays · ~2 hrs each
- 30 min — read the concept, watch one video
- 60–75 min — do the lab hands-on
- 15 min — note what broke & how you fixed it
Weekend · ~3 hr block
- Build/extend the module project
- Push to GitHub with a clean README
- Review the week's interview questions aloud
Consistency beats intensity — 2 focused hours daily outperforms a 14-hour weekend cram. Always end a session by writing down one thing you learned. Teach a concept to someone (or rubber-duck it) — if you can't explain it simply, you haven't learned it yet.
Resource Library
Every resource here is free or open-source. This is the consolidated list — bookmark it. You can complete the entire path on these alone.
01Free sandboxes & labs
02Documentation (always the primary source)
03Free books & deep references
04Open-source tooling to know
05One reference repo to start from
Built as a complete, navigable learning path — Modules 1, 3 and 4 carry the deepest treatment; the remaining modules give you the full roadmap, core concepts, a hands-on project, and curated resources, ready to expand to that same depth whenever you want to go further on a specific topic.