docs: add Kubernetes CKS study notes
This commit is contained in:
123
kubernetes/level 2/task-4.md
Normal file
123
kubernetes/level 2/task-4.md
Normal file
@@ -0,0 +1,123 @@
|
||||
# Assignment
|
||||
|
||||
The Nautilus DevOps team is working on to setup some pre-requisites for an application that will send the greetings to different users. There is a sample deployment, that needs to be tested. Below is a scenario which needs to be configured on Kubernetes cluster. Please find below more details about it.
|
||||
|
||||
|
||||
Create a pod named print-envars-greeting.
|
||||
|
||||
Configure spec as, the container name should be print-env-container and use bash image.
|
||||
|
||||
Create three environment variables:
|
||||
|
||||
a. GREETING and its value should be Welcome to
|
||||
|
||||
b. COMPANY and its value should be DevOps
|
||||
|
||||
c. GROUP and its value should be Industries
|
||||
|
||||
Use command ["/bin/sh", "-c", 'echo "$(GREETING) $(COMPANY) $(GROUP)"'] (please use this exact command), also set its restartPolicy policy to Never to avoid crash loop back.
|
||||
|
||||
You can check the output using kubectl logs -f print-envars-greeting command.
|
||||
|
||||
|
||||
Note: The kubectl utility on the jump-host has been configured to work with the Kubernetes cluster.
|
||||
|
||||
# Solution
|
||||
|
||||
# Kubernetes Pod with Env Vars — `print-envars-greeting`
|
||||
|
||||
A one-shot pod that echoes three environment variables using Kubernetes' `$(VAR)` substitution.
|
||||
Applied inline via a heredoc — no manifest file on disk.
|
||||
|
||||
## Apply (heredoc → kubectl)
|
||||
|
||||
```bash
|
||||
kubectl apply -f - <<'EOF'
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: print-envars-greeting
|
||||
spec:
|
||||
restartPolicy: Never
|
||||
containers:
|
||||
- name: print-env-container
|
||||
image: bash
|
||||
command: ["/bin/sh", "-c", 'echo "$(GREETING) $(COMPANY) $(GROUP)"']
|
||||
env:
|
||||
- name: GREETING
|
||||
value: "Welcome to"
|
||||
- name: COMPANY
|
||||
value: "DevOps"
|
||||
- name: GROUP
|
||||
value: "Industries"
|
||||
EOF
|
||||
```
|
||||
|
||||
## Check the output
|
||||
|
||||
```bash
|
||||
kubectl logs -f print-envars-greeting
|
||||
```
|
||||
|
||||
Expected: `Welcome to DevOps Industries`
|
||||
|
||||
## How it works
|
||||
|
||||
### The heredoc apply pattern — quoting matters a lot here
|
||||
|
||||
- **`kubectl apply -f -`** reads from **stdin**; nothing written to disk.
|
||||
- **`<<'EOF'` (delimiter quoted)** is critical for this task. The command contains `$(GREETING)`,
|
||||
`$(COMPANY)`, `$(GROUP)`. If the heredoc delimiter were **unquoted**, the jump-host's shell
|
||||
would interpret `$(...)` as **command substitution** and try to run `GREETING` as a command —
|
||||
mangling the manifest before kubectl ever sees it. Quoting `EOF` passes the `$(...)` through
|
||||
literally so Kubernetes (not the shell) handles the expansion.
|
||||
|
||||
### `$(VAR)` is Kubernetes substitution, not shell substitution
|
||||
|
||||
The exact command uses `$(GREETING)`, not `${GREETING}` or `$GREETING`. In a container's
|
||||
`command`/`args`, **Kubernetes itself** expands `$(VAR)` references using the container's declared
|
||||
`env` **before** the process starts. So Kubernetes rewrites the command to
|
||||
`echo "Welcome to DevOps Industries"`, and `/bin/sh` then just echoes that literal string.
|
||||
|
||||
This is a subtle but important distinction:
|
||||
- **`$(VAR)`** — expanded by **Kubernetes** from the `env` list at container start.
|
||||
- **`${VAR}` / `$VAR`** — expanded by the **shell** at runtime.
|
||||
|
||||
Both would produce the same output here (since `sh` also has the env vars), but the task pins the
|
||||
`$(VAR)` form, and it's Kubernetes doing the substitution. A gotcha to know: `$(VAR)` only
|
||||
resolves if a matching `env` entry exists; an undefined `$(FOO)` is left **literal** rather than
|
||||
erroring.
|
||||
|
||||
### The env vars
|
||||
|
||||
Three `env` entries — `GREETING="Welcome to"`, `COMPANY="DevOps"`, `GROUP="Industries"` — supply
|
||||
the values Kubernetes substitutes into the command. Values are quoted because they contain spaces
|
||||
(`Welcome to`).
|
||||
|
||||
### `restartPolicy: Never`
|
||||
|
||||
The command echoes once and exits `0` — a completed run, not a long-running process. With the
|
||||
default `restartPolicy: Always`, Kubernetes would see the container exit and keep restarting it,
|
||||
driving `CrashLoopBackOff` (even though it "succeeded"). `Never` tells Kubernetes not to restart
|
||||
it, so the pod ends in `Completed` state cleanly. This is why the task specifies it.
|
||||
|
||||
### The `bash` image
|
||||
|
||||
`image: bash` pulls the official BusyBox-based bash image, which provides `/bin/sh` to run the
|
||||
command. It runs the echo and exits — exactly the one-shot behavior wanted.
|
||||
|
||||
## Verify
|
||||
|
||||
```bash
|
||||
# Pod ran to completion
|
||||
kubectl get pod print-envars-greeting # STATUS: Completed
|
||||
|
||||
# The greeting output
|
||||
kubectl logs print-envars-greeting
|
||||
```
|
||||
|
||||
Expected — `print-envars-greeting` in `Completed` status, and the logs printing
|
||||
`Welcome to DevOps Industries`.
|
||||
|
||||
> `Completed` (not `Running`) is correct here — the pod's job was to print once and exit. If it
|
||||
> shows `CrashLoopBackOff`, `restartPolicy: Never` didn't take.
|
||||
Reference in New Issue
Block a user