- Pod
- Smallest deployable unit: one or more containers sharing network namespace (localhost) and volumes. Mortal by design - you almost never create bare pods; a controller owns them.
- Deployment
- Desired state for stateless pods: image, replica count, update strategy. Manages ReplicaSets to do rolling updates and rollbacks. The default answer for "how do I run my API."
- Service
- Stable virtual IP + DNS name load-balancing across pods selected by label. Types: ClusterIP (in-cluster, default), NodePort (port on every node), LoadBalancer (cloud LB). Solves "pods die and change IPs."
- Ingress
- L7 HTTP routing into the cluster: host/path rules + TLS termination, fulfilled by an ingress controller (nginx, ALB, Traefik). One LB fanning out to many Services instead of one LB each.
- ConfigMap
- Non-secret config as env vars or mounted files, decoupled from the image. Pods don't see updates to env-injected values until restarted.
- Secret
- Same shape as ConfigMap for sensitive values - but only base64-encoded, not encrypted, by default. Real answer: encryption at rest + RBAC, or an external manager (Vault, AWS Secrets Manager) via CSI/operator. Saying "Secrets are encrypted" is the trap.
- StatefulSet
- Pods with stable identity: sticky names (db-0, db-1), stable DNS, per-pod PersistentVolumes, ordered rollout. For databases, Kafka, anything where replicas aren't interchangeable.
- DaemonSet
- Exactly one pod per (matching) node. Node-level agents: log shippers, monitoring, CNI plugins.
- Job / CronJob
- Run-to-completion workloads with retries (Job); on a schedule (CronJob). Batch processing, migrations, nightly reports.
- Namespace
- Virtual cluster partition for grouping, RBAC scoping, and ResourceQuotas. team-a/prod-vs-staging separation without separate clusters.
- HPA (HorizontalPodAutoscaler)
- Scales a Deployment's replicas on CPU/memory/custom metrics. Targets utilization relative to requests - which is why unset requests break autoscaling.