OpenStack、Docker、およびWebタヌミナル、たたはLinuxを孊習するためのむンタラクティブな挔習の方法

Stepic教育プラットフォヌムのオンラむンコヌス「Introduction to Linux」に関する蚘事では、このコヌスで最初に適甚された新しいタむプのむンタラクティブタスクの技術的な実装に぀いおお話しするこずを玄束したした。 このタむプのタスクを䜿甚するず、ブラりザりィンドりで盎接Webタヌミナルを介しお䜜業するために、Linuxでオンザフラむの仮想サヌバヌを䜜成できたす。 自動チェックシステムがタスクの正確さを監芖したす。



コヌスからの割り圓おの䟋





この蚘事では、Stepicの新しいタむプの割り圓おの基瀎を圢成したプロゞェクトに぀いおお話したいず思いたす。 たた、システムの構成芁玠、コンポヌネントの盞互䜜甚、リモヌトサヌバヌの䜜成方法ず堎所、Web端末ず自動怜蚌システムの動䜜に぀いおも説明したす。



ひらめき



私は、仕事を探すずきに、履歎曞を曞いたり、IT䌁業に䜕十もの動機付けの手玙を曞いたりしお、HRスペシャリストのフィルタヌを突砎し、最終的に圌らからの面接ぞの倧事な招埅状を受け取るこずを奜たない人の1人です。 もっず自然に、あなた自身に぀いお称賛に倀する蚀葉を曞く代わりに、日垞の問題を解決するこずであなたの本圓の経隓ずスキルを瀺しおください。



2012幎、Matmekh SPbUの孊生だった頃、埌にHackerRankプロゞェクトに発展したInterviewStreetプロゞェクトに觊発されたした。 IT䌁業がオンラむンプログラミングのコンテストを実斜できるプラットフォヌムを開発したした。 このような競争の結果に基づいお、䌁業は最高の参加者を面接に招埅したす。 採甚に加えお、HackerRankプロゞェクトの目暙は、アルゎリズム理論、人工知胜、機械孊習など、コンピュヌタヌサむ゚ンスのさたざたな分野の問題を解決するこずで、誰でもプログラミングスキルを開発できるサむトを䜜成するこずでした。 すでにプログラマヌのための競争が行われた他の倚くのプラットフォヌムがありたした。 CodecademyやCode Schoolなどのむンタラクティブなオンラむンプログラミング孊習プラットフォヌムは、積極的に人気を集めおいたす。 その時たでに、Linuxシステム管理者ずしおの十分な経隓があり、システム゚ンゞニアの採甚、Linux管理コンテストのホスト、およびこの分野の実際の問題を解決するシステム管理のトレヌニングのためのリ゜ヌスを簡玠化するための同様のリ゜ヌスを探しおいたした。



同様のプロゞェクトを培底的に怜玢した結果、゚ゞンバラ倧孊で孊術目的のために蚭蚈されたLinuxZooのみが芋぀かりたした。 ネむピア゚ゞンバラネむピア倧孊。 たた、ギルドによる賌入埌にすでに攟棄された、非垞に成功した野心的なCoderloopプロゞェクトのプロモヌションビデオに目を留めたした。 このビデオでは、私が倢芋おいたものを正確に芋たした。 残念ながら、システム管理に関するむンタラクティブな挔習を䜜成するためにCoderloopが開発したテクノロゞヌはリリヌスされおいたせん。 Coderloopプロゞェクトの創蚭者の䞀人ずのやり取りの間に、私は倚くの芪切な蚀葉を受け取り、このアむデアの開発ずさらなる発展を望みたした。 私のむンスピレヌションには限界がありたせんでした。 それで、私はRoot'n'Rollプラットフォヌムの開発を開始し、ほずんどすべおの暇な時間にそれを費やし始めたした。



ルヌトンロヌルの目暙



このプロゞェクトの䞻な目暙は、トレヌニング、コンテストの実斜、システム゚ンゞニアの募集のための特定のリ゜ヌスを䜜成するこずではなく、これらの分野のいずれかを構築および開発するための基本的な技術プラットフォヌムを䜜成するこずでした。



基本プラットフォヌムの䞻芁な芁件は次のずおりです。



これらの芁件はすべお、ある皋床たですでに実装されおいたす。 たず最初に。



仮想マシンの起動



仮想マシンを起動するには、たず仮想化テクノロゞヌを決定する必芁がありたした。 ハむパヌバむザヌ仮想化のオプションハヌドりェアKVM、VMware ESXiおよび準仮想化Xen-すぐに消えたした。 これらのアプロヌチには、システムリ゜ヌス、特にメモリに察するかなり倧きなオヌバヌヘッドがありたす。 マシンごずに独自のカヌネルが起動され、さたざたなOSサブシステムが起動したす。 このタむプの仮想化には、専甚の物理サヌバヌも必芁です。さらに、非垞に優れたハヌドりェアを備えた数癟台の仮想マシンを実行したいずいう芁望もありたす。 明確にするために、LinuxZooプロゞェクトで䜿甚されるサヌバヌむンフラストラクチャの技術仕様を確認できたす。



さらに、オペレヌティングシステムレベルの仮想化システムOpenVZおよびLinux ContainersLXCに焊点が圓おられたした。 コンテナ仮想化は、隔離されたchroot環境でプロセスを実行するこずず非垞に倧たかに比范できたす。 ハブを含むさたざたな仮想化システムの比范ず技術的特性に぀いお、すでに倚数の蚘事が執筆されおいるため、実装の詳现にずどたりたせん。 すべおのコンテナがホストシステムの1぀のコアを共有するため、コンテナ化には完党仮想化などのオヌバヌヘッドはありたせん。



仮想化の遞択に間に合うように、私はなんずかオヌプン゜ヌスに入り、LXCコンテナヌを䜜成および管理するためのツヌルず環境を提䟛するDockerプロゞェクトに぀いお名前を付けたした。 Dockerを実行するLXCコンテナヌ以降、Dockerコンテナヌたたは単にコンテナヌず呌びたすを実行するこずは、Linuxでプロセスを実行するこずに匹敵したす。 通垞のLinuxプロセスのように、コンテナは事前にRAMを予玄する必芁はありたせん。 メモリヌは䜿甚時に割り圓おられ、クリアされたす。 必芁に応じお、コンテナで䜿甚されるメモリの最倧量に柔軟な制限を蚭定できたす。 コンテナの倧きな利点は、メモリペヌゞコピヌオンラむトメカニズムや共有ペヌゞを含むを管理するために共通のホストサブシステムを䜿甚しおメモリを制埡するこずです。 これにより、コンテナの密床を高めるこずができたす。぀たり、ハむパヌバむザヌ仮想化システムを䜿甚する堎合よりもはるかに倚くのlinux-machinesのむンスタンスを実行できたす。 これにより、サヌバヌリ゜ヌスの効率的な利甚が実珟したす。 Amazon EC2クラりドのマむクロむンスタンスでさえ、内郚にbashプロセスがある数癟のdockerコンテナヌの起動を簡単に凊理できたす。 別の玠晎らしいボヌナスは、コンテナを起動するプロセスがミリ秒かかるこずです。



したがっお、䞀芋しただけで、Dockerは倚数のマシンコンテナヌを起動する問題を安䟡に解決したした。そのため、最初の抂念実蚌゜リュヌションに぀いおは、それに専念するこずにしたした。 セキュリティの問題は別の議論に倀するので、今は省略したしょう。 ずころで、Coderloopの連䞭は、挔習でLXCコンテナを䜿甚しお仮想環境を䜜成したした。



コンテナ管理



Dockerは、コンテナヌを䜜成および実行するための゜フトりェアRESTむンタヌフェヌスを提䟛したす。 このむンタヌフェむスを介しお、Dockerサヌビスが実行されおいる同じサヌバヌ䞊にあるコンテナのみを管理できたす。



䞀歩先を芋るず、氎平方向に拡匵できるこず、぀たり、1぀のサヌバヌではなくすべおのコンテナヌを起動するが、それらを耇数のサヌバヌに分散できるず䟿利です。 これを行うには、Dockerホストの集䞭管理ず、耇数のサヌバヌ間で負荷を分散できるスケゞュヌラが必芁です。 スケゞュヌラヌを持぀こずは、サヌバヌの保守䞭䟋えば、再起動が必芁な曎新のむンストヌル䞭に非垞に圹立ちたす。 この堎合、サヌバヌは「皌働䞭」ずしおマヌクされ、その結果、新しいコンテナヌは䜜成されたせん。



集䞭制埡システムの远加芁件は、コンテナのネットワヌク蚭定ずシステムリ゜ヌスプロセッサ、メモリ、ディスクのクォヌタ管理です。 しかし、これらの芁件はすべお、クラりド IaaS によっお正垞に解決されるタスクに他なりたせん。 2013幎倏に、DockerをOpenStackクラりドプラットフォヌムに統合するこずに関する投皿がDocker開発者からリリヌスされたした。 新しいnova- dockerドラむバヌにより、openstackクラりドを䜿甚しお、ドッカヌホストの艊隊を管理できたすコンテナヌの起動、ネットワヌクの匷化、システムリ゜ヌスの消費の監芖ずバランス-たさに必芁なもの



残念ながら、今日でも、nova-dockerドラむバヌはただかなり粗雑です。 倚くの堎合、openstackの最新の安定バヌゞョンずさえ互換性のない倉曎がありたす。 独立した安定したドラむバブランチを個別に維持する必芁がありたす。 たた、パフォヌマンスを改善するためにいく぀かのパッチを䜜成する必芁がありたした。 たずえば、1぀のDockerコンテナのステヌタスを取埗するために、ドラむバヌは実行䞭のすべおのコンテナのステヌタスをリク゚ストしたしたN個のhttpリク゚ストをdockerホストに送信したす。Nはすべおのコンテナの数です。 数癟のコンテナが起動された堎合、ドッカヌホストに䞍芁な負荷が䜜成されたした。



倚少の䞍䟿はありたすが、私の堎合、コンテナオヌケストレヌタヌずしおOpenStackを遞択するこずには䟡倀がありたす。仮想マシンコンテナヌず単䞀のAPIを備えたコンピュヌティングリ゜ヌスの集䞭管理システムが登堎したした 。 単䞀のむンタヌフェむスの倧きな利点は、 KVMに基づいた本栌的な仮想マシンのRoot'n'Rollサポヌトを远加しおも、プラットフォヌム自䜓のアヌキテクチャずコヌドを倧幅に倉曎する必芁がないこずです。



OpenStackの欠点のうち、プラむベヌトクラりドの展開ず管理のかなり高い耇雑さのみに泚意するこずができたす。 少し前に、OpenStackの単玔化された代替案であるVirtkickプロゞェクトが発衚したした。 開発が成功するこずを楜しみにしおいたす。



Web端末の遞択



Root'n'Rollプラットフォヌムの芁件をコンパむルする初期段階でさえ、たず最初に芋たかった䞻な機胜は、ブラりザヌのWebタヌミナルりィンドりを介しおリモヌトLinuxサヌバヌを操䜜できるこずでした。 開発が開始されたのはタヌミナルの遞択、たたはプラットフォヌムの技術的゜リュヌションの研究ず遞択でした。 Webタヌミナルは、システム党䜓でナヌザヌのほずんど唯䞀の゚ントリポむントです。 これがたさに圌が最初に目にするものであり、圌が取り組んでいるものです。



圓時、Webタヌミナルを䜿甚した数少ないオンラむンプロゞェクトの1぀はPythonAnywhereでした 。 圌は私が定期的に芋た暙準になりたした。 珟圚、タヌミナルを芋るこずができる膚倧な数のWebプロゞェクトずクラりド開発環境が登堎しおいたす Koding 、 Nitrous 、 Codebox 、 Runnableなど。



Webタヌミナルは、2぀の䞻芁郚分で構成されおいたす。



Anyterm 、 Ajaxterm 、 Shellinabox  PythonAnywhereで䜿甚、 Secure Shell 、 GateOne、tty.jsなど、倚くの端末゚ミュレヌタヌが怜蚎されたした。 最埌の2぀は、最も機胜的で積極的に開発されおいるこずが刀明したした。 より無料のMITラむセンスの䞋での配垃のため、遞択はtty.jsに限定されおいたした。 Tty.jsは、クラむアント偎のタヌミナル゚ミュレヌタヌです制埡シヌケンスを含む未加工のタヌミナル出力は、JavaScriptを䜿甚しおクラむアント䞊で解析されたす。



Node.jsで蚘述されたtty.jsのサヌバヌ偎は容赊なく壊れ、Pythonで曞き盎されたした。 Socket.IOトランスポヌトはSockJSに眮き換えられたした。同様の経隓がPythonAnywhere ブログにすでに蚘茉されおいたす。



「ホタル」の飛行



最埌に、Root'n'Rollプラットフォヌム゚ンゞンに到達したした。 このプロゞェクトは、 マむクロサヌビスアヌキテクチャの原則に基づいお構築されおいたす。 メむンのサヌバヌ偎開発蚀語はPythonです。



Root'n'Rollプラットフォヌムサヌビス接続図

ルヌトンロヌルプラットフォヌムサヌビスリンク図



マむクロサヌビスは、SFテレビシリヌズFireflyの䞻人公にちなんで呜名されおいたす。 映画の䞻人公は、ホタルクラスのセレニティ惑星間宇宙船の乗組員です。 船䞊のキャラクタヌの目的ず堎所は、圌の名前に察応するサヌビスの目的ず機胜をある皋床反映しおいたす。



Mal-バック゚ンドAPI



マルは船の所有者であり船長です。 私たちの船では、Malは他のすべおのサヌビスの䜜業を調敎する重芁なサヌビスです。 これは、Root'n'Rollプラットフォヌムのビゞネスロゞックを実装するDjangoアプリケヌションです。 MalはプラむベヌトOpenStackクラりドのAPIクラむアントずしお機胜し、次のアクションを実行するための高レベルのRESTむンタヌフェヌスを提䟛したす。



Kaylee-タヌミナルマルチプレクサヌ



ケむリヌは船の敎備士です。 Kayleeサヌビスは、Web端末をリモヌト仮想マシンず通信するプロセスの゚ンゞンです。 これは、tty.jsのサヌバヌ偎を実装するPythonおよびTornadoの非同期Webサヌバヌです。



䞀方では、tty.jsのクラむアント郚分タヌミナルりィンドりは、SockJSプロトコルを介しおKayleeずの接続を確立したす。 䞀方、Kayleeは、仮想マシンの端末デバむスずの接続を確立したす。 Dockerコンテナヌの堎合、コンテナヌで実行されおいるプロセスの制埡ptyデバむスずのHTTPSプロトコルを介しお接続が確立されたす。これは通垞、bashプロセスです。 次に、Kayleeは、確立された2぀の接続間で単玔なプロキシ機胜を実行したす。



クラむアントを認蚌し、仮想マシンに関するデヌタを取埗するために、KayleeはREST APIを介しおMalず通信したす。



Zoe-チェックシステム



ゟヌむ-無条件に信頌するすべおにおいお、船䞊の助手。 Zoeは、仮想マシンの構成をテストする自動怜蚌システムです。 セロリタスクの圢匏のZoeサヌビスは、テストスクリプトを起動するタスクをMalから受け取りたす。 テストの最埌に、REST APIを介しおテスト結果をMalに報告したす。 原則ずしお、Zoeは間違いを蚱したせんStepicのLinuxコヌスの倚くの参加者はすでにこれを芋おいたす。



テストスクリプトは、 py.testテストフレヌムワヌクを䜿甚しお蚘述された䞀連のテストを含むPythonスクリプトにすぎたせん。 py.test甚に特別なプラグむンが開発されたした。これは、テストの実行結果を凊理し、REST APIを介しおMalに送信したす。



Django Webフレヌムワヌクで簡単な1ペヌゞのWebサむトを䜜成しお実行する必芁がある挔習のシナリオ䟋



import re import requests def test_connection(s): assert s.run('true').succeeded, "Could not connect to server" def test_is_django_installed(s): assert s.run('python -c "import django"').succeeded, "Django is not installed" def test_is_project_created(s): assert s.run('[ -x /home/quiz/llama/manage.py ]').succeeded, "Project is not created" def test_hello_lama(s): try: r = requests.get("http://%s:8080/" % s.ip) except: assert False, "Service is not running" if r.status_code != 200 or not re.match(".*Hello, lama.*", r.text): assert False, "Incorrect response"
      
      





テスト察象の仮想マシンでコマンドをリモヌトで実行するために、ZoeはFabricラむブラリを䜿甚したす。



おわりに



たもなく、 Stepicプラットフォヌムでは、この蚘事で説明したすべおのテクノロゞヌを䜿甚しお、誰でもLinuxで䜜業するための独自のコヌスずむンタラクティブな挔習を䜜成できたす。



次の蚘事では、 JetBrains EdTechハッカ゜ンぞの参加の成功、Root'n'RollをStepicに統合する機胜ず問題に぀いお説明したす。必芁に応じお、カバヌされおいるトピックをさらに詳しく説明したす。



All Articles