Production operations and best practices

Production operations and best practices

Everything in this course, as one checklist.

Platform

AreaPractice
Control plane3 control plane nodes (odd etcd quorum), or a managed service
Upgradesone minor version at a time, every ~4 months; control plane first, then nodes (drain, upgrade kubelet, uncordon)
Certificateskubeadm certs expire after 1 year: kubeadm certs check-expiration
Backupsetcd snapshots + Velero, tested restores
Capacityheadroom for one node failure + rolling updates
AccessOIDC for people, no shared admin kubeconfig, audit log to SIEM
PoliciesPSA baseline everywhere, restricted where possible; admission policies
Networkdefault-deny NetworkPolicies per namespace
Observabilitymetrics, logs, alerts on symptoms, runbooks per alert

Workloads

AreaPractice
Imagespinned tags/digests, scanned, non-root, minimal
Resourcesrequests on everything, memory limits, quotas per namespace
Healthreadiness + liveness (+ startup), no dependency checks in liveness
Availability≥ 2 replicas, anti-affinity / spread, PDB
ConfigConfigMaps/Secrets, nothing baked into images; secrets from a vault
Identityown ServiceAccount, no token unless needed, least-privilege RBAC
DeliveryGitOps (Argo CD / Flux), Helm or Kustomize, no kubectl edit in prod
Shutdownhandle SIGTERM, terminationGracePeriodSeconds fits the app

Incidents

graph LR D[detect<br/>alert] --> T[triage<br/>impact, severity] --> M[mitigate<br/>rollback, scale, failover] --> R[resolve<br/>root cause fix] --> P[postmortem<br/>blameless, actions]

Mitigate first, investigate second: kubectl rollout undo restores service while you look for the cause. Write the postmortem: timeline, impact, root cause, what went well, action items with owners.

Upgrade in one screen (kubeadm)

# control plane
sudo apt-get install -y kubeadm=1.36.x-*        # next minor only
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.36.x
# each node, one at a time
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
sudo apt-get install -y kubelet=1.36.x-* kubectl=1.36.x-* && sudo systemctl restart kubelet
kubectl uncordon <node>

References