docs: add Kubernetes CKS study notes

This commit is contained in:
2026-08-04 23:18:45 +02:00
parent a6ee7a2b07
commit 91a1849009
57 changed files with 8313 additions and 0 deletions

View 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.