$ run as a normal user# run as root (or with sudo)
Build the reference stack
One small app ("shop") from commit to production.
| Layer | Choice | Tools |
|---|---|---|
| Code and review | GitHub, protected main | git, gh |
| Build | Makefile + multi-stage Dockerfile | make, go / npm / mvn, docker or buildah |
| CI | GitHub Actions (tested with act) | act, gh |
| Infra | Azure or AWS from code | terraform / tofu, terragrunt, ansible, packer |
| Cluster | AKS / EKS (cloud) or k3s (lab) | az / eksctl, kubectl, helm, kustomize |
| Delivery | GitOps | argocd or flux, yq |
| Edge | Ingress + TLS, canary | nginx (ingress-nginx) or traefik, istioctl |
| Observe | Metrics, logs, traces, alerts | promtool, grafana-cli, logcli, otelcol, node_exporter |
| Test | Smoke and load | curl, k6 |
| Operate | Servers and runners | systemctl, journalctl, ssh, tmux |
Follow one change through the stack
What happens when you change one line of code.
- You push a branch and open a PR with
gh pr create; CI runsmake lint testin 3 minutes. - After review and merge, CI builds the image once (
docker build), tags it with the commit and pushes it. - CI sets the new tag in the GitOps repo with
yqorkustomize edit set image. argocdsyncs staging; ak6smoke test with thresholds runs against staging.- A pull request promotes the same image tag to production; Istio sends 10 % of traffic to it first.
- Grafana shows errors and latency per version; if the error rate rises,
git revertbrings the old version back.
Start small in the home lab
One weekend per step.
- 3 VMs with Vagrant (or a small cloud account) and Ansible for the base setup.
- k3s with 1 server + 2 agents, or kind on a laptop; Traefik as ingress.
- A small Go or Node app with a Makefile, Dockerfile and GitHub Actions (test it with
act). - Argo CD from a GitOps repo with Kustomize overlays for dev and prod.
- kube-prometheus-stack + Loki; one dashboard and three alerts.
- Terraform (or OpenTofu) for the cloud part, state in a storage account.
- A
k6test in the pipeline that fails when p95 latency is over 300 ms.
At work
Write a README with a diagram and "what I learned" for each step, and link it from your CV — see my DevOps projects.
Answer the common interview questions
Questions you will hear, and the tool behind each answer.
| Question | Short answer |
|---|---|
| How do you deploy without downtime? | Rolling update with readiness probes; canary with Istio or Argo Rollouts |
| How do you roll back? | Helm rollback or git revert in the GitOps repo |
| How do you manage many environments? | Kustomize overlays / Helm values; Terragrunt for infra |
| How do you keep builds the same everywhere? | Lock files, pinned versions, multi-stage Docker builds, build once |
| A pod is in CrashLoopBackOff. What do you do? | kubectl describe, kubectl logs --previous, events |
| How do you know the release is healthy? | Golden signals in Grafana, alerts on error rate, k6 smoke test |
Remember
Tools change; the habits stay: small changes, everything as code, build once, automate the boring parts, watch what runs, and practise the rollback.