Obsah

Kontejnery

Laby

Kubernetes

Architektura

Ovládání

Orientace v Kubernetes

Způsob práce

Pody

Service

Deploymenty

Rollouty

Škálování

Metriky

HPA

Labels a selectors

Secrets a ConfigMaps

Namespaces

Storage

StatefulSets

Probes

Jobs, cronjobs

Network Policies

Sidecars, init containers

RBAC, Service account

Helm

Kam dál

VPN

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

  • ... ale vlastně procesy!
$ 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
    • Continuous delivery
  • 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     mysql

Spuš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

  • CentOS 9
  • Kubernetes 1.30

Co je Kubernetes?

  • What?

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

Definice v Kubernetes

  • Manifesty
  • YAML
  • JSON

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
  • Show containerPort

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

  • Service YAML
  • 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
    • kubectl get endpoints

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>
    • Proč minikube?
  • 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

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
    • Paměť
    • CPU
  • 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
    • Oddělené čárkou
  • Selectors: vybere všechny objekty, které odpovídají dané kombinaci label klíč/hodnota
  • Labels&selectors reference

Cvičení: labels a selectors

A co konfigurace a hesla?

Secrets a ConfigMaps

  • Obrazy, image?
    • Statický obsah, neměnné!
  • Kontejnery?
    • Zahoditelné, stateless!
  • Externí entita, která uchovává certifikáty, hesla a konfigurační soubory?
    • Ano!
  • 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

Cvičení: Secrets

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
    • kubectl create ns <name>
  • 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

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

Persistent Volume Claims

  • Kapacita
  • Způsob přístupu

Cvičení: PV a PVC

StatefulSets

Cvičení:: StatefulSets

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

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:
    • tvoří Pody
  • 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

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

Sidecars, init containers

  • Má aplikace nějaké prerekvizity?
    • Čeká na jiný servis?
  • Nová/pomocná funkcionalita pro aplikaci?
    • Logging...
  • 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

Debug

  • Logy
  • Events
  • Describe
  • Kde není shell kubectl debug <pod> --attach

Service Accounts

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

Helm

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

Kam dál

Kam dál

VPN a pody