Lab 07 – Pody

Lab 07 – Pody

Cíl: vygenerovat manifest podu, přidat zdroje a vidět, co pod doopravdy je. Kapitola: Pody

# 1 – imperativně: vytvořit a zahodit
kubectl run bbox --image busybox --restart=Never -- sleep 3600
kubectl get pods
kubectl delete pod bbox

--restart=Never je to, co z kubectl run udělá holý pod místo něčeho spravovaného. -- sleep 3600 přepisuje příkaz image, protože busybox by jinak hned skončil.

# 2 – místo toho si manifest vygenerujte
cd ~
kubectl run bbox --image busybox --restart=Never --dry-run=client -o yaml \
  -- sleep 3600 > bbox.yaml
cat bbox.yaml

Upravte bbox.yaml a přidejte kontejneru zdroje:

spec:
  containers:
    - name: bbox
      image: busybox
      command: ["sleep", "3600"]
      resources:                     # <-- přidejte tento blok
        requests:
          cpu: "50m"
          memory: "32Mi"
        limits:
          cpu: "100m"
          memory: "64Mi"

50m je 50 milicoru – pět setin CPU. Scheduler odečítá requesty od volné kapacity uzlu; limity vynucují cgroups za běhu.

# 3 – nasaďte a ověřte, co API skutečně uložilo
kubectl apply -f bbox.yaml
kubectl get pod bbox -o wide
kubectl describe pod bbox | grep -A6 Limits
kubectl get pod bbox -o jsonpath='{.spec.containers[0].resources}{"\n"}'
# 4 – podívejte se dovnitř
kubectl exec -it bbox -- sh -c 'hostname; ip -brief address; cat /etc/resolv.conf'

resolv.conf ukazuje na Service CoreDNS a obsahuje search domény, díky kterým se web-svc přeloží na web-svc.default.svc.cluster.local. Takhle fungují všechna jména služeb v tomhle kurzu.

# 5 – která pole jde měnit za běhu?
sed -i 's/image: busybox/image: busybox:1.36/' bbox.yaml
kubectl apply -f bbox.yaml              # projde – image je měnitelný
sed -i 's/cpu: "100m"/cpu: "200m"/' bbox.yaml
kubectl apply -f bbox.yaml              # pozorně si přečtěte chybu

Většina specifikace podu je neměnná. Kubernetes pody nahrazuje, nepřenastavuje je – a právě proto používáte kontroler.

Dva kontejnery, jeden pod

# 6 –
cat > twin.yaml <<'YAML'
apiVersion: v1
kind: Pod
metadata:
  name: twin
spec:
  containers:
    - name: web
      image: nginx:1.27
    - name: shell
      image: busybox
      command: ["sleep", "3600"]
YAML
kubectl apply -f twin.yaml
kubectl get pod twin                            # READY 2/2
kubectl exec -it twin -c shell -- wget -qO- localhost:80 | head -3
kubectl logs twin -c web

Busybox dosáhne na nginx přes localhost – sdílejí jeden síťový namespace. -c vybírá kontejner pro exec a logs; bez něj vezme kubectl první.

Objevovací část

Infodiscovery

Úkol A. Vytvořte pod initdemo, který počká, až nginx v podu twin odpoví, a teprve pak spustí hlavní kontejner. Ten jen spí. Očekávaný výsledek: kubectl get pod initdemo chvíli ukazuje Init:0/1, pak Running.

IP=$(kubectl get pod twin -o jsonpath='{.status.podIP}')
cat > init.yaml <<YAML
apiVersion: v1
kind: Pod
metadata:
  name: initdemo
spec:
  initContainers:
    - name: wait-for-web
      image: busybox
      command: ["sh", "-c", "until wget -q --spider http://$IP:80; do sleep 2; done"]
  containers:
    - name: app
      image: busybox
      command: ["sleep", "3600"]
YAML
kubectl apply -f init.yaml
kubectl get pod initdemo -w
kubectl logs initdemo -c wait-for-web

Úkol B. Bez mazání čehokoli zjistěte, kolik paměti smí pod twin použít. Očekávaný výsledek: nemá žádný limit.

kubectl get pod twin -o jsonpath='{.spec.containers[*].resources}{"\n"}'
kubectl describe pod twin | grep -A4 -i limits

Prázdné {} – žádné requesty, žádné limity. Scheduler předpokládal, že nic nepotřebuje, a přesně tak se uzly přeplňují.

Úklid

kubectl delete -f bbox.yaml -f twin.yaml
kubectl delete pod initdemo --ignore-not-found