95 lines
3.5 KiB
Markdown
95 lines
3.5 KiB
Markdown
# 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:`. |