Kubernetes Fundamentals
Assumed from Overview: you know Kubernetes runs Pods across a cluster of Nodes, and that the control plane makes scheduling decisions while worker Nodes actually run your containers. This tab covers the actual objects you create and the command-line tool you use to manage them.
kubectl — The CLI
kubectl (pronounced "kube-control" or "kube-C-T-L" — people say it both ways) is the command-line tool you use to talk to a cluster's API Server — every command below sends a request to the API Server, which is the single front door for the whole cluster (see Overview's Module 02). You point kubectl at a specific cluster using a context — if you only ever work with one cluster you can ignore this, but most engineers switch between a local test cluster and a real production one, so knowing how to check and switch context matters before you accidentally run something against the wrong cluster.
Pod Manifest
A manifest is just a YAML file describing what you want Kubernetes to create — you write the desired state down, then kubectl apply -f it, and Kubernetes does the work of making the cluster match. Below is the manifest for a single Pod (as Overview explained, the smallest thing Kubernetes schedules and runs) — in practice you'll rarely write a bare Pod like this directly, since a Deployment (next section) manages Pods for you and gives you restart/scaling behavior for free, but understanding the raw Pod shape first makes the Deployment manifest below much easier to read, since a Deployment's template: section is exactly a Pod spec.
A few fields worth knowing before reading the YAML: requests is the CPU/memory a container is guaranteed to get; limits is the hard ceiling it's not allowed to exceed. Skipping these is a real production mistake — Kubernetes has no way to protect a Pod with no requests/limits set from being starved or evicted first when a Node runs low on resources (see the Advanced tab's "QoS classes" for exactly how this plays out). A probe is an automated health check Kubernetes runs against your running container: a livenessProbe asks "is this container still alive, or should it be restarted?"; a readinessProbe asks "is this container ready to receive traffic right now?" — a Pod can be alive but not yet ready (still loading data, for example), and Kubernetes won't send it traffic until the readiness probe passes.
Deployment
Writing individual Pod manifests by hand doesn't scale — if a Pod crashes or its Node dies, nothing recreates it, and running multiple identical copies means copy-pasting the manifest and manually tracking each one. A Deployment solves this: you declare how many identical copies ("replicas") of a Pod you want, and Kubernetes' Controller Manager continuously keeps that many running, recreating any that disappear. It also manages rolling updates — replacing old Pods with new ones gradually, rather than all at once, so the app stays available throughout.
The maxSurge/maxUnavailable settings above control exactly how a rolling update behaves: maxSurge: 1 allows one extra Pod above the desired count while updating (so capacity never drops during the swap), and maxUnavailable: 0 means none of the existing 3 Pods are removed until their replacement is up and ready — the practical result is zero downtime during a deploy.
Services
As Overview explained: Pods are constantly replaced, and each new one gets a brand-new IP address — so nothing in the cluster can reliably remember a Pod's address directly. A Service fixes this by giving a stable, permanent address that automatically forwards traffic to whichever Pods currently match its selector (a label filter), no matter how many times those Pods have been recreated. There are a few types, differing in who can reach the Service: ClusterIP (the default) is reachable only from inside the cluster — the right choice for a database or internal API that nothing outside the cluster should touch directly. LoadBalancer additionally provisions a real external address (via your cloud provider) so traffic from the internet can reach it.
ConfigMaps and Secrets
Hardcoding configuration (a log level, a feature flag) or credentials (a database password) directly into a Pod's manifest or container image means changing them requires rebuilding and redeploying — and for credentials, baking them into an image is a real security risk (see Docker's own Fundamentals tab on why secrets shouldn't live in an image). A ConfigMap holds non-sensitive configuration as key-value pairs, separately from the Pod, so it can be updated independently. A Secret holds sensitive values the same way — but worth knowing plainly: by default a Secret is only base64-encoded, not encrypted, meaning it's trivially decodable by anyone with read access to it, not cryptographically protected. (The Intermediate tab covers what real protection actually requires.)

