Kubernetes (K8s): A konténer orkhesztrációs platform működése és célja

21 perc olvasás

A modern szoftverfejlesztés világában egyre gyakrabban találkozunk olyan kihívásokkal, amelyek megoldása hagyományos módszerekkel szinte lehetetlen. Az alkalmazások skálázása, a különböző környezetek közötti konzisztencia biztosítása, valamint a mikroszolgáltatások hatékony kezelése mind olyan problémák, amelyek új megközelítést igényelnek.

Tartalom

A Kubernetes egy nyílt forráskódú konténer orkhesztrációs platform, amely a Google által fejlesztett Borg rendszer tapasztalataira épül. Ez a rendszer forradalmasította azt, ahogyan a fejlesztők és rendszergazdák gondolkodnak a konténerizált alkalmazások telepítéséről, kezeléséről és skálázásáról. A platform nemcsak technikai megoldást kínál, hanem egy teljesen új filozófiát is képvisel a modern infrastruktúra menedzsment terén.

Ebben az útmutatóban részletesen megvizsgáljuk a Kubernetes működését, alapelveit és gyakorlati alkalmazását. Megtanuljuk, hogyan segít ez a platform a komplex alkalmazások egyszerűbb kezelésében, milyen előnyöket nyújt a hagyományos megoldásokhoz képest, és hogyan építhetünk fel egy hatékony, skálázható rendszert a segítségével.

Mi a Kubernetes és miért forradalmi?

A Kubernetes alapvetően egy automatizálási platform, amely képes kezelni a konténerizált alkalmazások teljes életciklusát. A rendszer célja, hogy elvegye a terheket a fejlesztők válláról azáltal, hogy automatizálja a telepítést, skálázást, és az alkalmazások állapotának fenntartását.

A platform három fő pillérre épül: deklaratív konfiguráció, automatikus gyógyulás és horizontális skálázás. Ez azt jelenti, hogy a felhasználók csak leírják, milyen végállapotot szeretnének elérni, és a Kubernetes gondoskodik arról, hogy ez az állapot folyamatosan fennmaradjon.

A Google több mint 15 éves tapasztalata a nagy léptékű rendszerek üzemeltetésében mind belefolyt ebbe a projektbe. A Kubernetes képes kezelni akár több ezer node-ot és több millió konténert egyidejűleg.

A konténer orkhesztráció jelentősége

A modern alkalmazásfejlesztésben a konténerek használata már nem kérdés, hanem szükségszerűség. A Docker és hasonló technológiák lehetővé tették, hogy az alkalmazásokat izolált, hordozható csomagokba helyezzük.

Azonban a konténerek önmagukban még nem jelentenek teljes megoldást. Szükség van egy olyan rendszerre, amely képes koordinálni ezeket a konténereket, biztosítani a közöttük lévő kommunikációt, és kezelni a hibákat.

A Kubernetes pontosan ezt a koordinációs szerepet tölti be, és sokkal többet nyújt egy egyszerű konténer futtatónál.

Kubernetes architektúra és alapkomponensek

Master komponensek (Control Plane)

A Kubernetes architektúrájának szíve a Control Plane, amely tartalmazza az összes döntéshozó komponenst. Ez a réteg felelős a klaszter állapotának nyomon követéséért és a szükséges változtatások végrehajtásáért.

Az API Server szolgál a klaszter központi kommunikációs pontjaként. Minden kérés ezen keresztül érkezik be, legyen szó pod-ok létrehozásáról, service-ek konfigurálásáról vagy erőforrások lekérdezéséről.

Az etcd egy elosztott kulcs-érték tároló, amely a klaszter teljes állapotát őrzi. Ez a komponens kritikus fontosságú, mivel minden konfiguráció és metaadat itt tárolódik.

Worker node komponensek

A kubelet az egyes node-okon futó ügynök, amely felelős a pod-ok életciklusának kezeléséért. Ez a komponens kommunikál az API Server-rel, és gondoskodik arról, hogy a node-on futó konténerek megfeleljenek a specifikációnak.

A kube-proxy hálózati proxy, amely lehetővé teszi a service-ek működését és a load balancing-ot. Ez biztosítja, hogy a különböző pod-ok között megfelelően működjön a hálózati kommunikáció.

A Container Runtime (általában Docker vagy containerd) felelős a konténerek tényleges futtatásáért és kezeléséért az operációs rendszer szintjén.

Kubernetes objektumok és erőforrások

Pod-ok: Az alapvető építőkövek

A Pod a legkisebb telepíthető egység a Kubernetes-ben. Egy pod egy vagy több konténert tartalmazhat, amelyek közös hálózati és tárolási erőforrásokat használnak.

A pod-ok múlandóak – ez azt jelenti, hogy bármikor létrehozhatók, törölhetők vagy újraindíthatók. Ez a filozófia alapvetően különbözik a hagyományos virtuális gépek világától.

Minden pod egyedi IP címet kap, és a pod-on belüli konténerek a localhost-on keresztül kommunikálhatnak egymással.

Deployment-ek és ReplicaSet-ek

A Deployment magas szintű objektum, amely leírja, hogyan kell telepíteni és frissíteni az alkalmazásokat. A deployment-ek deklaratív módon határozzák meg a kívánt állapotot.

A ReplicaSet biztosítja, hogy mindig a megfelelő számú pod replika fusson. Ha egy pod meghibásodik, a ReplicaSet automatikusan létrehoz egy újat a helyére.

Ez a kombináció teszi lehetővé a zökkenőmentes alkalmazásfrissítéseket és a magas rendelkezésre állást.

Service-ek és hálózatkezelés

Service típus Leírás Használati terület
ClusterIP Belső hozzáférés a klaszteren belül Mikroszolgáltatások közötti kommunikáció
NodePort Külső hozzáférés node IP-n keresztül Fejlesztési és tesztelési környezetek
LoadBalancer Cloud provider load balancer Produkciós külső hozzáférés
ExternalName DNS CNAME rekord Külső szolgáltatások integrálása

A Service objektumok stabil hálózati végpontokat biztosítanak a pod-ok számára. Mivel a pod-ok IP címei változhatnak, a service-ek állandó belső DNS neveket és IP címeket biztosítanak.

Az Ingress lehetővé teszi a HTTP és HTTPS forgalom irányítását a klaszteren belüli service-ek felé. Ez különösen hasznos webalkalmazások esetében.

ConfigMap-ek és Secret-ek kezelése

Konfiguráció menedzsment

A ConfigMap objektumok lehetővé teszik a konfigurációs adatok elkülönítését az alkalmazás kódjától. Ez növeli a hordozhatóságot és megkönnyíti a különböző környezetek kezelését.

A konfigurációs adatok többféle módon injektálhatók a pod-okba: környezeti változókként, parancssori argumentumokként, vagy fájlokként egy volume-on keresztül.

Ez a megközelítés követi a 12-factor app elveit, és jelentősen javítja az alkalmazások karbantarthatóságát.

Érzékeny adatok védelme

A Secret objektumok az érzékeny információk (jelszavak, API kulcsok, tanúsítványok) biztonságos tárolására szolgálnak. Ezek az adatok base64 kódolással vannak tárolva az etcd-ben.

A secret-ek automatikusan mountolhatók a pod-okba volume-ként, vagy beinjektálhatók környezeti változókként. A Kubernetes biztosítja, hogy ezek az adatok csak a szükséges pod-ok számára legyenek elérhetők.

Fontos megjegyezni, hogy a secret-ek alapértelmezetten nincsenek titkosítva az etcd-ben, ezért érdemes megfontolni az etcd titkosítás engedélyezését.

"A Kubernetes legnagyobb erőssége abban rejlik, hogy a komplex infrastrukturális problémákat egyszerű, deklaratív API-kon keresztül teszi kezelhetővé."

Persistent Volume-ok és tárolás

Állandó adatok kezelése

A Persistent Volume (PV) a klaszterben elérhető tárolási erőforrást reprezentál. Ezek lehetnek helyi disk-ek, hálózati tárolók, vagy cloud provider által biztosított tárolási szolgáltatások.

A Persistent Volume Claim (PVC) egy kérés tárolási erőforrásra. A pod-ok PVC-ken keresztül kérnek tárolási helyet, anélkül, hogy tudniuk kellene a mögöttes tárolási infrastruktúra részleteiről.

Ez az absztrakció lehetővé teszi, hogy az alkalmazások hordozhatóak maradjanak különböző tárolási megoldások között.

Storage Class-ok és dinamikus provisioning

A Storage Class leírja a különböző tárolási típusokat és azok paramétereit. Például SSD vagy HDD tárolás, replikációs szint, vagy teljesítmény karakterisztikák.

A dinamikus provisioning lehetővé teszi, hogy a PVC-k automatikusan létrehozzák a szükséges PV-ket a Storage Class alapján. Ez jelentősen leegyszerűsiti a tárolás kezelését.

A cloud környezetekben ez különösen hatékony, mivel a Kubernetes automatikusan létrehozhatja a szükséges disk-eket és csatolhatja azokat a node-okhoz.

Namespace-ek és erőforrás szeparáció

Logikai elkülönítés

A Namespace-ek lehetővé teszik a klaszter erőforrásainak logikai csoportosítását. Ez különösen hasznos multi-tenant környezetekben vagy amikor különböző projekteket szeretnénk elkülöníteni.

Az alapértelmezett namespace-ek közé tartozik a default, kube-system és kube-public. A felhasználók saját namespace-eket hozhatnak létre projektjeik vagy környezeteik számára.

A namespace-ek DNS szintű elkülönítést is biztosítanak – a service-ek teljes neve tartalmazza a namespace-t is.

Resource Quota és Limit Range

A Resource Quota lehetővé teszi a namespace-ekben használható erőforrások korlátozását. Ez magában foglalja a CPU, memória, tárolás és objektum számok korlátozását.

A Limit Range az egyes objektumok (pod-ok, konténerek) erőforrás-használatának alsó és felső határait határozza meg. Ez megakadályozza, hogy egy alkalmazás monopolizálja a klaszter erőforrásait.

Ezek a mechanizmusok elengedhetetlenek a multi-tenant környezetek biztonságos üzemeltetéséhez.

Monitoring és logging megoldások

Beépített monitoring eszközök

A Kubernetes beépített monitoring képességekkel rendelkezik a Metrics Server révén. Ez gyűjti az alapvető erőforrás-használati metrikákat (CPU, memória) a node-okról és pod-okról.

Ezek a metrikák lehetővé teszik a Horizontal Pod Autoscaler (HPA) működését, amely automatikusan skálázza a pod-ok számát a terhelés alapján.

A Vertical Pod Autoscaler (VPA) pedig az egyes pod-ok erőforrás kéréseit optimalizálja a tényleges használat alapján.

Külső monitoring megoldások

Monitoring stack Komponensek Előnyök
Prometheus + Grafana Metrics collection, alerting, visualization Nagy közösségi támogatás, gazdag ecosystem
ELK Stack Elasticsearch, Logstash, Kibana Erős log analytics képességek
Jaeger Distributed tracing Mikroszolgáltatások teljesítmény monitoring
Fluentd/Fluent Bit Log aggregation Könnyű, hatékony log shipping

A Prometheus az egyik legnépszerűbb monitoring megoldás Kubernetes környezetekben. Pull-alapú metrika gyűjtést használ, és natív Kubernetes integrációval rendelkezik.

A Grafana vizualizációs eszközként használható a Prometheus metrikák megjelenítésére, és számos előre elkészített dashboard-dal rendelkezik Kubernetes-hez.

Security és RBAC (Role-Based Access Control)

Hitelesítés és jogosultságkezelés

A Kubernetes többféle hitelesítési mechanizmust támogat: X.509 tanúsítványok, bearer tokenek, és külső identity provider-ek integrációját (OIDC, LDAP).

Az RBAC rendszer lehetővé teszi a finomhangolt jogosultságkezelést. A Role és ClusterRole objektumok határozzák meg az engedélyeket, míg a RoleBinding és ClusterRoleBinding objektumok rendelik hozzá ezeket a szerepköröket felhasználókhoz vagy service account-okhoz.

Ez a rendszer biztosítja, hogy minden felhasználó és alkalmazás csak azokhoz az erőforrásokhoz férjen hozzá, amelyekre szüksége van.

Pod Security Standards

A Pod Security Standards három szinten határozzák meg a pod-ok biztonsági követelményeit: Privileged, Baseline, és Restricted.

A Network Policies lehetővé teszik a hálózati forgalom finomhangolt szabályozását pod-ok között. Ez különösen fontos mikroszolgáltatás architektúrákban.

A Security Context beállításokkal korlátozható a konténerek futási környezete, például a root jogosultságok megvonása vagy a fájlrendszer read-only módban történő mountolása.

"A Kubernetes biztonsági modellje a defense-in-depth elvén alapul, ahol minden rétegben alkalmazunk védelmi mechanizmusokat."

Skálázás és teljesítményoptimalizálás

Automatikus skálázás típusai

A Horizontal Pod Autoscaler (HPA) a pod-ok számát növeli vagy csökkenti a CPU, memória vagy egyéni metrikák alapján. Ez az egyik leggyakrabban használt skálázási mechanizmus.

A Vertical Pod Autoscaler (VPA) az egyes pod-ok erőforrás kéréseit (CPU, memória) optimalizálja a tényleges használat alapján. Ez különösen hasznos olyan alkalmazásoknál, ahol nehéz előre megbecsülni az erőforrásigényt.

A Cluster Autoscaler automatikusan hozzáad vagy eltávolít node-okat a klaszterből a pending pod-ok és az erőforrás-kihasználtság alapján.

Erőforrás menedzsment best practice-ek

Az erőforrás requests és limits helyes beállítása kritikus a klaszter stabil működéséhez. A request érték alapján történik az ütemezés, míg a limit határozza meg a maximum felhasználható erőforrást.

A Quality of Service (QoS) osztályok (Guaranteed, Burstable, BestEffort) befolyásolják, hogy melyik pod-okat távolítja el először a rendszer erőforrás-szűkösség esetén.

A Pod Disruption Budget (PDB) biztosítja, hogy karbantartás vagy frissítés során mindig elegendő számú pod maradjon futásban az alkalmazás elérhetőségének fenntartásához.

Helm és package menedzsment

Alkalmazások csomagolása és telepítése

A Helm a Kubernetes package manager-e, amely lehetővé teszi az alkalmazások egyszerű csomagolását, verziókezelését és telepítését. A Helm chart-ok template-eket tartalmaznak, amelyek paraméterezhetők.

A Helm chart-ok tartalmazhatnak dependency-ket más chart-okra, így komplex alkalmazás stack-ek is egyszerűen telepíthetők. A values.yaml fájlok lehetővé teszik a konfigurációk testreszabását különböző környezetekhez.

A Helm Hub és az Artifact Hub központi helyet biztosítanak a közösségi chart-ok megosztásához és felfedezéséhez.

Chart fejlesztés és best practice-ek

A Helm chart-ok fejlesztésekor fontos követni a közösségi konvenciókat és best practice-eket. Ez magában foglalja a proper labeling-et, a resource limit-ek beállítását, és a security context-ek használatát.

A helm test parancs lehetővé teszi a telepített alkalmazások automatikus tesztelését. Ez különösen hasznos CI/CD pipeline-okban.

A chart verziókezelés és a backward compatibility fenntartása kritikus fontosságú a production környezetekben történő használathoz.

"A Helm forradalmasította a Kubernetes alkalmazások telepítését azáltal, hogy a komplex YAML konfigurációkat újrafelhasználható, paraméterezhetó template-ekké alakította."

CI/CD integráció és GitOps

Continuous Integration és Deployment

A Kubernetes kiválóan integrálható CI/CD pipeline-okkal. A kubectl parancssor eszköz lehetővé teszi a deployment-ek automatizálását build folyamatok részeként.

A rolling update stratégia biztosítja, hogy az alkalmazásfrissítések zökkenőmentesen történjenek, minimális downtime-mal. A blue-green és canary deployment stratégiák további lehetőségeket biztosítanak a kockázatok minimalizálásához.

A admission controller-ek lehetővé teszik egyéni szabályok és validációk alkalmazását a deployment folyamat során.

GitOps workflow

A GitOps megközelítés a Git repository-t használja a klaszter kívánt állapotának single source of truth-jaként. Az ArgoCD és Flux népszerű GitOps operátorok.

Ez a megközelítés biztosítja a verziókezelést, auditálhatóságot és a rollback lehetőségét. A klaszter állapota mindig szinkronban van a Git repository tartalmával.

A GitOps workflow különösen hatékony multi-cluster környezetekben, ahol konzisztens konfigurációt kell fenntartani több klaszter között.

Service Mesh és mikroszolgáltatások

Istio és hálózati absztrakció

Az Istio service mesh megoldás további hálózati funkcionalitásokat ad a Kubernetes-hez. Ez magában foglalja a traffic management-et, security policy-ket, és observability funkciókat.

A service mesh sidecar proxy mintát használ, ahol minden pod mellé egy Envoy proxy kerül telepítésre. Ez lehetővé teszi a hálózati forgalom finomhangolt vezérlését anélkül, hogy az alkalmazás kódját módosítani kellene.

Az mTLS (mutual TLS) automatikus engedélyezése biztosítja a service-ek közötti kommunikáció titkosítását és hitelesítését.

Canary deployment-ek és A/B testing

A service mesh lehetővé teszi a forgalom százalékos elosztását különböző service verziók között. Ez ideális canary deployment-ekhez és A/B testing-hez.

A circuit breaker és retry mechanizmusok javítják az alkalmazások rezilienciáját mikroszolgáltatás architektúrákban.

A distributed tracing funkciók segítenek a komplex service-ek közötti interakciók nyomon követésében és a teljesítmény problémák azonosításában.

"A service mesh technológia lehetővé teszi, hogy a hálózati komplexitást az alkalmazás rétegből az infrastruktúra rétegbe helyezzük át."

Multi-cluster menedzsment

Cluster Federation és hibrid felhő

A Cluster Federation lehetővé teszi több Kubernetes klaszter központi kezelését. Ez különösen hasznos hibrid felhő környezetekben vagy disaster recovery stratégiák megvalósításához.

A cross-cluster service discovery biztosítja, hogy a különböző klaszterekben futó service-ek megtalálják egymást. Ez kritikus fontosságú multi-region alkalmazások esetében.

A cluster-level resource scheduling lehetővé teszi a workload-ok optimális elosztását a rendelkezésre álló klaszterek között.

Edge computing és IoT

A K3s és MicroK8s könnyűsúlyú Kubernetes disztribúciók, amelyek edge device-okra és IoT környezetekre optimalizáltak.

Az edge computing szcenáriókban a Kubernetes lehetővé teszi az alkalmazások konzisztens telepítését és kezelését a központi adatközponttól a peremeszközökig.

A KubeEdge projekt specifikusan az edge computing use case-ekre fókuszál, és kiterjeszti a Kubernetes képességeit edge node-okra.

Troubleshooting és hibakeresés

Általános hibakeresési technikák

A kubectl logs parancs az első eszköz a pod-ok hibakeresésénél. A --previous flag lehetővé teszi az előző konténer példány log-jainak megtekintését crash esetén.

A kubectl describe parancs részletes információt ad az objektumok állapotáról és az esetleges eseményekről. Ez gyakran segít azonosítani a deployment problémák okát.

A kubectl exec lehetővé teszi a futó pod-okba való belépést debugging célokra. Ez különösen hasznos hálózati és konfigurációs problémák diagnosztizálásához.

Gyakori problémák és megoldások

Az ImagePullBackOff hiba általában azt jelenti, hogy a konténer image nem érhető el vagy a hitelesítés sikertelen. Ellenőrizni kell az image név helyességét és a registry hozzáférést.

A CrashLoopBackOff állapot azt jelzi, hogy a konténer folyamatosan újraindul. Ez általában alkalmazás szintű hiba vagy helytelen konfiguráció miatt történik.

A Pending állapotban ragadt pod-ok gyakran erőforrás-szűkösség vagy scheduling constraint-ek miatt nem tudnak elindulni.

"A hatékony Kubernetes troubleshooting a megfelelő monitoring és logging infrastruktúra nélkül szinte lehetetlen."

Kubernetes ökoszisztéma és jövő

CNCF projektek és integráció

A Cloud Native Computing Foundation (CNCF) számos projektet inkubál, amelyek kiegészítik a Kubernetes funkcionalitását. Ezek közé tartozik a Prometheus, Envoy, CoreDNS, és containerd.

A Operator pattern lehetővé teszi komplex alkalmazások (adatbázisok, message queue-k) natív Kubernetes objektumokként történő kezelését. Az operátorok domain-specifikus tudást kódolnak a Kubernetes API-ba.

A Custom Resource Definition (CRD) mechanizmus lehetővé teszi új API objektum típusok létrehozását, így kiterjesztve a Kubernetes funkcionalitását.

Emerging technológiák és trendek

A WebAssembly (WASM) támogatás új lehetőségeket nyit a konténerek alternatívájaként. A WASM runtime-ok kisebb erőforrásigényűek és gyorsabb indítási idővel rendelkeznek.

A serverless és Functions-as-a-Service megoldások (mint a Knative) egyre népszerűbbek Kubernetes platformokon. Ezek lehetővé teszik az event-driven alkalmazások fejlesztését.

Az AI/ML workload-ok támogatása folyamatosan fejlődik, GPU scheduling és specialized operator-ek révén.

"A Kubernetes ökoszisztéma rendkívül dinamikus, és folyamatosan új megoldások jelennek meg a különböző use case-ek kiszolgálására."

Költségoptimalizálás és erőforrás-hatékonyság

Cloud költségek menedzsmentje

A resource requests és limits helyes beállítása kritikus a költségoptimalizáláshoz. A túl magas request értékek pazarló erőforrás-kiosztáshoz vezetnek.

A spot instance-ok használata jelentős költségmegtakarítást eredményezhet, különösen batch job-ok és fault-tolerant alkalmazások esetében.

A cluster autoscaling és vertical pod autoscaling kombinációja biztosítja, hogy csak annyi erőforrást fizessünk, amennyire ténylegesen szükség van.

Erőforrás-kihasználtság optimalizálás

A bin packing algoritmusok javítják a node-ok kihasználtságát azáltal, hogy optimálisan helyezik el a pod-okat. A pod affinity és anti-affinity szabályok segíthetnek ebben.

A multi-tenancy megoldások lehetővé teszik több alkalmazás vagy csapat számára ugyanazon klaszter használatát, csökkentve az infrastruktúra költségeket.

A resource quotas és limit ranges megakadályozzák az erőforrások pazarlását és biztosítják a fair használatot.


Mik a Kubernetes fő komponensei?

A Kubernetes két fő részből áll: a Control Plane (master komponensek) és a Worker Node-ok. A Control Plane tartalmazza az API Server-t, etcd-t, Scheduler-t és Controller Manager-t. A Worker Node-okon fut a kubelet, kube-proxy és a container runtime.

Hogyan működik a Kubernetes scheduling?

A Kubernetes Scheduler a pod-okat a rendelkezésre álló node-okra helyezi el különböző kritériumok alapján: erőforrás követelmények, affinity/anti-affinity szabályok, taints és tolerations. A scheduling döntés figyelembe veszi a node-ok aktuális terhelését és kapacitását.

Mi a különbség a Deployment és a Pod között?

A Pod a legkisebb telepíthető egység, amely egy vagy több konténert tartalmaz. A Deployment magasabb szintű objektum, amely Pod-ok csoportját kezeli, biztosítja a kívánt replika számot és lehetővé teszi a rolling update-eket.

Hogyan biztosítja a Kubernetes a magas rendelkezésre állást?

A Kubernetes több mechanizmust használ: replica set-ek biztosítják a pod-ok számát, liveness és readiness probe-ok monitorozzák az alkalmazások állapotát, a multi-master setup védi a control plane-t, és a pod disruption budget-ek korlátozzák az egyidejű leállásokat.

Mikor érdemes Service Mesh-t használni?

A Service Mesh akkor hasznos, ha komplex mikroszolgáltatás architektúrával rendelkezünk, ahol szükség van advanced traffic management-re, security policy-kre, observability funkcióra és service-ek közötti mTLS kommunikációra anélkül, hogy az alkalmazás kódját módosítanánk.

Hogyan lehet optimalizálni a Kubernetes költségeket?

A költségoptimalizálás főbb módjai: helyes resource request/limit beállítások, cluster és pod autoscaling használata, spot instance-ok alkalmazása, resource quota-k bevezetése, és a workload-ok megfelelő ütemezése a node-ok kihasználtságának maximalizálása érdekében.

Megoszthatod a cikket...
Beostech
Adatvédelmi áttekintés

Ez a weboldal sütiket használ, hogy a lehető legjobb felhasználói élményt nyújthassuk. A cookie-k információit tárolja a böngészőjében, és olyan funkciókat lát el, mint a felismerés, amikor visszatér a weboldalunkra, és segítjük a csapatunkat abban, hogy megértsék, hogy a weboldal mely részei érdekesek és hasznosak.