# 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 ` shows pull events under `Events:`.