# HG changeset patch # User Ken Miyahira # Date 1597049733 -32400 # Node ID bb1a10c749249500e3f4fb8ce1857aac4e309b98 # Parent b76c03afc18fe6b8317c00b160df1c60ecf69623 update tex diff -r b76c03afc18f -r bb1a10c74924 paper/mk-wm.bib --- a/paper/mk-wm.bib Sun Aug 09 16:02:36 2020 +0900 +++ b/paper/mk-wm.bib Mon Aug 10 17:55:33 2020 +0900 @@ -38,6 +38,11 @@ title ="{https://docs.gitlab.com/runner/}", } +@manual{kvm, +author = "{KVM}", +title ="{https://www.linux-kvm.org/}", +} + @manual{gitlabcicd, author = "{GitLab CI/CD}", title ="{https://docs.gitlab.com/ce/ci/}", diff -r b76c03afc18f -r bb1a10c74924 paper/mk-wm.pdf Binary file paper/mk-wm.pdf has changed diff -r b76c03afc18f -r bb1a10c74924 paper/mk-wm.tex --- a/paper/mk-wm.tex Sun Aug 09 16:02:36 2020 +0900 +++ b/paper/mk-wm.tex Mon Aug 10 17:55:33 2020 +0900 @@ -66,12 +66,11 @@ 情報技術の普及に伴い情報系の学生が課題や演習を行う学習環境が必要である。 この学習環境では, 課題や演習によっては並列処理により, CPU より GPU が必要となる場合がある。 このような学習環境を複数の学生に提供する方法として, VM や コンテナがある。 -しかし, 琉球大学工学部で運用している VM 貸出サービスでは, GPU を共有することができない。 +しかし, 琉球大学工学部で運用している VM 貸出サービスでは, GPU を共有に対応していない。 そこで, コンテナを利用することができる Docker と Singularity を用いて, オンプレミス環境でコンテナ貸出サービスを提供する。 また, PC 上からコンテナへの操作を可能にするために Kubernetes でのコンテナ作成にも対応する。 コンテナ貸出サービスは LDAP で管理された学生のアカウントを使用することで, 適切にコンテナの管理を行う。 本稿ではサービスを実装する上で必要な技術概要を延べ, サービスの設計・実装を行う。 - \end{abstract} \maketitle @@ -81,14 +80,15 @@ だが, 手元の PC 上で VM や コンテナを立ち上げ, 開発を行うことはできるが, VM や コンテナの使用には高性能 PC や 有料のクラウドサービスが必要になる場合がある。 この大きな負担を学生に負わせない仕組みが必要である。 \par -琉球大学工学部工学科知能情報コースは2017 年度よりコース制へと移行し, 人工知能やシステム開発などの先端技術を身につける講義や実験が設けられた。 +琉球大学工学部工学科知能情報コースでは新たに人工知能やシステム開発などの先端技術を身につける講義や実験が設けられた。 講義の演習や実験は学生の PC で環境を構築し実行する。 本コースでは希望する学生に学科のブレードサーバから仮想環境を貸出すサービスを行なっている。 貸出をする VM のデフォルトのスペックは CPU 1コア, メモリ 1GB, ストレージ 10GB である。 デフォルトのスペックでは不足する場合, 要望に応じてスペックの変更を行なっている。 だが, 貸出 VM でも課題によってはスペックが足りなく, 処理に時間がかかることがあった。 例として, 人工知能の講義において課される課題においては CPU より GPU を用いることで処理時間を早くすることができる。 -しかし, 現在の VM 貸出サービスでは GPU を提供することができない。 +しかし, 現在の VM 貸出サービスでは GPU の共有に対応していない。 +また, VM 上で GPU を共有するには PCI パススルーを利用することで可能だが, PCI パススルーでは複数の VM に共有することができない。 GPU が搭載されている PC は研究室によっては用意されているが, 研究室に所属していない学生は利用することができない。 そのため, 本コースの学生が高性能な環境を利用できる新たな仕組みが必要である。 \par @@ -101,7 +101,7 @@ %また, 本コースの類似サービスの課題であった外部リポジトリの利用は, Docker の機能を HTTP API で提供することで解消する。 \section{技術概要} -本研究で必要な技術概要を述べる。 +本研究で使用した仮想化技術, コンテナ技術, また本コースで利用しているサービスについての概要を説明する。 \subsection{Docker} Docker とは OS レベルの仮想化技術を利用して, ソフトウェアをコンテナと呼ばれるパッケージで提供する。またコンテナの実行だけでなく, @@ -162,7 +162,8 @@ Singularity のコンテナイメージは Docker Hub に登録されているイメージ, またはDockerfile から作成したイメージを変換することで利用することができる。 \subsection{GitLab} -GitLab\cite{gitlab} とは バージョン管理システムである Git のリポジトリマネージャである。GitLab はオンプレミス環境で利用できるため, 本コースでは GitLab を使用している。 +GitLab\cite{gitlab} とは バージョン管理システムである Git のリポジトリマネージャである。 +GitLab は GitHub と違い, GitLab はオンプレミス環境に構築することができる。そのため, 本コースでは GitLab を使用している。 本研究では GitLab の統合機能の GitLab CI/CD\cite{gitlabcicd}, また GitLab CI/CD と組み合わせて使用する GitLab Runner\cite{gitlabrunner} を利用する。\par GitLab CI/CD は 継続的インテグレーション(CI)・継続的デリバリー(CD)を GitLab から利用することができる。 CI では GitLab のコードを定期的または自動的にビルド・テストを行う。CD は CI を拡張した機能であり, ビルドやテストだけでなくリリースの準備も行う。 @@ -170,75 +171,21 @@ \par GitLab Runner とは, ビルドのためのアプリケーションであり, GitLab CI と連携することで別の場所でビルドを動かすことができる。 -\section{本コースの類似サービス} -本サービスに類似したサービスとして, libvirt の CLI である virsh をラップしマルチユーザ VM 環境を提供する ie-virsh\cite{ie-virsh} 。 -また, Docker をラップし複数のユーザで利用することを目的とした ie-docker, Kubernetes を利用した教育用コンテナ貸出を目的とした digdog\cite{digdog} がある。 +\subsection{Kernel-based Virtual Machine (KVM)} +KVM\cite{kvm} とは, Linux 自体を VM の実行基盤として機能させるソフトウェアである。 +CPU の仮想化支援機能を必要とし, 完全仮想化により OS の仮想化環境を提供する。 \subsection{ie-virsh} -ie-virsh とは, 本コースの Operating System という講義に向けに libvirt の CLI である virsh をラップし複数のユーザで利用することができる VM 管理ツールである。 -ie-virsh は 本コースの講義に向け作成されたが, 学生の演習でも利用ができる。 -課題では VM の環境を学生が設定し, 情報工学科の持つブレードサーバ上にアップロードし, プログラムの実装や測定を行う。\cite{ie-virsh} -学生は手元の PC で作成した VM をブレードサーバ上にデプロイすることで, 演習環境を構築することができる。 -ie-virsh は ユーザの UID 及び GID 情報を取得することで, 他のユーザの VM を操作させない。表\ref{tb:ie-virsh}は ユーザが利用できる ie-virsh の機能である。 - -\begin{table}[htb] - \begin{center} - \caption{ie-virsh のコマンド} - \begin{tabular}{c|l} \hline - define & XML の template を下に domain を作成 \\ \hline - undefine & define で作成した domain を削除 \\ \hline - list & define で作成した domain の一覧表示 \\ \hline - start & 指定した domain 名の VM を起動 \\ \hline - destroy & 指定した domain 名の VM を停止 \\ \hline - dumpxml & domain の XML を参照 \\ \hline - \end{tabular} - \label{tb:ie-virsh} - \end{center} -\end{table} +ie-virsh\cite{ie-virsh} とは, 本コースの Operating System という講義に向けに libvirt の CLI である virsh をラップし複数のユーザで利用することができる VM 管理ツールである。 +学生が手元の PC で作成した VM をブレードサーバ上にデプロイすることができる。 \subsection{ie-docker} ie-docker とは Docker をラップし複数のユーザで利用することのできるコンテナ管理ツールである。 利用する学生は ssh でブレードサーバへ接続し, ie-docker を使用してコンテナを操作することができる。 -ie-docker は UID 及び GID 情報を取得することで, 他のユーザのコンテナを操作させない。 -またユーザが使える docker の機能を制限する。表\ref{tb:ie-docker}が ie-docker で利用できる機能である。 - -\begin{table}[htb] - \begin{center} - \caption{ie-docker のコマンド} - \begin{tabular}{c|l} \hline - ps & 起動中のコンテナの一覧を表示する \\ \hline - run & コンテナを作成する \\ \hline - start & コンテナを起動する \\ \hline - stop & コンテナを停止する \\ \hline - attach & 起動しているコンテナに attach する \\ \hline - cp & コンテナにファイルを送信する \\ \hline - rm & コンテナを削除する \\ \hline - \end{tabular} - \label{tb:ie-docker} - \end{center} -\end{table} \subsection{digdog} -digdog とは Kubernetes を利用したコンテナ貸出サービスである。 -学生は Dockerfile を GitLab CI/CD を利用してビルドし GitLab Registry に Docker イメージを登録する。 -学科アカウントを使用して Web サービスへログインし, 登録した Docker イメージでコンテナを作成することができる。 -コンテナ作成時は digdog が Kubernetes に Deployment を設定する。Deployment は学生のアカウント名で作成された Namespace に設定される。 -Namespace は Role と RoleBinding を用いた, Role-based access control (RBAC) が設定されている。 -そのため学生は Kubernetes コマンドである kubectl コマンドで 手元の PC から Pod の操作を行うことができる。 -RBAC で許可されているリソース操作は表\ref{tb:digdog}である。 - -\begin{table}[htb] - \begin{center} - \caption{kubectl のコマンド} - \begin{tabular}{c|l} \hline - get & Pod の一覧を表示する \\ \hline - log & Pod の Log を表示する \\ \hline - exec & Pod にアクセスする \\ \hline - \end{tabular} - \label{tb:digdog} - \end{center} -\end{table} - +digdog とは Kubernetes を利用し Web コンソールからコンテナを作成することができるコンテナ貸出サービスである。 +学生は学科アカウントを使用して Web サービスへログインし, 登録されている Docker イメージでコンテナを作成することができる。 \section{サービスの設計} サービスでは本コースの学生や教員がにコンテナ貸出を行う。このコンテナ貸出の構成を図\ref{fig:wm} に示し, 概要を以下で説明する。 @@ -286,7 +233,7 @@ \begin{figure*}[tb] \begin{center} - \includegraphics[width=100mm]{Images/whalemountain.pdf} + \includegraphics[width=97mm]{Images/whalemountain.pdf} \end{center} \caption{システム構成} \label{fig:wm} @@ -306,7 +253,7 @@ 新たにサービスを実装するとなると, システム管理チームが運用・管理を行いやすい実装にする必要がある。\par Web コンソールや Docker の操作を 1 つにまとめると, Docker コンテナの作成が 1台のブレードサーバのみになってしまう。 そこで, コンテナ貸出システムは, 機能ごとに以下の 3 つにサービスに分ける。 -Docker や Kubernetes の操作を HTTP API で提供することで, 図\ref{fig:api} のようにリクエスト先の変更で複数のブレードサーバにコンテナを分散することができる。 +Docker や Kubernetes の操作を HTTP API で提供することにより, リクエスト先を変更することで複数のブレードサーバにコンテナを分散することができる。 だが, 現時点では未実装である。\par 実装にはDocker や Kubernetes の実装言語であり, 操作するためのライブラリが揃っている Go 言語を使用する。 \begin{itemize} @@ -315,13 +262,13 @@ \item Kubernetes の操作 \end{itemize} -\begin{figure}[tb] - \begin{center} - \includegraphics[width=80mm]{Images/apihukusu.pdf} - \end{center} - \caption{機能の分散} - \label{fig:api} -\end{figure} +%\begin{figure}[tb] +% \begin{center} +% \includegraphics[width=80mm]{Images/apihukusu.pdf} +% \end{center} +% \caption{機能の分散} +% \label{fig:api} +%\end{figure} \subsection{Web コンソール} Web コンソールは本コースの学生や教員が利用するため, 学科アカウントでログインできる必要がある。学科の LDAP サーバを利用して学科アカウントで LDAP 認証を実装する。\par @@ -370,8 +317,9 @@ Ingress の流れでオブジェクトを作成する。コンテナの作成は Docker と同様に表\ref{tb:wmcon} の情報を下に作成する。 作成するそれぞれのオブジェクト名は Web コンソールでコンテナ名とアカウントID で補完される。また, Namespace はアカウントID となる。 コンテナの削除にはそれぞれのオブジェクト名と Namespace を用いる。\par -Kubernetes で作成したコンテナは Web コンソールから操作より, digdog でも利用されている RBAC を用いる方が操作がしやすい。 -RBAC で使用する 認証トークンはユーザごとに作成された Namespace に設定されるトークンを返すことで, 他のユーザが認証することはできない。 +Kubernetes で作成したコンテナは Web コンソールからコマンドの実行やファイルの送信などの操作を行わず, Role と RoleBinding を用いた Role-based access control (RBAC) +を利用することで手元の PC より操作を行うこととする。 +RBAC で使用する認証トークンはユーザごとに作成された Namespace に設定されるトークンを返すことで, 他のユーザが認証することはできない。 またアクセス制御は Namespace ごとに設定されることで, 他のユーザのコンテナを操作することはできない。 RBAC で許可するリソースの操作は表\ref{tb:wm} である。 @@ -397,31 +345,87 @@ \subsection{ie-virsh} ie-virsh は手元の PC で作成した VM を学科のブレードサーバにデプロイできるサービスである。 -VM は OS の仮想化環境を提供するため, ユーザが好みの環境を構築できるなど自由度が高い。\par -本研究で実装したサービスでは, Docker イメージで構築されたアプリケーションに限定される。 +ie-virsh は ユーザの UID 及び GID 情報を取得することで, 他のユーザの VM を操作させない。表\ref{tb:ie-virsh}は ユーザが利用できる ie-virsh の機能である。 +ie-virsh では VM の実行環境を提供するため, ユーザが好みの VM を構築できるなど自由度が高い。\par +本研究で実装したサービスでは, コンテナ作成に使用する Docker イメージで構築されたアプリケーションに限定される。 また, ユーザが欲しい環境は Docker イメージを作成しなければいけないため, Docker について学習する必要がある。 -だが, VM と違いコンテナを作成することで開発環境の構築やテスト, またイメージを共有することで同じ環境を他のユーザが利用することができる良さがある。 +だが, コンテナは VM と違い開発環境やテスト環境の構築の容易さや, 他のユーザにイメージを共有することで同じ環境を利用することができるなどの良さがある。 + +\begin{table}[htb] + \begin{center} + \caption{ie-virsh のコマンド} + \begin{tabular}{c|l} \hline + define & XML の template を下に domain を作成 \\ \hline + undefine & define で作成した domain を削除 \\ \hline + list & define で作成した domain の一覧表示 \\ \hline + start & 指定した domain 名の VM を起動 \\ \hline + destroy & 指定した domain 名の VM を停止 \\ \hline + dumpxml & domain の XML を参照 \\ \hline + \end{tabular} + \label{tb:ie-virsh} + \end{center} +\end{table} \subsection{ie-docker} ie-docker は Docker をラップしたツールであり, ユーザは学科のブレードサーバへ ssh で接続を行い CUI から利用することができる。 -表\ref{tb:ie-docker} の機能でコンテナを操作することができる。 -だが, ie-docker ではユーザがコンテナで使用するイメージを管理者が用意する必要がある。 \par +ie-docker は ユーザの UID 及び GID 情報を取得することで, 他のユーザのコンテナを操作させない。 +表\ref{tb:ie-docker} は ie-docker で利用できる機能である。 +この機能を使用しコンテナ作成などの操作を行うことができる。 +だが, ie-docker ではユーザがコンテナで使用するイメージを管理者が用意する必要がある。 +そのため, コンテナで使用したいイメージが用意されていないなどの問題があった。\par 本研究で実装したサービスでは, コンテナで使用するイメージは Docker Hub に登録されているイメージ, または作成したイメージを利用することができる。 -また, ユーザが Docker イメージを作成できることから管理者の負担が少なくなると考える。 +ユーザが Docker イメージを作成できることで管理者の負担が少なくなると考える。 + +\begin{table}[htb] + \begin{center} + \caption{ie-docker のコマンド} + \begin{tabular}{c|l} \hline + ps & 起動中のコンテナの一覧を表示する \\ \hline + run & コンテナを作成する \\ \hline + start & コンテナを起動する \\ \hline + stop & コンテナを停止する \\ \hline + attach & 起動しているコンテナに attach する \\ \hline + cp & コンテナにファイルを送信する \\ \hline + rm & コンテナを削除する \\ \hline + \end{tabular} + \label{tb:ie-docker} + \end{center} +\end{table} \subsection{digdog} digdog は Kubernetes を利用したコンテナ貸出サービスである。 -コンテナ作成時に選択できるイメージはユーザが作成する必要があり, Docker Hub に登録されているイメージを選択することができなかった。 \par -本研究で実装したサービスでは, コンテナで使用するイメージは Docker Hub に登録されているイメージ, または作成したイメージを利用することができる。 -また Kubernetes でのコンテナ貸出だけでなく, Docker でのコンテナ貸出を行うことができる。 -そのため, Kubernetes 全体が停止したとしてもブレードサーバの Docker のみでサービスを提供することができる。 +学生は Dockerfile を GitLab CI/CD を利用してビルドし, 学科の GitLab Container Registry に Docker イメージを登録する。 +Web コンソールからコンテナ作成で使用するイメージは, 登録したイメージから選択することができる。 +Kubernetes 上にコンテナを作成するため, 学生の入力を下に Deployment, Service, Ingress の作成を行う。 +また, Namespace はユーザのアカウントID で作成され, Namespace ごとに RBAC の設定がされている。 +そのため, 学生は手元の PC から Web コンソールから作成したコンテナを操作することができる。 +表\ref{tb:digdog} は RBAC で許可されているリソースの操作である。\par +本研究のサービスは digdog を参考に実装されている。そのため, Kubernetes でのコンテナ作成は digdog と同じ流れで作成を行う。 +だが, digdog では Docker Hub に登録されているイメージを選択することができない。 +また, Kubernetes でのコンテナ貸出のため, Kubernetes クラスター上の Master が停止するとサービスを提供できないなどの課題があった。 +本研究のサービスでは, Kubernetes でのコンテナの作成だけでなく, Docker でのコンテナの作成にも対応することで, Docker のみでサービスの提供ができるように改良を行った。 +また, コンテナ作成時のイメージを選択ではなく入力にすることで, Docker Hub に登録されているイメージを利用できるように改良を行った。 + +\begin{table}[htb] + \begin{center} + \caption{kubectl のコマンド} + \begin{tabular}{c|l} \hline + get & Pod の一覧を表示する \\ \hline + log & Pod の Log を表示する \\ \hline + exec & Pod にアクセスする \\ \hline + \end{tabular} + \label{tb:digdog} + \end{center} +\end{table} \subsection{クラウドサービス} 近年様々なクラウドサービスが普及し手元の PC から高性能なクラウド環境を利用することができる。 -だが, クラウドサービスは無料から有料まであり。無料では時間制限や容量制限など様々な制限がある。また有料だと気軽に利用しづらいなどの問題もある。 +だが, クラウドサービスは無料から有料まであり。無料では時間制限や容量制限など様々な制限がある。 +また有料だと設定のミスにより高額な請求がくるなど, 気軽に利用しづらい。 そのため, 本サービスはオンプレミス環境で実装を行った。 -オンプレミス環境を利用することで制限がなく, サービスで使用するデータを自身で管理できるなどの良さがある。 -だが, クラウドサービスと違い利用ドキュメントが無いため, 初めてでも利用しやすいよう改善や機能の追加をしていく必要がある。 +オンプレミス環境にすることで利用の制限がなく, サービスで使用するデータを自身で管理できるなどの良さがある。 +だが, クラウドサービスと違い物理サーバなどのメンテナンスや, サービスの導入にあたって環境構築などの課題がある。 +しかし, オンプレミスで運用していくことで, 学生の学習に繋がると考える。 \section{今後の課題} 本研究で実装したサービスでは学生が学習環境として利用するには, まだ必要な実装が不足している。\par