From 6b77b25dd7eb4742f89c1730d874ebaa523caa9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torma=20Krist=C3=B3f?= Date: Wed, 4 Dec 2019 21:27:35 +0100 Subject: [PATCH] more figures --- src/content/preparation.tex | 8 ++++++-- src/content/theory.tex | 12 ++++++++---- src/figures/kubeless_pod_creation.png | Bin 0 -> 25262 bytes 3 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 src/figures/kubeless_pod_creation.png diff --git a/src/content/preparation.tex b/src/content/preparation.tex index b3ec2c9..4418ded 100644 --- a/src/content/preparation.tex +++ b/src/content/preparation.tex @@ -3,8 +3,12 @@ \section{Topol\'ogia} A mérési infrastruktúra kialakításánál a fő szempont a potenciális szűk keresztmetszetek elkerülése volt, ennek okán a méréseket három nagy teljesítményű szerveren végeztem. A Kubernetes klaszter egy Masterből és egy Workerből állt, a harmadik számítógépen pedig a mérőeszközök futottak. Az így kialakított mérési klaszter előnye, hogy az egyik gépen futó, nagy erőforrás igényű folyamatok nem vesznek el egy másik gépen futó folyamattól erőforrást. Több Kubernetes Worker használatára volt lehetőség, de mivel egyszerre egy mérés futott, valamint a Workerek közötti elosztást nem volt cél vizsgálni, egyet is elégségesnek ítéltem. -%TODO - +\begin{figure}[!ht] +\centering +\includegraphics[width=120mm, keepaspectratio]{figures/physical_cluster.png} +\caption{A m\'er\'esekhez haszn\'alt fizikai klaszter fel\'ep\'it\'ese} +\label{fig:phys-clustert} +\end{figure} A számítógépek két tíz gigabites hálózati interfészen keresztül is össze vannak kötve. Egyiken keresztül csatlakoznak az internetre, ezen az interfészen publikus IP címmel rendelkeznek. A másikon csak egymást érik el, itt privát IP címük volt. Mindkét interfészen egy Layer 2-es szórási tartományban voltak. Szakdolgozatom elkészítése során több klaszterrel is dolgoztam, melyek fizikailag nem feltétlen voltak egy switchre bekötve, viszont ez legrosszabb esetben is csak minimálisan befolyásolhatja a méréseket. diff --git a/src/content/theory.tex b/src/content/theory.tex index d88f1fe..15ec1b5 100644 --- a/src/content/theory.tex +++ b/src/content/theory.tex @@ -104,7 +104,7 @@ A Kubeless egy Go nyelven írt, nyílt forr\'askódú, Kubernetes rendszerbe ép Egy telepített függvény lefutását több esemény - úgynevezett trigger - kiválthatja. Ezek közül egy a http kérés, amelyet a szakdolgozatomban vizsgáltam. Emellett van lehetőség eseményvezérelt műkődésre is, például Kafka rendszerben tárolt üzenetek feldolgozására is. -Lévén, hogy Function as a Service rendszerről van szó, a Kubeless-be telepítendő függvényeket sajátos módon kell megírni. \aref{code:hello-kubeless-go} K\'odr\'eszleten l\'athat\'o, hogy egy Kubeless specifikus csomagot kell import\'alni Go nyelven \'irt f\"uggv\'enyek eset\'eben. Szint\'en l\'atszik, hogy azon k\'iv\"ul egy\'eb t\"obblet teendő nincs. +Lévén, hogy Function as a Service rendszerről van szó, a Kubeless-be telepítendő függvényeket sajátos módon kell megírni. \aref{code:hello-kubeless-go} k\'odr\'eszleten l\'athat\'o, hogy egy Kubeless specifikus csomagot kell import\'alni Go nyelven \'irt f\"uggv\'enyek eset\'eben. Szint\'en l\'atszik, hogy azon k\'iv\"ul egy\'eb t\"obblet teendő nincs. \begin{lstlisting}[float=!ht,caption={Kubeless rendszerbe telep\'ithető Hello World k\'odr\'eszlet Go nyelven},label=code:hello-kubeless-go] package kubeless @@ -122,10 +122,14 @@ Mint az a fenti kódrészleten is látszik, a függvény első paraméterben meg Egy megírt függvényt telepíteni két módon lehet. Egy lehetőség közvetlen a Kubernetes API-t használva. Alternatíva és könnyítésként a Kubeless fejlesztői elkészítettek egy parancssoros programot, amelyet használva egyszerűen lehet telepíteni függvényeket, létrehozni triggereket, valamint beállítani a skálázást. Fontos, hogy telepítés közben nem jön létre automatikusan CPU limit egy-egy függvénynek, akkor sem, ha skálázást kérünk hozzá. Skálázáshoz a Kubeless a Horizontal Pod Autoscalert használja. -Mivel a Kubernetesben Podokat van lehetőség futtatni és ütemezni, a Kubeless függvényekből is Podokat kell létrehozni. Ez a folyamat részleteiben eltér programnyelvenként azok sajátosságai miatt. +Mivel a Kubernetesben Podokat van lehetőség futtatni és ütemezni, a Kubeless függvényekből is Podokat kell létrehozni. Ez a folyamat, amely \aref{fig:kubeless-pod-creation} \'abr\'an megfigyelhető, részleteiben eltér programnyelvenként azok sajátosságai miatt. -%TODO - +\begin{figure}[!ht] +\centering +\includegraphics[width=120mm, keepaspectratio]{figures/kubeless_pod_creation.png} +\caption{Kubeless f\"uggv\'enyből Pod l\'etrehoz\'asa} +\label{fig:kubeless-pod-creation} +\end{figure} A Podban futó konténer létrehozása során a Kubeless Controller a Debian nevű Docker képből indul ki. Először telepíti a programnyelv csomagjait, annak függőségeit és a kód binárissá fordításához szükséges eszközöket. Ez után felmásolja a kódot és a vele együtt, opcionálisan megadott függőségleíró állományt. A fordítási folyamat végén lefordítja a kódot. Ez a folyamat csak akkor lesz sikeres, ha a kód belepési függvényét tartalmazó fájlban meg van jelölve a Kubeless futtató környezet, mint függőség, ezáltal nincs szükség egyedi fordítóeszközre. Az elkészült, futtatható binárist megjelöli a rendszer, mint a képből futtatott konténer belépési pontját. Egy így készült Docker képet lehetőség van feltölteni a Docker Hubra, így későbbi használat során nincs szükség a folyamat újbóli futtatására. diff --git a/src/figures/kubeless_pod_creation.png b/src/figures/kubeless_pod_creation.png new file mode 100644 index 0000000000000000000000000000000000000000..9f19515cbc9ae93566062f5ec36b06ac063848bf GIT binary patch literal 25262 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 literal 0 HcmV?d00001