3.5 KiB
Assignment
The Nautilus DevOps team is planning to deploy some micro services on Kubernetes platform. The team has already set up a Kubernetes cluster and now they want to set up some namespaces, deployments etc. Based on the current requirements, the team has shared some details as below:
Create a namespace named dev and deploy a POD within it. Name the pod dev-nginx-pod and use the nginx image with the latest tag. Ensure to specify the tag as nginx:latest.
Note: The kubectl utility on the jump-host has been configured to work with the Kubernetes cluster.
Solution
Kubernetes Namespace + Pod — dev / dev-nginx-pod
Create a dev namespace and run dev-nginx-pod (image nginx:latest) inside it. Both
objects are applied in one heredoc using a multi-document manifest — no file on disk.
Apply (heredoc → kubectl)
kubectl apply -f - <<'EOF'
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: Pod
metadata:
name: dev-nginx-pod
namespace: dev
labels:
app: dev-nginx
spec:
containers:
- name: nginx-container
image: nginx:latest
EOF
How it works
The heredoc apply pattern
kubectl apply -f -reads from stdin; the heredoc feeds the YAML straight in, nothing written to disk.<<'EOF'(delimiter quoted) disables shell expansion, so any$VAR/backticks in a manifest stay literal — the right default for Kubernetes YAML.---separates the two YAML documents in a single stream.kubectl applyprocesses each in order, so the Namespace is created before the Pod that targets it. Ordering matters: a pod referencing a namespace that doesn't yet exist would fail withnamespaces "dev" not found.
The Namespace
kind: Namespace/metadata.name: dev— a namespace is a virtual cluster partition for isolating and grouping resources. Creating it first gives the pod somewhere to live.
The Pod
metadata.name: dev-nginx-pod— the pod's name, exactly as required.metadata.namespace: dev— places the pod in thedevnamespace. This is the key field for the task: without it, the pod would land indefault. (Equivalent to passing-n devon the command line, but pinning it in the manifest is explicit and self-contained.)metadata.labels.app: dev-nginx— an optional label for selection/grouping. Not required by the task, but good practice.spec.containers— one container:name: nginx-container— the container name.image: nginx:latest— the NGINX image at thelatesttag, stated explicitly as required. (Barenginxdefaults tolatest, but the task asks for the tag to be specified.)
Namespace-scoping recap
The namespace: dev line in the pod's metadata is what satisfies "deploy a POD within
it." Everything else about the pod is standard; the namespace field is the one that
ties the two objects together.
Verify
# Namespace exists
kubectl get namespace dev
# Pod is running inside the dev namespace
kubectl get pod dev-nginx-pod -n dev -o wide
# Image is correct
kubectl get pod dev-nginx-pod -n dev \
-o jsonpath='{.spec.containers[0].image}{"\n"}'
Expected — namespace dev present, dev-nginx-pod in Running status within it, and
the image printing nginx:latest.
Remember to pass
-n devon anykubectlcommand targeting this pod — it's not in thedefaultnamespace. If the pod sits inImagePullBackOff, runkubectl describe pod dev-nginx-pod -n devto see the pull events.