From 07e66186f272029573013c83f36f8e5efc1efeae Mon Sep 17 00:00:00 2001 From: marcsello Date: Mon, 29 Nov 2021 01:15:22 +0100 Subject: [PATCH] added little --- src/content/overview.tex | 4 ++++ src/content/scheduling.tex | 14 ++++++++++++++ src/content/test_system.tex | 11 ++++++++++- src/content/ursim_impl.tex | 15 +-------------- src/figures/birb_edgemu_architecture.pdf | Bin 0 -> 21059 bytes 5 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 src/figures/birb_edgemu_architecture.pdf diff --git a/src/content/overview.tex b/src/content/overview.tex index 6941907..6e81a55 100644 --- a/src/content/overview.tex +++ b/src/content/overview.tex @@ -251,3 +251,7 @@ Egy federált \textit{Kubernetes} környezetnek több felhasználása is lehet. Bár egyértelműen látszik, hogy a \textit{Kubefed} elsősorban nem a peremhálózati rendszerek által nyújtott elvárások kielégítésre lett kifejlesztve. Általános klaszter federációs megoldásként viszont képes arra, hogy az ezen a téren támasztott elvárásoknak is többszörösen megfeleljen. Népszerűségének köszönhetően sok dokumentáció, leírás és egyéb segítség létezik hozzá. Emellett erősen épít a \textit{Kubernetes} szolgáltatásaira és tervezési mintáira. Ezeknek köszönhetően az üzemeltetése viszonylag egyszerű az olyan illetők számára aki már jártas a \textit{Kubernetes} klaszterek terén. + +% TODO: Még lehetne írni jókat erről + +\textbf{A feladatom megoldásához én ezt a keretrendszert választottam}, ennek okát \aref{sec:cloud_framework}.\ szekcióban részletezem. diff --git a/src/content/scheduling.tex b/src/content/scheduling.tex index b3b1c6b..85551bc 100644 --- a/src/content/scheduling.tex +++ b/src/content/scheduling.tex @@ -34,6 +34,20 @@ % Itt nézni lehetne, hogy hol járt már, az oda-vissza rakosgatás elkerülése érdekében. \section{Felhős Keretrendszer} +\label{sec:cloud_framework} + +% TODO: Itt nagyon sok mindent át kell írni + +%\subsection{Keretrendszer} +% +%\Aref{sec:frameworks}.\ szekcióban több keretrendszert is megvizsgáltam. Ezek közül a \textit{KubeEdge}-et választottam. +% +%A kiválasztásának fő oka az volt, hogy támogatja a mikroszolgáltatás architektúrát, emellett -- a leírása alapján -- könnyen lehet alkalmazni, hiszen ha az alkalmazásunk konténerből futtatható, alig kell rajta módosítani, hiszen a \textit{KubeEdge} képes ezeket a konténereket beütemezni, hogy a peremhálózaton futhassanak. Így a korábban szerzett mikroszolgáltatás alapú alkalmazásfejlesztési tapasztalataimat itt könnyen tudtam hasznosítani. +% +%Mindemellett \aref{sec:birbframework}.\ szekcióban kifejtettek alapján a másik alkalmazásomat is \textit{KubeEdge} alapokra építettem fel. Ennek köszönhetően a későbbi méréseimet is egyforma környezetben tudom végezni, ezzel egyszerűsítve azok implementációját amellett, hogy a két alkalmazáshoz nem kell két külön keretrendszert megismernem és fejleszteni rá. +% +%A \textit{KubeEdge} használatának további előnye, hogy az általam már jól ismert \textit{Kubernetes} konténer orkesztációs platformra épül így a telepítése és megismerése számomra egyszerűbb. + % Itt leírom, hogy az összes egy nagy kula, és a kubefedet is csak azért választom, hogy legyen egységes controlplane diff --git a/src/content/test_system.tex b/src/content/test_system.tex index e2373c5..78bd9b0 100644 --- a/src/content/test_system.tex +++ b/src/content/test_system.tex @@ -1,4 +1,13 @@ % !TeX root = ../thesis.tex %---------------------------------------------------------------------------- \chapter{Teszt környezet kialakítása} -%---------------------------------------------------------------------------- \ No newline at end of file +%---------------------------------------------------------------------------- + + + +\begin{figure}[h!] + \centering + \includegraphics[width=1\textwidth]{figures/birb_edgemu_architecture} + \caption{asd} + \label{fig:birb_edgemu_architecture} +\end{figure} \ No newline at end of file diff --git a/src/content/ursim_impl.tex b/src/content/ursim_impl.tex index c863dd6..d13364e 100644 --- a/src/content/ursim_impl.tex +++ b/src/content/ursim_impl.tex @@ -112,22 +112,9 @@ Az \gls{ini} fájl mellett a program a konkrét lépésekhez tartozó koordinát Alapos tervezést igényelt a fenti monolit demó átültetése egy felhő és perem számítástechnikai rendszerbe oly módon, hogy annak előnyeit megfelelően ki tudja használni. -% TODO: Itt nagyon sok mindent át kell írni - -%\subsection{Keretrendszer} -% -%\Aref{sec:frameworks}.\ szekcióban több keretrendszert is megvizsgáltam. Ezek közül a \textit{KubeEdge}-et választottam. -% -%A kiválasztásának fő oka az volt, hogy támogatja a mikroszolgáltatás architektúrát, emellett -- a leírása alapján -- könnyen lehet alkalmazni, hiszen ha az alkalmazásunk konténerből futtatható, alig kell rajta módosítani, hiszen a \textit{KubeEdge} képes ezeket a konténereket beütemezni, hogy a peremhálózaton futhassanak. Így a korábban szerzett mikroszolgáltatás alapú alkalmazásfejlesztési tapasztalataimat itt könnyen tudtam hasznosítani. -% -%Mindemellett \aref{sec:birbframework}.\ szekcióban kifejtettek alapján a másik alkalmazásomat is \textit{KubeEdge} alapokra építettem fel. Ennek köszönhetően a későbbi méréseimet is egyforma környezetben tudom végezni, ezzel egyszerűsítve azok implementációját amellett, hogy a két alkalmazáshoz nem kell két külön keretrendszert megismernem és fejleszteni rá. -% -%A \textit{KubeEdge} használatának további előnye, hogy az általam már jól ismert \textit{Kubernetes} konténer orkesztációs platformra épül így a telepítése és megismerése számomra egyszerűbb. - \subsection{Architektúra} -% TODO TODO TODO TODO TODO TODO TODO -Mivel a \textit{KubeEdge}-t választottam az alkalmazásom felépítésére, így nagyon egyszerű volt annak a kérdésnek a megválaszolása, hogy milyen architektúrát használok a szoftver elkészítésére. Az alkalmazást mikroszolgáltatás architektúrára terveztem. +Mivel a \textit{Kubefed} keretrendszert választottam az alkalmazásom futtatására, így ennek megfelelően kellett megválasztanom annak felépítését. Az alkalmazást mikroszolgáltatás architektúrára terveztem. \textit{Kubefed} használatával lényegében az alkalmazásunk (egy vagy több) \textit{Kubernetes} klaszterben fut. A mikroszolgáltatás architektúra az ilyen környezetben azért jó, mert az alkalmazás komponensek egymás belső működésétől függetlenek. Így amíg az egyes komponensek egymás \acrshort{api} felületét elérik, nem számít, hogy hol és milyen környezetben futnak. Természetesen a felületek elérése is egy összetett probléma önmagában, ennek megoldásáról \aref{chapter:dynamic_scheduling}.\ fejezet értekezik. Ennek érdekében a tervezés első lépéseként felbontottam funkcionális egységekre a jelenlegi demó vezérlést. A felbontásnál viszont itt nem csak a funkcionális egységek elkülönítését tartottam szem előtt. Mivel egy három rétegű architektúrára tervezek, ezért figyelembe kellett vennem annak elvárásait és adottságait. diff --git a/src/figures/birb_edgemu_architecture.pdf b/src/figures/birb_edgemu_architecture.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d14afc439ca80bf5f8a9be563165631c10f69056 GIT binary patch literal 21059 zcmb5V1CXUbw=Gz^WMa;x|GZ81x&fK|k zWqvy|BhL9^Eiy$>aXKb?Rv5B{^V3}zCPGF+dt)mYUS0+fCxDTQy%Qm&oV}N&jg1il z8$BbTE~O?D6Az)RrJbt>p$8|s0XwTM6`_!WgAG6fU@T+l!obGDLC?be9VjEIDkn=z zXk%#&Ad~=@SlfRGnmQS|(_7jzFtO3Iexr$4IN93*7`T||8R=PBIhg60*jWk1Yyc)M zPWE;TOf2;Orc^O9Gjg*04=xo9gQAnYsjCU#dtoZpmPQQU>nF73V*2j*uLWD$+ld;v z00=2XxtST6nV6WEIhh$**jZU<7#S(PKi_e3_NM>)5Pp6bfSu{TG_d?nI!ufRnP3=% z

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 NYDkd0yspXd{{Y