Files

100 lines
3.5 KiB
Markdown

# Assignment
The Nautilus DevOps team is delving into Kubernetes for app management. One team member needs to create a deployment following these details:
Create a deployment named httpd to deploy the application httpd using the image httpd:latest (ensure to specify the tag)
Note: The kubectl utility on the jump-host has been configured to work with the Kubernetes cluster.
# Solution
# Kubernetes Deployment — `httpd`
A Deployment named `httpd` running the `httpd:latest` image. Applied inline via a
heredoc — no manifest file on disk.
## Apply (heredoc → kubectl)
```bash
kubectl apply -f - <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd
labels:
app: httpd
spec:
replicas: 1
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd:latest
EOF
```
## How it works
### The heredoc apply pattern
- **`kubectl apply -f -`** reads the manifest from **stdin**; the heredoc feeds the YAML
straight in, so nothing is written to disk.
- **`<<'EOF'` (delimiter quoted)** disables shell expansion inside the body, so any
`$VAR` / backticks in a manifest stay literal — the right default for Kubernetes YAML.
- **Indentation matters** — keep it exact, spaces not tabs.
### The manifest, field by field
- **`apiVersion: apps/v1` / `kind: Deployment`** — a Deployment is an `apps/v1` object
that manages a ReplicaSet, which in turn manages Pods. It gives you declarative
updates, rollouts/rollbacks, and self-healing (recreates pods that die).
- **`metadata.name: httpd`** — the Deployment's name, exactly as required.
- **`spec.replicas: 1`** — how many pod copies to run. The task doesn't specify a
count, so one replica is the minimal correct choice.
- **`spec.selector.matchLabels.app: httpd`** — how the Deployment finds the pods it
owns. This **must** match the pod template's labels below, or the API rejects the
manifest (`selector does not match template labels`).
- **`spec.template`** — the pod blueprint the Deployment stamps out:
- **`template.metadata.labels.app: httpd`** — labels applied to each pod; these are
what the selector targets. The label key/value is arbitrary but must be consistent
between selector and template.
- **`template.spec.containers`** — one container:
- **`name: httpd`** — container name.
- **`image: httpd:latest`** — the Apache HTTP Server image at the `latest` tag,
stated explicitly as required. (Bare `httpd` defaults to `latest`, but the task
asks for the tag to be specified.)
### Why the selector/template labels must agree
A Deployment is decoupled from its pods — it tracks them purely by label selector.
`spec.selector.matchLabels` is the query; `spec.template.metadata.labels` is what gets
stamped on each pod. If they don't match, the Deployment couldn't recognize its own
pods, so Kubernetes rejects the config outright. Keeping both `app: httpd` satisfies
that contract.
## Verify
```bash
# Deployment exists and is available
kubectl get deployment httpd
# Rollout completed
kubectl rollout status deployment/httpd
# Pod is running with the right image
kubectl get pods -l app=httpd \
-o jsonpath='{.items[0].spec.containers[0].image}{"\n"}'
```
Expected — `httpd` deployment showing `READY 1/1`, rollout reporting success, and the
image printing `httpd:latest`.
> If a pod sits in `ImagePullBackOff`, the node may be offline or rate-limited on the
> pull. `kubectl describe pod <name>` shows pull events under `Events:`.