docs: add Kubernetes CKS study notes

This commit is contained in:
2026-08-04 23:18:45 +02:00
parent a6ee7a2b07
commit 91a1849009
57 changed files with 8313 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
# Assignment
The Nautilus DevOps team is diving into Kubernetes for application management. One team member has a task to create a pod according to the details below:
Create a pod named pod-httpd using the httpd image with the latest tag. Ensure to specify the tag as httpd:latest.
Set the app label to httpd_app, and name the container as httpd-container.
Note: The kubectl utility on the jump-host has been configured to work with the Kubernetes cluster.
# Solution
# Kubernetes Pod — `pod-httpd`
A single pod running the `httpd:latest` image, with an `app: httpd_app` label and a
named container. Applied inline via a heredoc — no manifest file on disk.
## Apply (heredoc → kubectl)
```bash
kubectl apply -f - <<'EOF'
apiVersion: v1
kind: Pod
metadata:
name: pod-httpd
labels:
app: httpd_app
spec:
containers:
- name: httpd-container
image: httpd:latest
EOF
```
## How it works
### The heredoc apply pattern
- **`kubectl apply -f -`** — the `-f -` tells kubectl to read the manifest from
**stdin** instead of a file. The heredoc feeds the YAML straight in, so nothing is
written to disk.
- **`<<'EOF'` (delimiter quoted)** — quoting `EOF` disables shell expansion inside the
body, so any `$VAR`, backticks, or `$(...)` in a manifest stay literal rather than
being interpreted by the shell. For Kubernetes YAML this is almost always what you
want. Use unquoted `<<EOF` only when you deliberately want the shell to interpolate a
variable into the manifest before it reaches kubectl.
- **Indentation still matters** — YAML inside the heredoc must keep exact indentation,
spaces not tabs.
### The manifest, field by field
- **`apiVersion: v1` / `kind: Pod`** — a Pod is a core (`v1`) object, the smallest
deployable unit in Kubernetes: one or more containers sharing a network namespace and
storage.
- **`metadata.name: pod-httpd`** — the pod's name, exactly as required.
- **`metadata.labels.app: httpd_app`** — the required label. Labels are key/value tags
used by selectors (Services, ReplicaSets, `kubectl get -l`) to target the pod, so
`kubectl get pods -l app=httpd_app` will match this pod.
- **`spec.containers`** — the list of containers in the pod, here a single entry:
- **`name: httpd-container`** — the container name, exactly as required. This is the
name you'd pass to `kubectl logs` / `kubectl exec -c`.
- **`image: httpd:latest`** — the Apache HTTP Server image at the `latest` tag,
specified explicitly as required. Writing just `httpd` would default the tag to
`latest` anyway, but the task asks for the tag to be stated, so it's spelled out.
### Label vs. name — two different things
Easy to conflate, but distinct:
- the **pod name** (`pod-httpd`) uniquely identifies the pod in its namespace, and
- the **`app` label** (`httpd_app`) is a selector tag that can be shared across many
pods.
They live in different manifest fields (`metadata.name` vs `metadata.labels`) and serve
different purposes.
## Verify
```bash
# Pod is running with the correct name
kubectl get pod pod-httpd -o wide
# Label is set
kubectl get pod pod-httpd --show-labels
# Container name and image are correct
kubectl get pod pod-httpd \
-o jsonpath='{.spec.containers[0].name}{" "}{.spec.containers[0].image}{"\n"}'
```
Expected — `pod-httpd` in `Running` status, labels showing `app=httpd_app`, and the
jsonpath printing `httpd-container httpd:latest`.
> If the pod sits in `ImagePullBackOff`, the node may be offline or rate-limited on the
> pull. `kubectl describe pod pod-httpd` shows the pull events under `Events:`.