Kubernetes
Co probereme
- O kurzu
- Kontejnery
- Opáčko Dockeru
- Přístup do labu
- Co je Kubernetes, proč
- Architektura Kubernetes
- Ovládání a instalace Kubernetes
- Definice objektů v Kubernetes
O kurzu
- Praktický
- Ve virtuálních mašinách v Google Cloud
- Přestávky
- Otázku klidně položte, když Vás zrovna napadne
Kontejnery

Kontejnery
- Čtverce a obdélníky v jiných...

Kontejnery
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
503ef5987c65 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 80/tcp nginx
$ ps aux | grep nginx
root 17605 0.0 0.0 10644 5984 ? Ss 20:20 0:00 nginx: master process nginx -g daemon off;
101 17670 0.0 0.0 11040 2616 ? S 20:20 0:00 nginx: worker process
Kontejnery: vlastnosti
- Rychle spustitelné
- Bezstavové (stateless)
- Rychle ukončitelné
Kontejnery: proč
- Přenositelnost
- Závislosti
- Možnost škálovat
- Stírání rozdílu mezi prostředími
- Možnost nasadit aplikaci na kterékoliv podporované platformě
- Cloud?
- Hybrid cloud?
- Fyzické stroje?
Opáčko Dockeru
- Obrazy a kontejnery
- Spouštění kontejnerů v Dockeru
Opáčko Dockeru
- Obrazy a kontejnery?
- program vs. proces? Rozdíl?
- binárka/skript vs. instance
Spuštění kontejneru
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/Jednorázové spuštění kontejneru s jeho smazáním
$ docker run --rm hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/Spuštění kontejneru na pozadí
$ docker run -d httpd
93debe1c8d8bfe2cf5cd26e9ba10548e210b2e98311938a2d88d39ad91d27591
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93debe1c8d8b httpd "httpd-foreground" 10 seconds ago Up 7 seconds 80/tcp thirsty_chebyshev
Spuštění kontejneru s proměnnými prostředí
$ docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=db mysql
c745223e5329102ffd052430f1ce0c0c895d417c9739fc4f032d11c3e8206418
$ docker ps --format 'table {{.Image}}\t{{.Names}}'
IMAGE NAMES
mysql mysqlSpuštění kontejneru interaktivně
$ docker run -ti --rm fedora:33 /bin/bash
[root@66e3efe3863a /]# date ; ls /root
Sat Mar 20 17:14:28 UTC 2021
anaconda-ks.cfg anaconda-post-nochroot.log anaconda-post.log original-ks.cfg
[root@66e3efe3863a /]# exit
$ docker ps | grep fedora -c
0
Přidání svazku do kontejneru
$ mkdir data
$ docker run -ti --rm -v $(pwd)/data:/data ubuntu bash
root@a3d53a02f2cc:/# echo "Best from $(hostname), $(date)" > /data/regards
root@a3d53a02f2cc:/# exit
$ cat data/regards
Best from a3d53a02f2cc, Sat Mar 20 17:27:19 UTC 2021
Dockerfile & build
$ ls
Dockerfile
$ cat Dockerfile
FROM alpine
MAINTAINER Ondrej Adam Benes <obenes0@centrum.cz>
CMD ["echo", "Hey", "there!"]
$ docker build -t hey-there:test .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM alpine
---> 28f6e2705743
Step 2/3 : MAINTAINER Ondrej Adam Benes <obenes0@centrum.cz>
---> Running in 85d407e8d1a0
Removing intermediate container 85d407e8d1a0
---> c3adc32fef29
Step 3/3 : CMD ["echo", "Hey", "there!"]
---> Running in 1406bc51694f
Removing intermediate container 1406bc51694f
---> 3f5ebed9c956
Successfully built 3f5ebed9c956
Successfully tagged hey-there:test
$ docker run --rm hey-there:test
Hey there!
Přístup do labu
- Distribute keys and domain names
Technologie, které budeme používat
Proč Kubernetes?
- Kontejnery
- Vysoká dostupnost aplikací, do určité míry samoopravitelné
- Load balancing
- Verzování aplikací
- Automatické přiřazování úložiště
- AUTOMATICKY
Architektura Kubernetes

Architektura Kubernetes

Ovládání a instalace Kubernetes
- kubectl
- minikube: distribuce Kubernetes
Definice v Kubernetes: YAML
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}Definice v Kubernetes: JSON
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "nginx",
"creationTimestamp": null,
"labels": {
"run": "nginx"
}
},
"spec": {
"containers": [
{
"name": "nginx",
"image": "nginx",
"resources": {}
}
],
"restartPolicy": "Always",
"dnsPolicy": "ClusterFirst"
},
"status": {}
}Naše hřiště a jak se na něm pohybovat
kubectl bash-completion
- kubectl completion bash > ~/.kubectl_completion
- echo "source ~/.kubectl_completion" >> ~/.bashrc
- . ~/.bashrc
Jednoduchá aplikace
- Vzpomínáte na pody?
- kubectl run nginx --image=nginx
kubectl get
- kubectl get all
- kubectl get <resource type> [<name>] [-o yaml|json]
- kubectl get events [-w]
kubectl describe
- kubectl describe <resource type> [<name>]
kubectl api-resources
kubectl explain
- kubectl explain <api.resource.ktery.vas.zajima>
Nápověda v kubectl
- bash completion
- kubectl help
- kubectl <command> --help
Pojďme si hrát!
- exercises/k8s/pods
- Kubernetes pods: containers wrapped
- Imperative vs. declarative
- YAML and Kubernetes
- Pods the declarative way
Cvičení: poznejte svůj cluster
- Nainstalujte kubectl bash completion a ujistěte se, že funguje.
- Spusťte pod nginx z image nginx
- Kolik podů běží ve Vašem clusteru?
- Jaké je container ID podu nginx?
- Kolik nodů běží ve Vašem clusteru a jak se jmenují?
- Mají nody ve Vašem clusteru dostatek paměti?
- V clusteru je objekt typu Service. Vypište jeho definici v YAML.
- Kde v definici Podu se skrývá definice kontejnerů (containers)?
- Jaká jsou zkrácená jména (shortnames) pro servisy (service) a trvalé svazky (persistent volumes)?
- Jak zjistíte více informací než získáte pomocí kubectl get pod <name of pod> ale nevypíšete YAML nebo JSON?
- Podívejte se na poslední události v clusteru
Imperativně vs. deklarativně
- kubectl <action> vs. YAML manifest
- Psát manifesty ručně?
- Používejte --dry-run=client -o yaml
- Používejte dokumentaci
Pody
- Obálka okolo kontejnerů
- Nejmenší nasaditelná jednotka se společným přístupem k síti a úložišti
- Může obsahovat více než jeden kontejner
- Ať už je pod spuštěný kdekoliv, jeho obsah běží na jednom nodu
- Zahoditelné
- YAML
Spuštění podu
- Imperativně
- kubectl run <name> --image=<image>
- Deklarativně
- kubectl run <name> --image=<image> --dry-run=client -o yaml > my-pod.yaml
- kubectl apply -f my-pod.yaml
Mazání objektu
- kubectl delete <resource> <name> [name2] [nameN]
Jak se k aplikaci dostat: Services
- Vystavuje aplikaci
- Zajistí DNS doménu pro aplikaci
- Abstrakce
- IP zahoditelných podů -> DNS záznam
- Pro uživatele přistupující na aplikaci, ale taky frontend <-> backend
Jak se k aplikaci dostat: Services
- Typy:
- Vystavený port (např. 443) může ukazovat na úplně jiný port v podu
- Rozdíl mezi port a targetPort
- Pokud je aplikace vystavená, existuje endpoint
Vystavení podu nginx a přístup k němu
- Imperativně
- kubectl expose pod <name> [--port=##] [--target-port=##]
- Deklarativně
- kubectl expose pod <name> [--port=##] [--target-port=##] --dry-run=client -o yaml > my-svc.yaml
- kubectl get svc
- curl http://$(minikube ip):<port>
- Co takhle pěkná DNS adresa?
- kubectl get endpoints
Cvičení: nasazení jednoduché aplikace a přístup k ní
- Imperativně:
- Spusťte pod animal-1 a použijte obraz obenes/animal
- Přidejte podu proměnnou prostředí ANIMAL, kde hodnota je na Vás
- Vystavte pod servicem typu ClusterIP. Poslouchá na portu 80
- Použijte curl a mrkněte, co aplikace vrací
- Vytvořte ingress odkaz 1, odkaz 2, který odkazuje na právě vytvořený service.
- host reflektuje Vaši VM, např. animal.vm01.obenes-training.com
- ingressClassName: nginx
- Deklarativně:
- Spusťte pod animal-2 a použijte obraz obenes/animal
- Přidejte podu proměnnou prostředí ANIMAL, kde hodnota je na Vás
- Vystavte pod servicem typu NodePort tak, aby port byl 8080
- Pozor, použijte targetPort s hodnotou 80, protože kontejner poslouchá na port 80.
- Podívejte se na výpis servisů a zapište si externí port
- Použijte curl $(minikube ip):<externi port> a mrkněte, co aplikace vrací
Škálování aplikace: Deployments
- Příliš mnoho požadavků přicházející na vaši aplikaci?
- Bugy v aplikaci?
- Přidejte její kopie!
- Deployment!
- Škálování a vysoká dostupnost
Deployment
- Objekt zahrnující pody
- Vytváří jiný objekt, ReplicaSet, skupina stejných replik podů (s jinými jmény)
- ReplicaSet udržuje stanovený počet kopií - replik - podů
- Deployment je verzovaný
- Dovoluje pracovat s celou skupinou podů
- Nastavit jiný obraz -- image
- Přejít zpátky na starší verzi v případě problémů
- (Auto)škálování Deploymentu při vysoké poptávce po aplikaci
Deploymenty
- Imperativně
- kubectl create deployment <name> --image=<image> --replicas=#
- Deklarativně
- kubectl create deployment <name> --image=<image> --replicas=# --dry-run=client -o yaml > deployment.yaml
- YAML editace
- kubectl apply -f deployment.yaml
Vystavení/přístup k deploymentu
- Stejné jako u podu, jenom ten objekt je Deployment
Poznámka k tagům :latest vs. :jinytag
- deployment.spec.template.spec.containers.imagePullPolicy
- Bez tagu nebo s tagem :latest, imagePullPolicy se stává Always
- Pozor na implikace:
- Stáhnutí image v :latest pokaždé, když je vytvořený Deployment s tímto obrazem
- Restart podu v deploymentu se starým obrazem
- Jinak je výchozí IfNotPresent
- Images reference
Cvičení: vytváření deploymentů a přístup k nim
- Smažte všechny objekty vytvořené v minulém cvičení
- Deklarativně
- Vytvořte deployment web z image httpd
- Deployment by měl mít 3 repliky
- Aplikujte YAML
- Deployment by měl být vystavený na portu 8000. Kontejnery poslouchají na portu 80
- Editujte YAML deploymentu tak, ať imagePullPolicy je IfNotPresent
- Aplikujte YAML
Změny a verzování deploymentů: rollouty
- Proč rollouty?
- pause/resume rollout
- Verzování, záznamy o tom, co se děje
- V akci, když se šablona Podu v Deploymentu změní
- kubectl rollout
- kubectl set
Práce s rollouty
- Nastavit nový image
- Co se stane s deploymentem
- Zkontrolovat status
- kubectl rollout status deployment <name>
- pause: pokud zatím nechceme změny
- kubectl rollout pause deployment <name>
- resume: aplikujme změny!
- kubectl rollout resume deployment <name>
- kubectl --record=true set ...
Pokud něco nejde podle plánu: rollback
- Mrkneme na minulé verze
- kubectl rollout history deployment <name>
- kubectl rollout history deployment <name> --revision=#
- kubectl rollout undo deployment animal [--to-revision=#]
Rollout a rollback a vysoká dostupnost
- Chceme ukončit všechny pody? Ne!
- Ukončit některé pody? Jeden po jednom, dva po dvou, apod.
- deployment.spec.strategy.rollingUpdate.maxUnavailable
- deployment.spec.strategy.rollingUpdate.maxSurge
Cvičení: rollouty a rollbacky část 1
- Imperativně nebo deklarativně:
- Vymažte předchozí deploymenty
- Vytvořte nový deployment animal se 7 replikami z image obenes/animal:plain
- Kontejnery v podu by měly mít proměnnou prostředí ANIMAL s hodnotou podle Vašeho uvážení
- Prozkoumejte deployment, který jste vytvořili
- Vystavte deployment animal. Service by se měl jmenovat animal a vystavený port by měl být 8000.
- Mějte na paměti, že kontejnery běžící image obenes/animal:plain poslouchají na portu 80.
- Mrkněte na historii rolloutu deploymentu animal
Cvičení: rollouty a rollbacky část 2
- Sledujte stav podů v druhém terminálu
- Nastavte jiný image deploymentu: obenes/animal:html
- Podívejte se na historii rolloutu, až se nasadí nový image
- Běžte v rolloutu zpátky do bodu před změnou image na obenes/animal:html
Horizontální vs. vertikální škálování
- Více kopií stejné aplikace?
- Horizontální škálování
- Deployments => ReplicaSets
- Nafouknutí podů, když je potřeba?
- Přidání paměti, CPU
- Založeno na sledování využití systémových prostředků
O systémových prostředcích a metrikách
- Metriky dostupné vždy
- Pokud jsou dostupné Prometheus nebo jiné systémy sledující prostředky:
- Jakékoliv metriky, které se dají z podů zjistit
Tak co ty prostředky
- Více požadavků, více prostředků je potřeba.
- Ale...
- ... Bug v aplikaci?
- Vytížení celého nodu?
- Běží tam i jiné aplikace
- Nastavme i limity
- kubectl top
Škálování na základě využitých prostředků
- API cesta v podech: pod.spec.containers.resources
- API cesta v deploymentech: deployment.spec.template.spec.containers.resources
- requests = minimum
- limits = maximum
- Jednotky paměti: desítková soustava (M, G) nebo binární soustava (SI units - Mi, Gi)
- Jednotky CPU: milicores. 1000m je jednou celé CPU
Horizontal pod autoscaler
- Kubernetes, takže proč ne automatické škálování?
- Je to možné!
- HorizontalPodAutoscaler
- autoscaling API skupina
- kubectl autoscale deployment <name> --max=## --dry-run=client -o yaml
Cvičení: nastavení použití systémových prostředků
- Vytvořte deployment z image obenes/nette se 2 replikami
- Kontejneru dejte k dispozici 20m CPU a využití paměti na 100Mi
- Stejné hodnoty použijte pro limity i requesty
- Zobrazte si změny v kubectl top
- Automaticky škálujte deployment na maximálně 7 replik. Aspoň 2 repliky by měly běžet neustále.
Labels a selectors
- Mention services as if service selector does not match pods (thus deployment's lables), pods are not exposed
- Labels: key/value pairs v metadatech objektu
- Selectors: vybere všechny objekty, které odpovídají dané kombinaci label klíč/hodnota
- Labels&selectors reference
Cvičení: labels a selectors
- Podívejte se na definici servisu animal z minula a zkuste pochopit vazbu mezi servisem a pody
- Spusťte pod nginx z image nginx s labely environment=test a customer=random
- Vystavte pod na portu 80. Přidejte ty stejné labely jako u podu
- Zobrazte si všechny objekty s labely environment=test a customer=random
- Spusťte pod nette z image obenes/nette
- Napište manifest Service tak, aby vystavoval právě vytvořený nette pod. Použijte typ service NodePort.
- Aplikujte manifest a použijte curl na tu stránku. Pro připomenutí: $(minikube ip):<randomly allocated port>
A co konfigurace a hesla?
Secrets a ConfigMaps
- Obrazy, image?
- Kontejnery?
- Externí entita, která uchovává certifikáty, hesla a konfigurační soubory?
- etcd databáze v Kubernetes cluster
- Všechno se stává záznamem v této databázi
ConfigMaps
- Uchová cokoliv
- Text i binární data pokud třeba
- Žádné šifrování
- Key/value. Nezapomeňte při vytváření klíč
- ConfigMap máže obsahovat více položek. Oddělené jsou klíči
ConfigMaps
- Vytvoření ConfigMap z hodnoty zadané na terminálu
- kubectl create configmap favourite-colour --from-literal=colour=black --dry-run=client -o yaml > cm-favourite-colour.yaml
- kubectl apply -f cm-favourite-colour.yaml
- Vytvoření ConfigMap ze souboru. Jméno souboru = klíč
- kubectl create configmap favourite-colour --from-file=colour --dry-run=client -o yaml > cm-favourite-colour.yaml
- kubectl apply -f cm-favourite-colour.yaml
- Vlastní klíč je možný. Obsah souboru se stává hodnotou
- kubectl create configmap favourite-colour --from-file=my-key=colour
Secrets
- Podobné ConfigMaps
- base64 encoding
- Sémantická kontrola dat
- generic: bez kontroly
- tls: pro certifikáty
- docker-registry: dockercfg formát
- kubectl create secret generic app-access --from-file=password
- kubectl create secret tls tls-secret --cert=tls.cert --key=tls.key
Použití ConfigMaps a Secrets
- Použití = jsou k dispozici v kontejnerech
- Jako proměnná prostředí:
- pod.spec.containers.env.valueFrom.configMapKeyRef
- pod.spec.containers.env.valueFrom.secretKeyRef
- pod.spec.containers.envFrom.configMapRef
- pod.spec.containers.envFrom.secretRef
- Jako mount, volume:
- pod.spec.containers.volumeMounts
- pod.spec.volumes.configMap
- pod.spec.volumes.secret
- API cesta ke kontejnerům v Deploymentu
- deployment.spec.template.spec.containers
Cvičení: ConfigMaps
- Smažte animal deployment
- Vytvořte animal ConfigMap
- Klíč je ANIMAL a hodnota je nějaké zvíře
- Zkontrolujte vytvořenou ConfigMap
- Vytvořte nový animal deployment
- Kontejnery mají mít proměnnou prostředí ANIMAL, která bere svoji hodnotu z ConfigMap animal
- Počet replik: maximálně 5
Cvičení: Secrets
- Vytvořte Secret mysql s následujícími klíčí:
- MYSQL_ROOT_PASSWORD
- MYSQL_DATABASE
- MYSQL_USER
- MYSQL_PASSWORD
- Zkontrolujte vytvořený Secret
- Spusťte pod database z image image mysql
- Klíče Secret mysql by se v kontejneru podu měly objevit v podobě stejnojmenných proměnných prostředí
- Mrkněte se na všechny MYSQL_* proměnné prostředí zevnitř kontejneru
- Ať už jednorázovým env příkazem nebo
- Spuštením bash a pak env kontejneru
Namespaces
- Virtuální prostor
- namespace pole v definicích
- Můžeme aplikovat Resource quotas
- kubectl api-resources --namespaced=true
- kubectl api-resources --namespaced=false
- Dokumenace k namespaces
Namespaces a kontext
- Možnost se přepnout do jiných clusterů, namespaces
- context kombinuje Kubernetes cluster, uživatele, aktivní namespace
- Není to Kubernetes objekt jako takový, k nalezení v konfig souboru kubectl
- kubectl config get-contexts
- kubectl config set-context <context-name>
- Mocný koncept, pracujte s kterýmkoliv clusterem dostupným ve vašem prostředí, v kterékoliv namespace
- Pozor, kde pracujete a kde co měníte
Manipulace s namespaces
- Vytvořit namespace
- Nastavit nový kontext
- kubectl config set-context --cluster <cluster> --user <user> --namespace <ns> <context-name>
- Přepnutí do jiného kontextu
- kubectl config use-context <context-name>
- Vymazat namespace: Pozor, dojde k vymazání všech objektů uvnitř
- kubectl delete ns <ns-name>
- Vymazat kontext (z konfiguračního souboru)
- kubectl config delete-context <context-name>
ResourceQuotas a namespaces
Cvičení: Namespaces, contexts, resource quotas
- Vytvořte namespace nette-project
- Vytvořte kontext nette-project, který zohledňuje cluster, uživatele a namespace nette-project
- Přepněte se do kontextu nette-project
- Aplikujte ResourceQuota na namespace nette-project
- Limity i requesty pro CPU by měly být 700m
- Limity i requesty pro paměť by měly být 200Mi
Persistent volumes a persistent volume claims
- Kontejnery: zahoditelné, stateless. Jak uchovat data trvale?
- Persistent Volume:
- Abstrakce nad storage
- Podpora spousty typů storage
- Provisioning manuální nebo automaticky pomocí StorageClass
- Persistent Volume Claim
- Požadavek na storage
- V definici podu figuruje jako volume
- Důvod: abstrakce. Nestarejme se o to, odkud úložiště máme, prostě ho dostaňme
- PVs, PVC dokumentace
Persistent Volumes, PVs
- Vyberte si typ. Pokud si hrajeme, EmptyDir stačí
- Vyberte kapacitu
- Vyberte způsoby přístupu persistentvolume.spec.accessModes
- Nejčastěji: ReadWriteOnce
- Co když už se volume nepoužívá? (persistentvolume.spec.persistentVolumeReclaimPolicy)?
- Zachovat (Retain)? Smazat (Delete)? Recycle?
- Jen deklarativně
- StorageClass pro automatický provisioning
Cvičení: PV a PVC
- Pracujte deklarativně. Manifesty použijeme později
- Vytvořte Storage Class nazvanou local-storage-class s parametrem volumeBindingMode: WaitForFirstConsumer
- Vytvořte PV pv-01 v local-storage-class
- PV pv-01 by měl být typu local a cesta v cluster nodu by měla být /exports/pv-01
- PV pv-01 by měl mít kapacitu 1Gi se způsobem přístupu ReadWriteOnce
- Vytvořte Persistent Volume Claim nazvaný pvc-01, který očekává PV z local-storage-class
- PVC pvc-01 požaduje 1Gi úložiště s způsobem přístupu ReadWriteOnce
- Spusťte pod persistent-storage-test, který používá pvc-01 jako svazek/volume
- Pod persistent-storage-test by měl běžet z image busybox
- Pod připojí/mountne PVC pvc-01 na /mnt/persistent
- V podu běží příkaz while : ; do echo $(date) >> /mnt/persistent/dates ; done
- Zkontrolujte, že na minikube opravdu existuje /exports/pv-01/dates
- Na minikube se připojíte pomocí minikube ssh
Cvičení:: StatefulSets
- Vytvořte 3 PV a PVC se jmény pv-11, pvc-11, pv-12, pvc-12, pv-13, pvc-13
- Použijte předchozí Persistent volume and PVC manifesty a změňte v nich jména a cesty
- Cesta pro PV je /exports/pv-## na minikube
- Aplikujte manifesty
- Zajistěte, ať existuje soubor /exports/pv-##/index.html s obsahem Ahoj
- Vytvořte StatefulSet web-persistent
- StatefulSet běží na image nginx a má 3 repliky
- StatefulSet zabezpečí, že pody připojí PVC jako volumy/svazky na /usr/share/nginx/html/
- Vystavte StatefulSet headless servisem a zkontrolujte, že se opravdu zobrazuje modifikovanou stránku
Monitoring stavu podu
LivenessProbes a ReadinessProbes
- Požadavky nebo příkazy, které kontrolují
- jestli pod nastartoval a je ready
- jestli pod pořád běží
- Pro http aplikace: požadavek na nějakou důležitou cestu
- Pro aplikace komunikující na TCP rozhraní: komunikace s portem
- Jiné: nějaký příkaz
- V deklaraci podu, kontejneru
- pod.spec.containers.startupProbe
- pod.spec.containers.readinessProbe
- pod.spec.containers.livenessProbe
- Probes 1
- Probes 2
Cvičení: Probes
- Vytvořte Deployment se 3 replikami nazvaný nginx, kde
- Image je nginx
- readinessProbe posílá HTTP request na /
- livenessProbe posílá HTTP request na /
- Vytvořte Deployment se 2 replikami nazvaný fedora, kde
- V kontejnerech běží příkaz sleep 5h
- Image je fedora:33
- readinessProbe spouští ls /
- livenessProbe spouští ls /usr
Jobs, Cronjobs
- (Pravidelné) jednorázové akce
- Zálohy, dumpy...
- Pod, ale trochu jiný. Po dokončení akce není restartovaný
- Přestane běžet po X completions
- Můžeme zajistit souběžné spuštění několika podů parallelism
- Job:
- Cronjob:
- job.spec.
- job.spec.template.spec
- cronjob.spec
- cronjob.spec.jobTemplate.spec
Spuštění Jobu
- Imperativně
- kubectl create job <job-name> --image=<image> -- command to run
- kubectl create job ls-job --image=fedora:32 -- ls /tmp
- Deklarativně
- kubectl create job ls-job --image=fedora:32 -- ls /tmp --dry-run=client -o yaml > ls-job.yaml
- kubectl apply -f ls-job.yaml
Spuštění Cronjobu
- Imperativně
- kubectl create cronjob <job-name> --image=<image> -- command to run
- kubectl create cronjob print-date --schedule="1 * * * *" --image=fedora:32 -- date
- Deklarativně
- kubectl create cronjob print-date --schedule="1 * * * *" --image=fedora:32 --dry-run=client -o yaml -- date > cj-print-date.yaml
- kubectl apply -f cj-print-date.yaml
Cvičení: Joby a Cronjoby
- Imperativně nebo deklarativně
- Vytvořte Job běžící na image alpine:
- Spuštěný příkaz: date ; ls /
- Až 4 pody můžou běžet soubežně
- Vytvořte Cronjob běžící na image busybox:
- Spuštěný příkaz: date; echo Hey there!
- Běží každou minutu
- Zkontrolujte objekty, které jste vytvořili, a jejich úspěšné dokončení
Network Policies
- Řídí traffic v síti (OSI 3 or 4)
- Pod <-> entity v síti
- Jiné pody
- Namespaces
- IP pásma
- Default: všechna komunikace je otevřena
- Pokud ale NetworkPolicy existuje, je platná
- Network policies dokumentace
Network Policies: jak fungují
- Definujte ji network policies doku
- networkpolicy.spec.podSelector
- networkpolicy.spec.podSelector.matchLabels
- networkpolicy.spec.policyTypes (default je Ingress)
- networkpolicy.spec.ingress.from
- networkpolicy.spec.egress.to
- Je třeba zajistit, aby pody, na které Network Policies aplikujeme, byly vybrány!
Cvičení: Network policies
- Vytvořte Network Policy nazvanou allow-ingress-http
- Ta Policy se aplikuje na pod nginx
- Pod nginx běží na image nginx
- Jakým způsobem se Policy váže k podu, je na Vás
Sidecars, init containers
- Má aplikace nějaké prerekvizity?
- Nová/pomocná funkcionalita pro aplikaci?
- Init containers!
- Nezávislé na hlavní aplikaci, netřeba komplikovat vývoj
- Jak je to možné? containers pole v definici podu
- pod.spec.initContainers
- deployment.spec.template.spec.initContainers
- Init containters doku
Cvičení: Init containers
- Vytvořte pod web-1 na image nginx
- V init containeru změňte soubor /usr/share/nginx/html/index.html tak, aby obsahoval Hello from web-1!
- Vystavte pod na portu 80
- curl em ověřte, že se reálně index.html změnil
Debug
- Logy
- Events
- Describe
- Kde není shell kubectl debug <pod> --attach
Vazba service accountu na pod
- Service account existuje
- Pole v definici podu: pod.spec.serviceAccountName
- V deploymentu: deployment.spec.template.spec.serviceAccountName
Role-based access control: RBAC
- Role: Sada oprávnění. Vázaná na namespace
- RoleBinding: váže Role na User, Service account, atd.
- ClusterRole: Sada oprávnění. Nevázaná na namespace
- ClusterRoleBinding: Váže ClusterRole na User, Service account, atd.
- Role, ClusterRole
- Jaké typy operací: <sloveso>
- Na jakých typech objektů
- role.rules
- clusterRole.rules
- RBAC v doku
Cvičení: Service accounts a RBAC
- Vytvořte Service Account viewer
- Vytvořte Cluster Role view
- Navažte Cluster Role view se Service Account viewer
- Spusťte pod web na httpd image
- Zajistěte, aby pod web měl přiřazený Service Account viewer
Instalace Helmu
- Instalace
- curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Helm CLI
helm completion [terminal]
helm repo
- helm repo add <nazevrepa> <url-k-chartum>
- helm repo add grafana https://grafana.github.io/helm-charts
- helm repo update
helm pull
- helm pull [chart URL | repo/chartname] [...] [flags]
- helm pull --untar jetstack/cert-manager
helm install
- helm install [NAME] [CHART] [flags]
- helm install grafana grafana/grafana
- helm install --set x.y app repo/chart
- helm install --values moje-values.yaml app grafana-6.44.9.tgz
helm status
helm upgrade
- helm upgrade -f moje-values.yaml -f override.yaml cert-manager .
helm show
helm uninstall
Pracovat imperativně nebo deklarativně?
- Imperativně
- rychlejší
- přímočařejší
- méně vhodné pro komplexní případy
- záleží na implementaci v CLI
- Deklarativně
- pomalejší
- pro všechny případy
- verzování, otevírá dveře pro GitOps
Kam dál
- Kubernetes dokumentace, blog
Kam dál
- Video kurzy (LinkedIn Learning, Udemy, Coursera, ...)