Lab 23 – Aplikace od začátku do konce
Lab 23 – Aplikace od začátku do konce
Infodiscovery volitelný / zbude-li čas
Cíl: postavit, provozovat, rozbít a opravit kompletní aplikaci se vším ze tří dnů.
Tenhle lab říká co, ne jak. Každý příkaz je v
tahácích, v kubectl explain
nebo pod --help.
Každá etapa končí boxem s řešením. Nejdřív ji zkuste sami; box otevřete, když se zaseknete nebo si chcete své řešení porovnat s funkčním. Každý box je samostatný, takže se můžete připojit na začátku libovolné etapy, i když jste předchozí neudělali po svém. Pokud jste ztracení úplně, skočte dolů na Dohnat to jedním vložením.
Postavte to
- Vytvořte namespace
shopa nastavte ho jako výchozí. - Vytvořte ConfigMapu
web-contentsindex.htmlobsahujícímShop v1. - Vytvořte Deployment
shop-web, imagenginx:1.27, 3 repliky, a k tomu:- CPU request
50m, paměťový request64Mi, paměťový limit128Mi - ConfigMapu připojenou na
/usr/share/nginx/html - readiness probe na
/
- CPU request
- Vystavte to ClusterIP Service.
- Publikujte to přes Gateway pomocí HTTPRoute pro
shop.k8s.lab. (Nezapomeňte, že datová rovina Service žije v namespace té Gateway.) - Ověřte ze support01 –
curl -H 'Host: shop.k8s.lab' http://worker01:<nodeport-brány>vrátíShop v1.
Provozujte to
- Naškálujte na 5 replik a ověřte rozprostření po workerech.
- Změňte obsah na
Shop v2a udělejte změnu viditelnou bez ručního mazání podů. - Povyšte image na
nginx:1.28bez výpadku. Doložte to smyčkou požadavků běžící během rolloutu. - Vraťte se na předchozí revizi a ukažte historii.
Přidejte stav
- Dejte aplikaci PersistentVolumeClaim připojený na
/datave všech podech. Musí být sdílený všemi replikami. - Zapište soubor do
/dataz jednoho podu a přečtěte ho z jiného.
Rozbijte to a opravte
- Nastavte image na
nginx:nosuchtag. Odpovězte jen z výstupukubectl: běží web dál, a proč? Který ReplicaSet je zaseknutý a co říká jeho událost? - Uveďte to do pořádku.
- Změňte selektor Service tak, aby neodpovídal ničemu. Doložte poruchu přes endpointy a opravte ji.
- Zakordonujte uzel s většinou podů, vyprázdněte ho a ukažte, že aplikace byla celou dobu dostupná.
Zabalte to
- Udělejte z celku Helm chart s hodnotami pro počet replik, text a hostname.
- Nainstalujte ho dvakrát, pod dvěma jmény release a na dvou hostnames.
Úklid
- Odstraňte obě release, namespace, PVC a uvolněte PV.
Dohnat to jedním vložením
Ztratili jste nit úplně, nebo chcete přeskočit na pozdější etapu? Tohle postaví všechno až do konce etapy Provozujte to (kroky 1–10) najednou. Vložte, počkejte a pokračujte od Přidejte stav.
cd ~
kubectl create namespace shop --dry-run=client -o yaml | kubectl apply -f -
kubectl config set-context --current --namespace=shop
echo '<h1>Shop v2</h1>' > index.html
kubectl create configmap web-content --from-file=index.html \
--dry-run=client -o yaml | kubectl apply -f -
kubectl apply -f - <<'YAML'
apiVersion: apps/v1
kind: Deployment
metadata:
name: shop-web
labels: { app: shop-web }
spec:
replicas: 5
selector:
matchLabels: { app: shop-web }
template:
metadata:
labels: { app: shop-web }
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
resources:
requests: { cpu: "50m", memory: "64Mi" }
limits: { memory: "128Mi" }
readinessProbe:
httpGet: { path: /, port: 80 }
initialDelaySeconds: 3
periodSeconds: 5
volumeMounts:
- name: content
mountPath: /usr/share/nginx/html
volumes:
- name: content
configMap: { name: web-content }
---
apiVersion: v1
kind: Service
metadata:
name: shop-svc
spec:
selector: { app: shop-web }
ports:
- port: 80
targetPort: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: shop-gw
spec:
gatewayClassName: nginx
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces: { from: All }
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: shop
spec:
parentRefs:
- name: shop-gw
hostnames: ["shop.k8s.lab"]
rules:
- matches:
- path: { type: PathPrefix, value: / }
backendRefs:
- name: shop-svc
port: 80
YAML
kubectl rollout status deploy/shop-web
PORT=$(kubectl get svc -n shop -l gateway.networking.k8s.io/gateway-name=shop-gw \
-o jsonpath='{.items[0].spec.ports[?(@.port==80)].nodePort}')
echo "gateway node port: $PORT"
curl -s -H 'Host: shop.k8s.lab' http://worker01:$PORT
Když se kdekoli zaseknete, odpověď je skoro vždy: kubectl describe daný objekt
a přečíst si Events.