Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
automatizace:kubernetes [2024/02/17 17:42]
tomas
automatizace:kubernetes [2024/02/20 08:39] (current)
tomas [Architektura]
Line 9: Line 9:
   * kube-apiserver - kontejner který příjímá všechna api volání, validuje je a předává dalším komponentám. Jediný má přístup do etcd   * kube-apiserver - kontejner který příjímá všechna api volání, validuje je a předává dalším komponentám. Jediný má přístup do etcd
   * etcd - kontejner který databaze stavu konfigurace, clusteru, sítě, storage atd., jediná persistentní komponenta, protože uchovává stav. Je etcd leader a followers, kterí replikují, případně převezmou roli leadra   * etcd - kontejner který databaze stavu konfigurace, clusteru, sítě, storage atd., jediná persistentní komponenta, protože uchovává stav. Je etcd leader a followers, kterí replikují, případně převezmou roli leadra
-  * kube-scheduler - kontejner který rozhoduje na kterých nodech poběží pod, binduje volumy atd.+  * kube-scxheduler - kontejner který rozhoduje na kterých nodech poběží pod, binduje volumy atd.
   * kube-controller-manager - kontejner který zjištuje stav objektů a když nesedí, tak je opravuje API instrukcema   * kube-controller-manager - kontejner který zjištuje stav objektů a když nesedí, tak je opravuje API instrukcema
   * (coud-controller-manager - ccm) - volitelná komponenta - komunikuje s externími nástroji pro správu a reporting, předává zprocesované věci kubecontroler-managerem. Lze vyvinout vlastní   * (coud-controller-manager - ccm) - volitelná komponenta - komunikuje s externími nástroji pro správu a reporting, předává zprocesované věci kubecontroler-managerem. Lze vyvinout vlastní
Line 41: Line 41:
 Calico - síťový doplnek na toky mezi namespacema atd. používá Container Network Interface ([[https://github.com/containernetworking/cni|CNI]]), pody: calico-kube-controler a calico-node, příkaz calicoctl\\ Calico - síťový doplnek na toky mezi namespacema atd. používá Container Network Interface ([[https://github.com/containernetworking/cni|CNI]]), pody: calico-kube-controler a calico-node, příkaz calicoctl\\
 Flannel - Síťový plugin (CNI)\\ Flannel - Síťový plugin (CNI)\\
-Weave - Síťový plugin (CNI)\\+WeaveNet - Síťový plugin (CNI)\\
 Romana - Síťový plugin (CNI)\\ Romana - Síťový plugin (CNI)\\
 Kube-router - CNI\\ Kube-router - CNI\\
Line 48: Line 48:
  
 [[https://trivy.dev/|Trivy]] ... Trivy opensource image scanner - zjišťuje zranitelnosti obrazů\\ [[https://trivy.dev/|Trivy]] ... Trivy opensource image scanner - zjišťuje zranitelnosti obrazů\\
-Istio - doplnek na bezbecnost mezi podama (kdo s kym muze a nesmi)\\+Istio - service mesh - 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\\ Gremlin ... doplnek na testovani bezpecnosti, provede utok na CPU, pamet a overi dobre nastaveni Kubernetes clusteru\\
 [[https://keda.sh/|Keda]] ... Kubernetes Event-driven Autoscaling - Event-based skalovani, umoznuje skalovani od 0 podu, skalovani podle http requestu, poctu zprav ve fronte atd.\\ [[https://keda.sh/|Keda]] ... Kubernetes Event-driven Autoscaling - Event-based skalovani, umoznuje skalovani od 0 podu, skalovani podle http requestu, poctu zprav ve fronte atd.\\
Line 55: Line 55:
 [[automatizace:helm]] templatovací jazyk pro kubernetes\\ [[automatizace:helm]] templatovací jazyk pro kubernetes\\
 Knative serving ... skalovani od 0 podu, byuziva Istio\\ Knative serving ... skalovani od 0 podu, byuziva Istio\\
-Linkerd ... jak istio, ale lehci\\+Linkerd ... jak istio, nebo Aspen,, ale lehci\\
 [[https://kustomize.io/|kustomize]] ... Kubernetes configuration management, umí se odkazovat na sdílený kód mezi aplikacema, nepoužívá parametry (temlaty) jako helm\\ [[https://kustomize.io/|kustomize]] ... Kubernetes configuration management, umí se odkazovat na sdílený kód mezi aplikacema, nepoužívá parametry (temlaty) jako helm\\
 [[https://kyverno.io/|Kyverno]] ... policy pro Kubernetes\\ [[https://kyverno.io/|Kyverno]] ... policy pro Kubernetes\\
 [[https://flagger.app/|Flagger]] ... rozhazovani trafficu na ruzne verze podu - AB testovani, canary, atd\\ [[https://flagger.app/|Flagger]] ... rozhazovani trafficu na ruzne verze podu - AB testovani, canary, atd\\
 [[https://portainer.io|Portainer]] ... WebGUI na správu Kubernetes, Docker, Swarm atd.\\ [[https://portainer.io|Portainer]] ... WebGUI na správu Kubernetes, Docker, Swarm atd.\\
 +[[https://github.com/kubernetes/dashboard|kubernetes-dashboard]] ... Kubernetes Dashboard - WEB GUI na správu kubernetes\\
 [[https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner|NFS subdir external provider]]\\ [[https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner|NFS subdir external provider]]\\
 [[https://github.com/stakater/Reloader|stakater/reloader]] ... automatický restart podu, když se změní config mapa, nebo secret\\ [[https://github.com/stakater/Reloader|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ů\\+fluentd - logovaní služba na sběr logů. Kubernetes nedisponuje sbíráním logů\\ 
 +prometheus - logování, monitoring, alerting\\ 
 +OpenTelemetry - poskytuje tracing a metriky dalším nástrojům\\ 
 +Jaeger ... konzumuje metriky\\ 
  
 ===Nástroje=== ===Nástroje===
Line 83: Line 88:
 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\\ 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\\
  
 +===Scheduler===
 +Chování scheduleru lze konfigurovat sheduler profilama. Konfigurace pomocí apis/kubescheduler.config.k8s.io/v1/KubeSchedulerConfiguration. Profil pro scheduler lze vybrat v podu vlastností .spec.schedulerName. Je spoustu [[https://kubernetes.io/docs/reference/scheduling/config/#scheduling-plugins||pluginů]] pro konfiguraci Extension points:
 +
 +queueSort - jak jsou setřízené čekající (pending) pody\\
 +preFilter - pre-procesing podů. může nějaké pody vyloučit z plánování\\
 +Filter - výběr nodů vhodných pro pod. Pokud žádný node, tak se pod vyloučí z plánování\\
 +postFilter - když nějaký plugin označí pod naplánovatelný, ostatní pluginy se už nevolají\\
 +preScore\\
 +Score - přiřazení skóre - scheduler nasadí pod s nejvyšším skórem\\
 +reserve\\
 +permit\\
 +preBind\\
 +Bind\\
 +postBind\\
 +multiPoint\\
 +
 +Filtry:
 +  * ImageLocality - upřednostňuje nody obsahující daaný image. Extension points: score.
 +  * TaintToleration - Implementuje taints a tolerance. Extension points: filter, preScore, score.
 +  * NodeName - Kontroluje, zda Pod spec node name se shoduje s node. Extension points: filter.
 +  * NodePorts - Zjišťuje, zda node node má k dispozici dané porty. Extension points: preFilter, filter.
 +  * NodeAffinity - Implementuje node selectory a node afinitu. Extension points: filter, score.
 +  * PodTopologySpread - Implementuje Pod topology spread. Extension points: preFilter, filter, preScore, score.
 +  * NodeUnschedulable - Filtruje nody, které mají .spec.unschedulable = true. Extension points: filter.
 +  * NodeResourcesFit - Zjišťuje, zda node má všechny potřebné zdroje.
 +  * NodeResourcesBalancedAllocation - upřednostňuje nody, které by zjískaly lépe balancované zdroje, kdyby tam pod byl. Extension points: score.
 +
 +  * nodeName, nodeSelector - konkrétní node, nebo konkrétní skupina nodů s daným labelem
 +  * affinity, anti-affinity - vhodnější nody - upřednostnění
 +  * taint - vyloučení nějakých nodů pro pod, tolerance - ignorování taintu
 +  * schedulerName - vybere profil scheduleru
 +
 +spec.affinity.pod[Anti]Affinity.[required|preffered]DuringSchedulingIgnoredDuringExecution.labelSelector.matchExpressions:
 +  * requiredDuringSchedulingIgnoredDuringExecution - nedá na node, pokud splněná podmínka
 +  * preferredDuringSchedulingIgnoredDuringExecution - preferuje dané nody
 +  * podAffinity - snaží se dát pody dohromady
 +  * podAntiAffinity - snaží se dát na jiné nody
 +
 +===HA===
 +  * vše konfigurovat pomocí hostname, ne IP
 +  * použít loadbalancery, TLS mít na Load balanceru, např. haproxy  (/etc/haproxy/haproxy.cfg)
 +  * na přidáni dalšího Control Plane bude nejspíš potřeba přegenerovat klíče, budou expirované
 +  * etcd lze použít externí, musí se udělat první (nonColocated etcd)
 ====DNS==== ====DNS====
 SERVICE.NAMESPACE.svc.cluster.local\\ SERVICE.NAMESPACE.svc.cluster.local\\
Line 90: Line 138:
  
 ====Helm==== ====Helm====
-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 je agent ktery deployuje helm templaty do namespace, jede pod systemovym ucivatelem\\+Balickovaci system pro Kubernetes yamly (konfigurace), chart je balicek Helmu. Diky [[https://helm.sh/docs/topics/charts/|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\\ [[https://hub.helm.sh]] ... Repozitar Helmovych balicku\\
  
-helm init --service-account tiller\\ +''helm version''\\ 
-helm init --upgrade ... upgrade verze Helmu, vcetne tilleru na Kubernetes clusteru\\ +''%%helm install --name ingress stable/nginx-ingress --debug%%'' ... nainstaluje nový Helm chart - debug - ladící výstup\\ 
-helm version\\ +''%%helm template . --name myrelease%%'' ... vezme defaultni hodnoty a vytvori vystup ze sablony na stdout (pro kontrolu vystupu a syntaxe)\\ 
-helm install --name ingress stable/nginx-ingress\\ +''%%helm template . --name myrelease --set app.customvariable=aa,app.customnumber=2%%'' ... jak predtim, ale vyzkousi vymenu parametru\\ 
-helm template . --name myrelease ... vezme defaultni hodnoty a vytvori vystup ze sablony na stdout (pro kontrolu vystupu a syntaxe)\\ +''%%helm upgrade --install myrelease . --set app.image.repository=${DOCKER_REGISTRY} --namespace x%%'' ... nainstaluje, nebo updatuje\\ 
-helm template . --name myrelease --set app.customvariable=aa,app.customnumber=2 ... jak predtim, ale vyzkousi vymenu parametru\\ +''%%helm upgrade -i tester ealenn/echo-server --debug%%'' ... instaluje, nebo upgraduje z repozitáře ealenn chart echo-server pod release name tester\\ 
-helm upgrade --install myrelease . --set app.image.repository=${DOCKER_REGISTRY} --namespace x ... nainstaluje, nebo updatuje\\ +''helm ls'' ... seznam nainstalovanych chartu\\ 
-helm ls ... seznam nainstalovanych chartu na tilleovi\\ +''%%helm delete --purge aaa%%'' ... smaze helm release\\ 
-helm delete --purge aaa ... smaze helm release\\+''helm search hub redis'' ... vyhledá v repozitáři [[https://artifacthub.io/|ArtifactHub]] vše pro redis\\ 
 +''%%helm repo add bitnami ht‌tps://charts.bitnami.com/bitnami%%'' ... přidá repozitář\\ 
 +''helm repo list'' ... vylistuje repozitáře\\ 
 +''helm search repo bitnami'' ... prohledává v repozitářích\\ 
 +''%%helm fetch bitnami/apache --untar%%'' ... stáhne a rozbalí helm chart\\ 
 +''helm 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 }}%%''\\ 
 +''%%{{ .Release.Name }}%%'' \\ 
 +''%%{{ default "" .Values.mariadbRootPassword | b64enc | quote }}%%'' \\  
  
  
Line 151: Line 219:
 ''kubectl top nodes'' ... ukáže metriky 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 aktivity\\ ''%%kubectl taint nodes --all node-role.kubernetes.io/control-plane-%%'' ... odstraní blokování nodu pro control plane aktivity\\
 +''kubectl taint nodes worker bubba=value:PreferNoSchedule'' ... nodu worker přidá taint bubba:PreferNoSchedulle\\
  
 ==pods== ==pods==
Line 159: Line 228:
 ''kubeclt edit po nginx'' ... editace podu\\ ''kubeclt edit po nginx'' ... editace podu\\
 ''%%kubectl exec -it aaa-6d5f854689-f28zp --namespace=default -- /bin/bash%%'' ... spusti na danem podu bash\\ ''%%kubectl exec -it aaa-6d5f854689-f28zp --namespace=default -- /bin/bash%%'' ... spusti na danem podu bash\\
 +''kubectl attach POD1'' ... připojí se do podu POD1 do spušťeného procesu\\
 +''%%kubectl debug POD1 --image debian --attach%%''\\
 ''kubectl get pods''\\ ''kubectl get pods''\\
 ''kubectl get po nginx -w'' ... sledování podu\\ ''kubectl get po nginx -w'' ... sledování podu\\
Line 278: Line 349:
  
 ===Ingress - Nginx frontdoor=== ===Ingress - Nginx frontdoor===
-Aplikační gateway pro servisu - umí např. terminovat tls+Aplikační gateway pro servisu - umí např. terminovat tls. Nejčastěji [[https://github.com/kubernetes/ingress-nginx/blob/main/docs/deploy/index.md|Nginx]], ale existují i GKE, Traefik, Contour and Envoy. Ingres je pod, kterž poslouchá na API serveru v cestě /apis/networking.k8s.io/v1/ingresses a číhá na nové objekty. Když se objeví nový endpoint, nakonfiguruje tok na danou servisu
  
 ''kubectl get ingress''\\ ''kubectl get ingress''\\
  
 ==network policies== ==network policies==
 +[[https://github.com/ahmetb/kubernetes-network-policy-recipes|Network policy]] jsou pravidla síťového firewalu. Některé CNI drivery NP nepoužívají, ale mají jiný způsob kontroly. Pokud je NetPol prázdná, neobsahuje egress, ani ingress, tak zakazuje tok. Pokud tam sekce je, tak povoluje tok. podSelector: {} = všechny pody.
 +
 ''kubectl get networkpolicy -n namespace'' ... seznam sitovych pravidel (firewall)\\ ''kubectl get networkpolicy -n namespace'' ... seznam sitovych pravidel (firewall)\\
 ''kubectl describe networkpolicy Policy1 -n namespace'' ... popis sitovych pravidel\\ ''kubectl describe networkpolicy Policy1 -n namespace'' ... popis sitovych pravidel\\
Line 312: Line 385:
 ''kubectl create token admin-user'' ... vytvoří token pro service account\\ ''kubectl create token admin-user'' ... vytvoří token pro service account\\
  
-===clusterroles, role, clusterrolebindings, role bindings - RBAC===+===Bezpečnost=== 
 +==Autorizace== 
 +Kontrolována Autorizačním controlerem API serveru, umí používat různé formy autentifikace, OpenID, certifikáty, tokeny 
 + 
 +useradd user1\\ 
 +passwd user1\\ 
 +openssl genrsa -out ~user1/user1.key 2048\\ 
 +openssl req -new -key ~user1/user1.key -out ~user1/user1.csr -subj "/CN=DevDan/O=development"\\ 
 +sudo openssl x509 -req -in ~user1/user1.csr -CA /var/lib/minikube/certs/apiserver-etcd-client.crt -CAkey /var/lib/minikube/certs/apiserver-etcd-client.key -CAcreateserial -out ~user1/user1.crt -days 45\\ 
 +kubectl config set-credentials DevDan --client-certificate=~user1/user1.crt --client-key=~user1/user1.key\\ 
 +kubectl config set-context minukume-user1 --cluster=minikube --namespace=development --user=user1\\ 
 + 
 + 
 +==clusterroles, role, clusterrolebindings, role bindings - RBAC== 
 +Je kontrolována module authorization controllerem API serveru 
 ''%%kubectl auth can-i --list%%'' ... zobrazí, na co mám práva\\ ''%%kubectl auth can-i --list%%'' ... zobrazí, na co mám práva\\
 ''%%kubectl auth can-i create deployments --as bob --namespace developer%%''\\ ''%%kubectl auth can-i create deployments --as bob --namespace developer%%''\\
Line 320: Line 408:
 ''kubectl get clusterroles''\\ ''kubectl get clusterroles''\\
 ''kubectl get roles''\\ ''kubectl get roles''\\
 +
 +==Admission Controler==
 +PodSecurityPolicy - vynucení pravidel je od 1.25 nahrazeno Pod Security Admission. PSP/PSA je kontrolováno Admission Controlerem API serveru.
 +SecurityContext je nastavení bezpečnosti Podu pomocí SELinux/AppArmor. Je to sekce ve YAML definice
 +
 +grep admission /etc/kubernetes/manifests/kube-apiserver.yaml\\
  
 ===poddisruptionbudgets=== ===poddisruptionbudgets===
Line 327: Line 421:
  
 ===kubectl pluginy=== ===kubectl pluginy===
-kube [[https://krew.sigs.k8s.io/docs/user-guide/setup/install/|krew]] install whoami ... nainstaluje plugin whoami\\+kubectl [[https://krew.sigs.k8s.io/docs/user-guide/setup/install/|krew]] install whoami ... nainstaluje plugin whoami\\ 
 +kubectl krew search ... seznam dostupných kubectl pluginů\\
 kubectl whoami ... spusti plugin, co ukaze, jaký uživatel jsem\\ kubectl whoami ... spusti plugin, co ukaze, jaký uživatel jsem\\
 +kubectl tail --rs staging/payment-1234 ... ukazuje logy ze všech podů replikasety\\
 +kubectl sniff bigpod-abcd-123 -c mainapp -n accounting ... odposlech síťového provozu a přeposílání do Wiresharku\\
 +
 ====Další rozšíření==== ====Další rozšíření====
 +Rozšíření, kako třeba cilium, linkerd, jsou popsány v horní části stránky, crd s nimi pracuje
 +
 k get customresourcedefinitions.apiextensions.k8s.io ... zesnam API rozšíření\\ k get customresourcedefinitions.apiextensions.k8s.io ... zesnam API rozšíření\\
 +kubectl get crd --all-namespaces ... kratší zápis\\
  
 +cilium\\
 +linkerd\\
 [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://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://tekton.dev/|tekon] ... CI/CD\\
Line 352: Line 455:
  
 ''kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.out'' ... inicializace kubernetes pomoci ClusteConfiguration souboru, vytvoří control plane (cp) node\\ ''kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.out'' ... inicializace kubernetes pomoci ClusteConfiguration souboru, vytvoří control plane (cp) node\\
 +kubeadm config print init-defaults ... ukáže konfiguraci\\
 ''kubeadm token create'' ... vytvoří token\\ ''kubeadm token create'' ... vytvoří token\\
 ''kubeadm token list'' ... vylistuje certifikáty\\ ''kubeadm token list'' ... vylistuje certifikáty\\
Line 384: Line 488:
 ''minikube start'' ... spustí služku\\ ''minikube start'' ... spustí služku\\
 ''kubectl get nodes'' ... validace\\ ''kubectl get nodes'' ... validace\\
 +''minikube addons enable ingress'' ... povolí ingress\\
  
 ====Upgrade==== ====Upgrade====
Line 402: Line 507:
 ''sudo systemctl restart kubelet''\\ ''sudo systemctl restart kubelet''\\
 ''kubectl uncordon cp''\\ ''kubectl uncordon cp''\\
 +
 +====Troubleshooting====
 +systemctl status kubelet.service\\
 +journalctl -u kubelet\\
 +sudo find /var/log -name "*apiserver*log"
 +/etc/systemd/system/kubelet.service.d/10-kubeadm.conf\\
 +/var/lib/kubelet/config.yaml\\
 +/etc/kubernetes/manifests/\\
 +Zapnotut/prozkoumat API auditing\\
 +Bezpečnostní problém? RBAC, SELinux, AppArmor\\
 +Síťový problém - přidat ephemeral kontejner s network nástroji\\
 +logy a status podu\\
 +Probél na node?\\
 +/var/log/kube-apiserver.log\\
 +[[https://kubernetes.io/docs/tasks/debug/debug-application/]]\\
 +[[https://kubernetes.io/docs/tasks/debug/debug-cluster/]]\\
 +[[https://kubernetes.io/docs/tasks/debug/debug-application/determine-reason-pod-failure/]]\\
 +
  
 ====REST API==== ====REST API====
Line 428: Line 551:
 /api/v1/namespaces/default/pods/mujpod/log\\ /api/v1/namespaces/default/pods/mujpod/log\\
 /api/v1/namespaces/default/pods/mujpod/exec\\ /api/v1/namespaces/default/pods/mujpod/exec\\
 +/apis/networking.k8s.io/v1/ingresses\\
 +/apis/metrics/k8s.io/ ... metriky\\
 +/apis/metrics.k8s.io/v1beta1/nodes ... metriky nodů\\
 +/apis/metrics.k8s.io/v1beta1/pods\\