Most introductions to Kubernetes start with a list of nouns — Pod, Deployment, Service, Ingress — and by the end you can recite them without being able to predict what the cluster will do. The nouns are the easy part. The idea underneath them is what makes Kubernetes behave the way it does, including the parts that seem perverse at first.
Here is that idea, and then the nouns, in an order that makes them stick.
Who this is for
You can recite Pod, Deployment and Service and still cannot predict what the cluster will do. You do not need to have run one. The nouns are the easy part and they come second here.
The one idea
You do not tell Kubernetes what to do. You tell it what you want to be true, and a control loop spends the rest of its life making reality match.
That is the whole model. You write "three replicas of this image", and a controller notices there are two, and starts one. You delete a pod by hand and something puts it back — not because it is being stubborn, but because you never told it to stop wanting three.
This is why Kubernetes uses desired state rather than commands, and it explains a lot of behaviour that is otherwise baffling:
- Deleting a pod that a Deployment owns does nothing permanent. The controller recreates it. A bare Pod you created yourself has no controller, so it is simply gone.
- To actually stop something, you change what you asked for — scale to zero, or delete the Deployment.
- A "failed deploy" often is not failing. It is trying, repeatedly, and telling you so.
- Nothing is ever "done". The loop keeps running.
Hold that, and the rest follows.
Pods
A Pod is the smallest thing Kubernetes schedules. It wraps one or more containers that share an IP address and can share storage.
apiVersion: v1
kind: Pod
metadata:
name: web
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.30-alpine
ports:
- containerPort: 80
The thing to internalise immediately: you almost never create a Pod directly, and pods are ephemeral. They get rescheduled, replaced, moved between nodes. A pod has no identity worth attaching to, no stable IP, and nothing written to its own filesystem outlives it. Only what goes to a persistent volume does.
Coming from servers, this is the biggest adjustment. A server is a place. A pod is a process that happens to be running somewhere at the moment.
Deployments
A Deployment is how you say "I want N of these, and here is how to replace them when the image changes".
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web # which pods this Deployment owns
template:
metadata:
labels:
app: web # the labels the pods will carry
spec:
containers:
- name: web
image: nginx:1.30-alpine
ports:
- containerPort: 80
Note the two label blocks. selector.matchLabels is what the Deployment claims; template.metadata.labels is what the pods it creates actually carry. They have to agree, and the distinction between "labels on the Deployment object" and "labels on the pods" causes a specific, common failure further down this page.
When you change the image, the Deployment does not edit the running pods. It creates new ones and removes old ones gradually, which is what a rolling update is.
Services
Pods come and go and their IPs change, so nothing can usefully address a pod directly. A Service gives you a stable name and address in front of a set of pods.
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: web # must match the POD labels, not the Deployment's
ports:
- port: 80 # what callers connect to
targetPort: 80 # where it forwards on the pod
A Service selects pods by label and maintains the list of their addresses. Two things must be true for a pod to be in that list: it matches the selector, and it is Ready.
This is where a classic early failure lives. If the selector is written against the Deployment's own labels rather than the pod template's, it matches nothing, the Service exists, DNS resolves, and every connection goes nowhere with no error anywhere. That failure has its own page: Service has no endpoints.
What you will actually meet first
Nobody's first week is spent admiring the object model. It is spent on these:
CrashLoopBackOff — the container starts, exits, and Kubernetes retries with increasing delay. The backoff is the loop being polite, not the error.
ImagePullBackOff — it cannot fetch the image. Check the image name and tag, then the registry credentials, then the network.
Pod stuck in Pending — either no node has accepted it yet, or it has a node and is still pulling its images. In the first case there is no container and no logs; the scheduler records why, per node, and that message is the diagnosis.
OOMKilled — the container exceeded its memory limit and was killed outright. Exit code 137, which is 128 + 9, signal 9, SIGKILL.
If you learn to read those four, you can operate a cluster long before you understand all of it.
The two settings that decide most behaviour
Requests and limits. A request is a reservation the scheduler honours; a limit is a ceiling the kernel enforces. They do different jobs, so set each deliberately: requests equal to limits is what gives a pod the Guaranteed QoS class, and a limit set without a request is silently copied into the request. requests vs limits covers what each controls, and why a cluster can be full at 10% utilisation covers what happens when everyone rounds their requests up.
Readiness and liveness probes. Readiness decides whether a pod receives traffic; liveness decides whether it gets restarted. Confusing them produces either a pod that is killed for being slow to start or one that receives traffic before it can serve it. readiness vs liveness is the distinction.
Getting a feel for the loop
Two commands teach the model faster than any diagram.
# Watch the controller work. Delete a pod in another terminal and see what happens.
kubectl get pods -w
# Ask why something is the way it is. The events at the bottom are the answer
# to almost every "why is this not working" question.
kubectl describe pod <pod>
kubectl describe is the single most useful command in Kubernetes and it is chronically underused by people new to it. The Events section is the cluster telling you, in plain language, what it tried and what happened.
If you are starting in 2026
Added 1 November 2026. Three things older tutorials will not tell you:
- Ingress still works, but it is finished. The Kubernetes documentation calls the Ingress API frozen: generally available, with no plans for removal, and no new features. New work goes into Gateway API, which is installed separately as CRDs plus a controller.
- The ingress-nginx controller was retired on 24 March 2026. Existing installs keep working but get no more security fixes, so do not choose it for a new cluster.
- Nodes need cgroup v2. From Kubernetes 1.35 the kubelet refuses to start on
a cgroup v1 host unless told otherwise.
stat -fc %T /sys/fs/cgroup/printscgroup2fson a node that is ready.
The differences between the two routing APIs are on Ingress vs Gateway API, and what breaks between 1.33 and 1.37 is on the Kubernetes upgrade checklist.
What to skip for now
Kubernetes has an enormous surface and most of it is not load-bearing for a beginner. You can defer StatefulSets, operators and custom resources, network policies, service meshes, and most of the storage model until you have a reason.
What you cannot defer: the control loop, labels and selectors, and reading events. Everything else is built on those three.
Mentioned in this article
- Kubernetes Resource CalculatorTool · Runs in the browser
Tagged with
Enjoyed this article?
Get more DevOps insights delivered to your inbox.
Get new posts by email
Subscribe to get an email when a new blog post is published. Skip anytime.
No spam, unsubscribe anytime.
Terms used here (21)plain definitions
Short definitions for the vocabulary on this page, in case any of it is new. Each links to the full entry.
- ArgoCD
- A declarative GitOps continuous delivery tool for Kubernetes. ArgoCD continuously compares the live state in the cluster with the desired state in Git, reports any drift as OutOfSync, and syncs the two either on demand or automatically when an automated sync policy is enabled, keeping an audit trail of application events.
- ConfigMap
- A Kubernetes object used to store non-confidential configuration data as key-value pairs. ConfigMaps decouple configuration from container images, allowing the same image to be used across different environments with different settings.
- DaemonSet
- A Kubernetes controller that ensures a copy of a specific Pod runs on every (or selected) node in the cluster. DaemonSets are commonly used for node-level concerns like log collection agents, monitoring exporters, and network proxies.
- Deployment
- A Kubernetes resource that manages a set of identical Pods and provides declarative updates, rolling updates, and rollback to an earlier revision on request; it does not roll back a failed rollout by itself. Deployments are the standard way to run stateless applications on Kubernetes.
- EKS
- Amazon Elastic Kubernetes Service — a managed Kubernetes service that runs the Kubernetes control plane across multiple AWS availability zones. EKS removes the operational burden of running your own Kubernetes control plane, and with EKS Auto Mode it can manage the worker nodes too.
- Helm
- A package manager for Kubernetes whose packages, called 'charts', are collections of files — chiefly templated Kubernetes manifests and their default values — used to define, install, and upgrade applications. Helm simplifies complex deployments by bundling related Kubernetes resources into a single, versioned package.
- HPA
- Horizontal Pod Autoscaler — a Kubernetes resource that automatically scales the number of Pod replicas based on observed CPU utilization, memory usage, or custom metrics. HPA enables applications to handle variable workloads without manual intervention.
- Ingress
- A Kubernetes resource that manages external HTTP and HTTPS access to services within a cluster. An Ingress does nothing until an Ingress controller is installed; the controller handles TLS termination, name-based virtual hosting, and path-based routing. The Ingress API is stable but frozen — it is no longer being developed, though there are no plans to remove it — and Kubernetes recommends Gateway API for new work.
- Kubernetes
- An open-source container orchestration platform that automates the deployment, scaling, and management of containerized applications across clusters of machines. It works declaratively: you describe the state you want, and its controllers continuously work to move the cluster toward it.
- Liveness Probe
- A Kubernetes health check that determines when a container needs restarting — for example, when its process is still running but deadlocked and unable to make progress. If the probe fails failureThreshold times in a row (3 by default), the kubelet kills the container and restarts it according to the pod's restart policy. A carelessly designed liveness probe can cause restarts of its own.
- Namespace
- A mechanism in Kubernetes for isolating groups of resources within a single cluster. Namespaces allow multiple teams or environments to coexist on the same cluster while providing logical boundaries for access control and resource quotas.
- Node
- A physical or virtual machine in a Kubernetes cluster that runs workloads. Each node runs the kubelet agent and a container runtime, and usually kube-proxy (optional when the network plugin implements Services itself). Nodes are managed by the control plane and can be added or removed to scale the cluster.
- Orchestration
- The automated coordination and management of multiple containers, services, or infrastructure components. Container orchestrators like Kubernetes handle scheduling, scaling, networking, and self-healing across clusters of machines.
- PersistentVolume
- A Kubernetes storage abstraction that provides durable storage independent of any individual Pod's lifecycle. PersistentVolumes are provisioned by administrators or dynamically by StorageClasses, and claimed by Pods through PersistentVolumeClaims.
- Pod
- The smallest deployable unit in Kubernetes, consisting of one or more containers that share networking and storage. Pods are ephemeral by design — they can be created, destroyed, and replaced at any time by higher-level controllers like Deployments.
- Readiness Probe
- A Kubernetes health check that determines whether a container is ready to accept traffic. Unlike liveness probes, a failing readiness probe doesn't restart the container — it simply removes the Pod from the Service's endpoint list until it recovers.
- Replica Set
- A Kubernetes controller that ensures a specified number of identical Pod replicas are running at all times. While ReplicaSets are rarely created directly (Deployments manage them), they are the underlying mechanism for horizontal scaling.
- Secret
- A Kubernetes object for storing sensitive data such as passwords, tokens, and TLS certificates. Values in a Secret's data field are base64-encoded, which is an encoding, not encryption: by default Secrets are stored unencrypted in etcd, so encryption at rest and RBAC need to be configured. Secrets can be mounted as files or injected as environment variables, keeping sensitive values out of container images.
- Service
- A Kubernetes abstraction that provides stable networking for a set of Pods. Services assign a fixed IP address and DNS name to a logical group of Pods, enabling reliable communication even as individual Pods are created and destroyed.
- StatefulSet
- A Kubernetes controller for managing stateful applications that require stable network identities, ordered deployment, and persistent storage. StatefulSets are used for databases, message queues, and other workloads where identity and data persistence matter.
- Volume
- A directory accessible to containers in a Pod, used for persisting data beyond the container's lifecycle. Kubernetes supports many volume types including hostPath, NFS, and cloud provider disks, each with different durability and performance characteristics.
Related Posts
Discussion
0 comments
Sign in to join the conversation.
Be the first to comment
Start a conversation about this post



