This is an old revision of the document!
Changelog … popis změn v jednotlivých verzích
Kubernetes běží nad konternerizační službou, jako Docker, ContainerD, cri-o atd. Na omezování zdrojů pro pody se používá cgroups.
Master nody - CP nody - Control plane nody obsahují procesy:
Worker nody - hostuje servisní pody:
API zapisuje do ETCD, kube-scheduler to zpracovava a planuje workload. Node pooly - ruzne priority, napriklad podle ceny. Pody - schranky pro kontejnery s definicema/prepisama, co ma definovane limity, predpisy…
skalovani, bud HPA (Horizotal Pod Autoscaler), podle statistik CPU a Mem, nebo custom metrkia, co jde do metric serveru, nebo VMSS (Virtual Machine Scaling Set), potrebuje featuru doinstalovat (v azuru i samo z Gui), ktera kontroluje vytizenost, node za cca 4 min)
Nepouzivat ETCD misto zoo.. a jine - konfiguracni databaze (MDM), kvuli SLA.
Podskalovani - zabije a spusti pody jinde
Controllery - objekty, které komunikují s apiserverem
Operatory - rozšíření, které slouží na ovládání služeb a zdrojů, např. endpoint, service, deployment, které spravují stejnojmenné zdroje:
/etc/kubernetes/addons/ … definice doplňků
/etc/kubernetes/manifests/ … definice podů
registry.k8s.io/pause kontejnery … pomocné kontejnery zajišťující kontinuitu síťového nastavení podů po restartu
Storage provisioner - poskytovatel trvalých diskových uložišť
storageclass - 
Calico - síťový doplnek na toky mezi namespacema atd. používá Container Network Interface (CNI), pody: calico-kube-controler a calico-node, příkaz calicoctl
Flannel - Síťový plugin (CNI)
Weave - Síťový plugin (CNI)
Romana - Síťový plugin (CNI)
Kube-router - CNI
Cilium - CNI
Trivy … Trivy opensource image scanner - zjišťuje zranitelnosti obrazů
Istio - doplnek na bezbecnost mezi podama (kdo s kym muze a nesmi)
Gremlin … doplnek na testovani bezpecnosti, provede utok na CPU, pamet a overi dobre nastaveni Kubernetes clusteru
Keda … Kubernetes Event-driven Autoscaling - Event-based skalovani, umoznuje skalovani od 0 podu, skalovani podle http requestu, poctu zprav ve fronte atd.
DAPR - Distributted APplication Runtime - nabizi okolni zdroje (aplikace - Service mash, hesla, storage, fronty) jako localhost:xxxxx/neco URL (sidekara k aplikaci)
Osiris … doplnek na skalovani od 0 podu
helm templatovací jazyk pro kubernetes
Knative serving … skalovani od 0 podu, byuziva Istio
Linkerd … jak istio, ale lehci
kustomize … Kubernetes configuration management, umí se odkazovat na sdílený kód mezi aplikacema, nepoužívá parametry (temlaty) jako helm
Kyverno … policy pro Kubernetes
Flagger … rozhazovani trafficu na ruzne verze podu - AB testovani, canary, atd
Portainer … WebGUI na správu Kubernetes, Docker, Swarm atd.
NFS subdir external provider
stakater/reloader … automatický restart podu, když se změní config mapa, nebo secret
flunetd - logovaní služba na sběr logů. Kubernetes nedisponuje sbíráním logů
minukube … provoz Kubernetes na lokálním stroji
kind … instalace Kubernetes na lokálním stroji
kubespray … Ansible knihovna na instalaci k8s
kops … instalace k8s na aws
kube-aws … instalace k8s na aws
Oktant … Web GUI na spravu Kubernetes clusteru
Lens … Web GUI na spravu Kubernetes clusteru
AKS … Azure Kubernetes Service
EKS … Elastic Kubernetes Services - Od Amazonu
GKE … Google Kubernetes Engine
Google Anthos … Mutli-cloud, nebo hybrid cloud management, ktery umi managovat Kubernetes on-prem
label … klíč=hodnota, používají se na selekce
annotation … anotace/popis - klíč=hodnoty - popisné hodnoty, nepoužívají se v Kubernetes, používají je třetí strany. change-cause například se použije v kubectl rollout history deploy
SERVICE.NAMESPACE.svc.cluster.local
cat /etc/resolve.conf … ukáže IP CoreDNS a domenu pro servisy
dig @10.96.0.10 -x 10.96.0.10
rewrite name regex (.*)\.test\.io {1}.default.svc.cluster.local … k get cm -n kube-system kube-proxy -o yaml - přidá redirekt na doménu
Balickovaci system pro Kubernetes yamly (konfigurace), chart je balicek Helmu. Diky Helmu jsou pak YAMLy konfigurovatelne pomoci parametru a pro kazdy deploy na jine prostredi nemusi byt extra YALM soubor. Tiller byl agent v Helm ⇐2, ktery deployoval helm templaty do namespace pod systemovym ucivatelem, Helm v3 už Tiller nepoužívá.
https://hub.helm.sh … Repozitar Helmovych balicku
helm version
helm install --name ingress stable/nginx-ingress --debug … nainstaluje nový Helm chart - debug - ladící výstup
helm template . --name myrelease … vezme defaultni hodnoty a vytvori vystup ze sablony na stdout (pro kontrolu vystupu a syntaxe)
helm template . --name myrelease --set app.customvariable=aa,app.customnumber=2 … jak predtim, ale vyzkousi vymenu parametru
helm upgrade --install myrelease . --set app.image.repository=${DOCKER_REGISTRY} --namespace x … nainstaluje, nebo updatuje
helm upgrade -i tester ealenn/echo-server --debug … instaluje, nebo upgraduje z repozitáře ealenn chart echo-server pod release name tester
helm ls … seznam nainstalovanych chartu
helm delete --purge aaa … smaze helm release
helm search hub redis … vyhledá v repozitáři ArtifactHub vše pro redis
helm repo add bitnami https:charts.bitnami.com/bitnami … přidá repozitářhelm repo list
 … vylistuje repozitářehelm search repo bitnami
 … prohledává v repozitáříchhelm fetch bitnami/apache --untar
 … stáhne a rozbalí helm charthelm uninstall tester
 … odinstaluje helm release tester{{}}
===Struktura===
Chart.yaml
README.md
values.yaml
templates/_helpers.tpl
===helm bloky===
jsou uzavřené ve dvojitých složených závorkách 
{{ template "fullname" . }} {{ .Chart.Name }}-{{ .Chart.Version }}
 {{ default "" .Values.mariadbRootPassword | b64enc | quote }}
 kubectl --v=10
====Kubectl====
kubectl cheat sheet
 … maximální verbosita, ukáže i API volání ve formě curl příkazukubectl api-resources
 … seznam zdrojů, např. pod, deploykubectl explain pods.spec.containers
 … popis zdroje pod.spec.containerskubectl config view
===Konfigurace===
 … ukaze konfiguraci kubectlkubectl config get-contexts
  … ukaze konfigurovane pripojenikubectl config current-context
  … ukaze aktualni pripojenikubectl config view --minify -o jsonpath='{..namespace}'
 … ukaze vychozi namespacekubectl config use-context my-cluster-name
  … nastavi aktualni nastavenikubectl config set-context --current --namespace=NS
 … nastavi vychozi namespacekubectl api-versions
KUBE_EDITOR=“nano” … nastavení editoru
~/.kube/config … konfigurace kubectl
~/.kube/cache/discovery … uložené předchozí hodnoty z běhu kubectl
kubectl –kubeconfig ./admin.conf get nodes … pusti kubectl s vlastnim configem
===Informace o clusteru===
 … diagnostické informace o clusterukubectl version
 … informace o verzi klienta a K8S serverukubectl get events
===events, ev===
 … ukaze udalosti clusterukubectl get events --field-selector involvedObject.kind=Node, involvedObject.name=<node_name>
===namespace, ns, re===
 … seznam jmennych prostorukubectl create ns tomasovo
 … vytvoří nový jmenný prostor “tomasovo”kubectl delete ns tomasovo
 … smaže jmenný prostor “tomasovo”kubectl get resourcequota
 … ukaze quoty pro namespace (maximum prostředků CPU a paměti pro namespace)kubectl get limitranges
  … ukáže qóty pro pody v namespace (maximum prostředků pro jednotlivý pod)kubeadm init
===nodes===
API objekt reprezentující server, na kterém jede virtualizace a komponenty kubernetes clusteru. Vznikne pomocí  a kubeadm join. Pokud apiserver nemůže kontaktovat kubelet 5 minut, NodeLease  naplánuje smazání nodu a NodeStatus se změní z Ready 
kubectl get nodes … Seznam nodukubectl describe minikube
 … popíše node, včetně využití resourců a podůkubectl top nodes
 … ukáže metriky podůkubectl taint nodes --all node-role.kubernetes.io/control-plane-
 … odstraní blokování nodu pro control plane aktivitykubectl cp /cesta/k/souboru NAMESPACE/JMENO_PODY:/cesta/k/souboru
==pods==
Pod je jeden či více kontejnerů sdílející stejnou IP adresu, případně storage. InitContainers jsou kontejnery, které se spustí před sekcí Containers. Kontejnery spolu mohou komunikovat přes sdílený storage, IPC, nebo loopback zařízení. Sidecar kontejnery mohou zpracovávat logy, nebo API.
 … kopirovani souboru z/na PODkubectl describe pod aaaa -n nnnn
 … podrobne informace o podukubeclt edit po nginx
 … editace podukubectl exec -it aaa-6d5f854689-f28zp --namespace=default -- /bin/bash
 … spusti na danem podu bashkubectl get pods
 … sledování podukubectl get pods -o=jsonpath=“{.items[*]['metadata.name', 'metadata.namespace']}”
 … vypíše jen název a namespace ve formátu jsonkubectl get po nginx -o yaml --export
 … yaml s definicí podu, bez pod specifických informacíkubectl get pods.metrics.k8s.io
 … ukáže metriky podůkubectl logs POD -n namespace
 … logy podukubectl logs --since=1h <pod_name>
 … za poslední hodinukubectl logs --tail=20 -f <service_name> [-c <$container>]
 … sledování logu (musí se přerušit ctrl-c) pro kontejnerkubectl logs --previous POD
 … logy posledního failnutého podukubectl run nginx --image=nginx --RM --restart=Never -- bash
 … vytvoří pod a spustí na něm příkaz, po skoncěkubectl run nginx2 --image=nginx --port=80 --dry-run -o yaml
 … vypíše yaml pro pod, nespustíkubectl set image pod/nginx nginx=nginx:1.15-alpine
 … změní verzi obrazu (upgrade)kubectl top pods
 … ukáže metriky podůkubectl port-forward mongo 28015:27017
 … přesměruje tok z podu na lokálí stroj, lze směrovat i z deploymentu, replicasety a servicy (deployments/aaa, ..)kubectl get ep
 … seznam endpointu PODu a jejich IP adres - ip adresa dodaná kubeletem, nebo kube proxykubectl create deploy --image=nginx --dry-run=client -o yaml
===deployments, deploy, replicasets, rs===
Deploymenty řídí replicasety, tedy identické kopie podů
 … vytvoří a ukáže yaml šablonu pro deploymentkubectl get pod,deploy,rs -n default
 … seznam podu, deployu a replika setu v namespace defaultkubectl get pod -L key1,key2, -l evn=prod
 … vylistuje pody které mají label env=prod, ukáže hodnoty labelu key1 a key2kubectl edit deployment.v1.apps/nginx-deployment
 … editace deployekubectl rollout restart deployment/deploy1
 … predeployovanikubectl rollout undo deployment/deploy1
 … navrat na předchozí verzi deploymentukubectl rollout undo deployment/deploy1 –to-revision=2
 … navrat na předchozí revizi 2kubectl rollout history deployment shopping-cart-fs
 … seznam verzí k dispozicikubectl rollout status deployment/deploy1
 … stav rolování deploymentukubectl rollout pause deployment/deploy1
 … pauza rolování deploymentukubectl rollout resume deployment/deploy1
 … Obnova rolování deploymentu po pauzekubectl scale deployment sftp-la-service --replicas=1 -n default
 … skalovanikubectl autoscale deployment AAA --min=2 --max=10
 … autoškálováníkubectl apply -f azure-vote.yaml
 … Deploy aplikacekubectl teplace -f azure-vote.yaml --force
 … přenasazení aplikace ze souboru /po modifikaci souboru/kubectl label pods POD novy-label=bbb
 … přidá labelkubectl label node AAA novy-label=ccc
 … olabeluje nodekubectl annotate pods POD anotace1=aaa
 … přidá anotacikubectl annotate pods --all description='Production Pods' -n prod
 … pridá popisek/anotaci všem podům v namespace prodkubectl -n prod annotate pod webpod description-
 … smaže anotacikubectl rolling-update
 … Rolování změn replicasetu, nesmí spadnout sešna, jinak se nepovedekubectl delete rs rs-one –cascade=orphan
 … smaže replicaset, ale podechá pody, které teď nic nespravuje, když se znovu vytvoří rs, bude je opět sprovavatkubectl describe replicaset.extensions/aaa-6d5f854689 -n default
===horizontalpodautoscalers===
automatické horizontálí škálování (nové pody) pro deploy, nebo statefulset
kubectl get horizontalpodautoscalers … ukáže pravidla pro automatické horizontálí škálování
===replicaset, rs===
 … popis repliky podukubectl scale --replicas=3 rs/AAA
 … nastavení škálovaní pro replica setkubectl get statefulset
===statefulset, sts===
statefullset - spravované skupiny podů, které si zachovávají svoji identitu (pořadí podu, IP adresu, disk, node…)
===daemonsets, ds===
Daemonset zajistí, že na každém nodu poběží kopie daného podu, např. služba disků, logů, monitoringu…
===horizontalpodautoscalers, hpa===
API objekt, spravující metriky pro škálování a vyvolávání žádosti o přeškálování
===secrets===
 #… ukaze certifikat ze secretukubectl get cm
===configmaps==
 … vytvoří config mapukubectl create configmap mycm --from-literal=text=black --from-file=./favorite --from-file=./primary/”
 … vytvoří config mapu z textu, souboru a adresářekubectl get service
===proxy===
kubectl proxy –api-prefix=/ & … vytvoří proxy na kubernetes API na lokální port, http://127.0.0.1:8001 např.
==Ubuntu container for debugging==
<code>cat «EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
  labels:
    app: ubuntu
spec:
  containers:
  - image: ubuntu
    command:
      - “sleep”
      - “604800”
    imagePullPolicy: IfNotPresent
    name: ubuntu
  restartPolicy: Always
EOF</code>
kubectl exec -it ubuntu -- /bin/bash … stahne a spusti ubuntu a na nem bash
nebo
kubectl run mongosh --rm -i --tty --image ubuntu --overrides='{"spec":{"containers":[{"name":"awscli","tty":true,"stdin":true,"image":"amazon/aws-cli:2.13.6","command":["bash"],"resources":{"limits":{"cpu":"+100m","memory":"128Mi"}}}]}}'
===services, svc, endpoints, ep===
Síťový load balancer. Servisa je Kubernetes operátor běžící v kube-control-manažeru ovládající network driver a kube-proxy, nebo vytváří endpoint operátor.
 … seznam servis a jejich IP (adresu dodává Cilium - Kubernetes CNI wnetworking)kubectl get service azure-vote-front --watch
 … Sledovani apkubectl expose rc nginx --port=80 --target-port=3100
 … Typ servisy - ClusterIPkubectl expose deployment/nginx
 … vytvoří službu na pod pro daný deployment, pokud má definovaný “containerPort”, jedná se o typ ClusterIP, slouží pro interní komuinkacikubectl expose deployment nginx –type=LoadBalancer
 … vytvoří servisu typu LoadBalancer - pro venkonvní komunikaci přes většinou přes cloudkubectl expose deployment/nginx –port=80 –type=NodePort
 … servisa typu NodePort - přiřadí daný port na každé NodeIPkubectl expose deployment/nginx –type=ExternalName
 … vytvoří CNAME na DNSkubectl get ep
 … seznam endpointu PODu a jejich IP adres - ip adresa dodaná kubeletem, nebo kube proxykubectl get ingress
===Ingress - Nginx frontdoor===
Aplikační gateway pro servisu - umí např. terminovat tls
==network policies==
 … seznam sitovych pravidel (firewall)kubectl describe networkpolicy Policy1 -n namespace
 … popis sitovych pravidelkubectl edit netpol access-nginx -n default
 … editace sitovych pravidelKUBE_EDITOR='vim' kubectl edit netpol access-nginx -n default -o json
 … editace policy v VI ve formatu JSONkubectl delete networkpolicy default-deny-all -n namespace
 … smazani sitoveho pravidlakubectl create job sleep –image=ubuntu  –dry-run=client -o yaml – “sleep 5
==cornjobs, jobs==
cronjob - časovač na spouštění jobů, job - jednorázová úloha - spuštění podu
 … ukaze plany ukolukubectl get job --watch
 … sledovani jednotlivych jobu/ukolukubectl describe job JOBID
 … informace o jobu, na kterem kontejneru byl spusteny atd.kubectl get certificate
pods=$(kubectl get pods --selector=job-name=JOBID --output=jsonpath={.items[*].metadata.name}) … najde ktery pod odpovida danemu jobu
==certifikaty==
 … seznam spravovanych certifikatukubectl describe certificate AAA
 … popis certifikatu AAAkubectl get pv
===disky, persistent volume===
 … persistent volume claimkubectl get serviceaccounts
===serviceaccounts===
 … vytvoří service accountkubectl create token admin-user
 … vytvoří token pro service accountkubectl auth can-i --list
===clusterroles, role, clusterrolebindings, role bindings - RBAC===
 … zobrazí, na co mám právakubectl auth can-i create deployments --as bob --namespace developer
 … vytvoření tokenukubectl get rolebindings,clusterrolebindings
 … přiřadí cluster roli pro service accountkubectl get clusterroles
===poddisruptionbudgets===
nadefinování rozmezí planovaných odstávek podů (napčíklad, že se může vypnout jen 2 podu naráz při plánované akci (migrace podů, deploy update, …)
===kubectl pluginy===
kube krew install whoami … nainstaluje plugin whoamikubeadm init –config=kubeadm-config.yaml –upload-certs | tee kubeadm-init.out
kubectl whoami … spusti plugin, co ukaze, jaký uživatel jsem
====Další rozšíření====
k get customresourcedefinitions.apiextensions.k8s.io … zesnam API rozšíření
[https://cloud.google.com/knative|knative] … nástroje pro rozšíření ovládáné - skálování od 0, škálování podle eventů atd.
[https://tekton.dev/|tekon] … CI/CD
[https://argoproj.github.io/|agro CI/CD] … CI/CD
k get vulnerabilityreports.aquasecurity.github.io … ukáže zranitelnosti obrazů
====kubeadm====
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ … instalace kubeadm, např. na node
https://github.com/kelseyhightower/kubernetes-the-hard-way … podrobná instalace Kubernetes
kubeadm-config.yaml:
<code>
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.27.1
controlPlaneEndpoint: “k8scp:6443” #alias in /etc/hosts
networking:
  podSubnet: 192.168.0.0/16
</code>
 … inicializace kubernetes pomoci ClusteConfiguration souboru, vytvoří control plane (cp) nodekubeadm token create
 … vytvoří tokenkubeadm token list
 … vylistuje certifikátyopenssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/ˆ.* //'
 … vytvoří discovery tokenkubeadm join --token zzz k8scp:6443 --discovery-token-ca-cert-hash sha256:xxx
 … přidá worker nodekubeadm join k8scp:6443 --token xx.zz --discovery-token-ca-cert-hash sha256:xxx --control-plane --certificate-key yyy
 … přidá nový control plane do clusteruhelm repo add cilium https://helm.cilium.io/; helm repo update; helm template cilium cilium/cilium --version 1.14.1 --namespace kube-system > cilium.yaml; kubectl apply -f cilium-cni.yaml
 … nastaví networking na Ciliumkubeadm version
 … verze Kuberneteskubeadm config print init-default
 … vypíše konfiguracikubeadm upgrade plan
 … plan upgrade Kubernetessudo kubeadm upgrade apply v1.29.1
 … upgradesudo kubeadm upgrade node
 .. upgrade worker noducrictl events
====cri-o - crictl====
Container Runtime Interface - Orchestrator
 … seznam událostícat /etc/crictl.yaml
====etcdctl====
příkaz je k dispozici na nodu etcd
 … uloží etcd databázi (b+ strom) do souboruetcdctlsnapshot restore
 … obnoví etcd databázi ze souborucurl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
====minikube====
Podmínkou pro běh minikube je běžící docker démon
 … stáhne nejnovější binárkuchmod +x minikube
 … dá práva na spuštěnísudo mv minikube /usr/local/bin
 … nakopíruje do binminikube start
 … spustí služkukubectl get nodes
 … validacesudo apt update
====Upgrade====
 … kuáže dostupné verzesudo apt-mark unhold kubeadm
 … odfixuje verzi kubeadmsudo apt-get install -y kubeadm=1.28.1-00
 … upgrade na danou verziudo apt-mark hold kubeadm
 … zafixuje verzisudo kubeadm version
 … ukáže aktuální a dostupnou verzisudo kubeadm upgrade apply v1.29.1
 … provede upgradekubectl get node
 … verze nodůsudo apt-mark unhold kubelet kubectl
====REST API====
Dokumentace: https://kubernetes.io/docs/reference/kubernetes-api/. RC 409 - přepis aktuální verze (resourceVersion) není povolen. Nová verze v parametru modifiedIndex. Běžné HTTP metody: GET, POST, PATCH, DELETE, …
<code>current_context=$(kubectl config view -o json | jq -r '.”current-context“')
user=$(kubectl config view -o json | jq -r '.contexts.[] | select(.name == ”'${current_context}'“) | .context.user')
cluster=$(kubectl config view -o json | jq -r '.contexts.[] | select(.name == ”'${current_context}'“) | .context.cluster')
certificate=$(kubectl config view -o json | jq -r '.users.[] | select(.name == ”'${user}'“) | .user.”client-certificate“')
key=$(kubectl config view -o json | jq -r '.users.[] | select(.name == ”'${user}'“) | .user.”client-key“')
ca=$(kubectl config view -o json | jq -r '.clusters.[] | select(.name == ”'${cluster}'“) | .cluster.”certificate-authority“')
server=$(kubectl config view -o json | jq -r '.clusters.[] | select(.name == ”'${cluster}'“) | .cluster.server')
export token=$(kubectl create token default)
</code>
 … autorizace pomocí tokenucurl --cert ${certificate} --key ${key} --cacert ${ca}  ${server}/api/v1/pods
 … list of podscurl --cert /Users/lipenskyt/.minikube/profiles/minikube/client.crt --key /Users/lipenskyt/.minikube/profiles/minikube/client.key --cacert /Users/lipenskyt/.minikube/ca.crt -H "Accept: application/json, */*" -H "Content-Type: application/json" -XPOST -d '{"kind":"SelfSubjectAccessReview","apiVersion":"authorization.k8s.io/v1","metadata":{"creationTimestamp":null},"spec":{"resourceAttributes":{"namespace":"default","verb":"create","group":"apps","resource":"deployments"}},"status":{"allowed":false}}' https://127.0.0.1:53479/apis/authorization.k8s.io/v1/selfsubjectaccessreviews'' … |selfsubjectaccessreviews informace, zna mohu vytvářet objekty typu deployment
https://127.0.0.1:53479/api/apps/v1
/apis … seznam dostupných API
/api/v1
/api/v1/pods
api/v1/namespaces
/api/v1/namespaces/default/pods/mujpod
/api/v1/namespaces/default/pods/mujpod/log
/api/v1/namespaces/default/pods/mujpod/exec