diff paper/mk-wm.tex @ 5:ef6f19e8ec75

update tex
author Ken Miyahira <e175733@ie.u-ryukyu.ac.jp>
date Mon, 03 Aug 2020 14:39:40 +0900
parents f84b0189359c
children db794a6414e4
line wrap: on
line diff
--- a/paper/mk-wm.tex	Sat Aug 01 15:05:36 2020 +0900
+++ b/paper/mk-wm.tex	Mon Aug 03 14:39:40 2020 +0900
@@ -77,42 +77,26 @@
 情報通信技術の普及に伴い学生が学ぶ学習環境が必要となる。その学習環境として VM や コンテナにより, 手軽に開発し試せる技術が普及している。
 だが, 手元の PC 上で VM や コンテナを立ち上げ, 開発を行うことはできるが, VM や コンテナの使用には高性能 PC や 有料のクラウドサービスが必要になる場合がある。
 この大きな負担を学生に負わせない仕組みが必要である。\par
-琉球大学工学部工学科知能情報コースでは, 希望の学生に学科のブレードサーバから仮想環境を貸出すサービスを行なっている。貸出をする VM のデフォルトのスペックでは
-不足場合要望に応じてスペックの変更を行なっている。だが, 貸出サービスでは GPU を利用した処理環境を提供することができない。
+琉球大学工学部工学科知能情報コースでは希望の学生に学科のブレードサーバから仮想環境を貸出すサービスを行なっている。貸出をする VM のデフォルトのスペックでは
+不足の場合, 要望に応じてスペックの変更を行なっている。だが, 貸出サービスでは GPU を利用した処理環境を提供することができない。
 %だが, 貸出サービスでは近年盛んに行われている人工知能の研究に必要な環境を提供することができない。
-GPU が搭載されている PC は研究室によっては用意されているが, 研究室に所属していない学生は利用することができない。そのため, 新たな仕組みが必要である。\par
-学科のブレードサーバに搭載される GPU は VM の貸出サービスでは利用することができないため, コンテナ技術を利用する。
-コンテナ管理ソフトウェアである Docker では NVIDIA Container Toolkit である nvidia-docker を利用することで, 複数のコンテナで GPU を使用することができる。
-Docker では基本的に root 権限で動作する。また一般ユーザが docker コマンドを使用するには docker グループに追加する必要がある。
-そのため Docker をマルチユーザで使用すると, 他ユーザのコンテナへアクセスできるなどセキュリティの問題がある。\par
+GPU が搭載されている PC は研究室によっては用意されているが, 研究室に所属していない学生は利用することができない。そのため, 新たな仕組みが必要である。\par
+学科のブレードサーバに搭載される GPU は VM の貸出サービスでは利用することができない。そこでコンテナ技術を利用する。
+コンテナ管理ソフトウェアである Docker では NVIDIA Container Toolkit である nvidia-docker を利用することで, 複数のコンテナで GPU を共有することができる。
+Docker は基本的に root 権限で動作する。また一般ユーザが docker コマンドを使用するには docker グループに追加する必要がある。
+そのため Docker をマルチユーザ環境で使用すると, 他ユーザのコンテナへアクセスができるなどセキュリティの問題がある。\par
 そこで, 本論文では, Docker と マルチユーザ環境で利用しやすい Linux コンテナである Singularity を利用したコンテナ貸出サービスを提案する。
-このコンテナ貸出サービスでは, Web コンソールからコンテナの操作を行うことで他ユーザのコンテナへの操作をさせない。また, 先行研究の課題でもあったデータの永続化を
-Singularity で, 外部リポジトリの利用を Docker の操作を API で提供することで利用によるで解消する。
+このコンテナ貸出サービスでは, Web コンソールからコンテナの操作を行うことで他ユーザのコンテナへの操作をさせない。また, 本コースの類似サービスの課題でもあったデータの永続化を
+Singularity で, 外部リポジトリの利用を Docker の操作を HTTP API で提供することで解消する。
 
 
-\section{Docker}
-Docker とは Docker, Inc. が開発した Linux コンテナ管理ソフトウェアであり, 2013年にオープンソースのプロジェクトとして公開された。
-Docker ではコンテナを実行するだけでなく, コンテナイメージの作成
-
-\section{Singularity}
-Singularity とは, Berkeley Lab が開発した Linux コンテナであり, オープンソースソフトウェアで提供されている。
-Singularity には他のコンテナランタイムとは異なるセキュリティ機能がある。Singularity はコンテナを作成時にコンテナ内にUID及びGID情報を動的に書き込み, ユーザの権限を引き継ぐ。
-そのため, ユーザが非特権ユーザの場合コンテナ内でも非特権ユーザとして動作する。また, Singularity は他のユーザのコンテナを操作することができないためマルチユーザ環境で安全に使用できる。
-Singularity のコンテナではデフォルトで \$HOME, /tmp, /proc, /sys, /dev がマウントされる。そのため, ユーザがコンテナ内にファイルをコピーする手間を省くことができる。
-
-\section{GitLab}
-GitLab とは, GitLab.Inc. が開発した Gitリポジトリマネージャーであり, オープンソースソフトウェアで提供されている。
-GitLab には無償版の GitLab Community Edition (以下GitLab CE) と 有償版の GitLab Enterprise Edition (以下GitLab EE) がある。
-本コースでは GitLab CE を運用している。本研究では GitLab CE に統合されいている CI/CD 機能を利用する。
-
-\section{関連研究}
-本サービスに関連した研究として, Docker をラップし複数のユーザで利用することを目的とした ie-docker, Kubernetes を利用した教育用コンテナ貸出を目的とした, digdog がある。
-この 2 つの研究について軽く概要を説明する。
+\section{本コースの類似サービス}
+本サービスに類似したサービスとして, Docker をラップし複数のユーザで利用することを目的とした ie-docker \cite{ie-docker}, Kubernetes を利用した教育用コンテナ貸出を目的とした, digdog \cite{digdog} がある。
 \subsection{ie-docker}
 ie-docker とは Docker をラップし複数のユーザで利用することのできるコンテナ管理ツールである。
 利用する学生は ssh でブレードサーバへ接続し, ie-docker を使用してコンテナを操作することができる。
 ie-docker は UID 及び GID 情報を取得し他のユーザのコンテナを操作させない。
-またユーザが使える docker の機能を制限する。表\ref{tb:ie-docker}が ie-docker の機能である。
+またユーザが使える docker の機能を制限する。表\ref{tb:ie-docker}が ie-docker で利用できる機能である。
 
 \begin{table}[htb]
   \begin{center}
@@ -133,8 +117,9 @@
 \subsection{digdog}
 digdog とは Kubernetes を利用したコンテナ貸出サービスである。
 学生は Dockerfile を GitLab CI/CD を利用して GitLab Registry に Docker イメージを登録する。
-コンテナを利用するには学科アカウントを使用して Web サービスへログインし, 登録したイメージでコンテナを作成することができる。
-また学生の Namespace が作成される。RBAC を用いたリソース操作のアクセス制御を行なっており, 学生は Kubernetes コマンドである kubectl コマンドで Pod の操作を行うことができる。 
+学科アカウントを使用して Web サービスへログインし, 登録した Docker イメージでコンテナを作成することができる。
+コンテナ作成時は digdog が Kubernetes に Deployment を設定する。Deployment は学生のアカウント名で作成された Namespace に設定される。
+Namespace は RBAC を用いたリソース操作のアクセス制御が設定されている。そのため学生は Kubernetes コマンドである kubectl コマンドで 手元の PC から Pod の操作を行うことができる。 
 RBAC で許可されているリソース操作は表\ref{tb:digdog}である。
 
 \begin{table}[htb]
@@ -149,19 +134,50 @@
   \end{center}
 \end{table}
 
-\section{WhaleMountain}
-本サービスの構成を図\ref{fig:wm}に示す。本サービスは digdog を参考にして作られた コンテナ貸出を行う Web サービスである。
-学生は学科アカウントを使用して Web サービスへログインし, コンテナの作成や操作を行うことができる。
-また, GitLab CI/CD を使用し学生が作成した Dockerfile を GitLab へ Push することで, 学生が自由に Docker イメージを作成することもできる。
-作成した Docker イメージは他の学生に共有できる。また学生は他の学生が作成したコンテナやイメージを操作することはできない。
-WhaleMountain が提供するサービスは以下である。
-\begin{itemize}
-  \item GitLab CI/CD Token の更新
-  \item Docker Image の削除
-  \item Singularity Image のダウンロード
-  \item Docker コンテナの作成, 操作
-  \item Kubernetes Pods の作成
-\end{itemize}
+
+\section{サービスの設計}
+学生が学習環境を利用する流れを図\ref{fig:wm} に示し, 概要を以下で説明する。
+
+\subsection{利用技術}
+サービスではコンテナ貸出を行う。
+そこで, コンテナ管理ソフトウェアである Docker, コンテナオーケストレーションソフトである Kubernetes, マルチユーザ環境に適した Linux コンテナである Singularity を利用する。\par
+サービスは Docker や Kubernetes のみで提供することもできる。だが, コンテナ内のデータの永続化が問題となる。そのため Singularity を利用する。
+Singularity では デフォルトで \$HOME, /tmp, /proc, /sys, /dev がコンテナにマウントされる。そのため, コンテナのデータの永続化や大量のデータを扱う場合に適している。
+
+\subsection{コンテナの作成}
+学生は学科アカウントで Web コンソールへログインする。Web コンソールでは 学生のコンテナ一覧や Docker イメージ一覧を確認することができる。
+コンテナ作成を選択するとコンテナを作成するために必要な情報を入力する。入力する内容は表\ref{tb:wmcon} である。コンテナ名には学生のアカウント名が補完されるため, 他の学生と被ることはない。
+Docker イメージは Docker Hub に登録されているイメージや, 作成したイメージを入力することができる。環境変数とゲストポートはスペース区切りで複数入力することができる。
+ホストポートは, エフェメラルポート の範囲から設定される。学生は設定されたホストポートを使用してコンテナのサービスへアクセスする。
+また, 学生はコンテナに対して Web コンソールから, または手元の PC から操作することができる。
+必要なくなったコンテナは Web コンソールのコンテナ一覧から削除することができる。
+
+\begin{table}[htb]
+  \begin{center}
+  \caption{コンテナ作成時の入力内容}
+  \begin{tabular}{c|l} \hline
+    ContainerName  & コンテナ名 \\ \hline
+    Image & Docker イメージ \\ \hline
+    Environments & コンテナ作成時の環境変数 \\ \hline
+    GuestPort & コンテナが使用するポート番号 \\ \hline
+    \end{tabular}
+  \label{tb:wmcon}
+  \end{center}
+\end{table}
+
+\subsection{イメージの作成}
+Docker イメージの作成は学科で利用している GitLab の CI/CD 機能を使用する。
+学生は学科 GitLab から CI/CD トークンを取得し, Web コンソールで取得したトークンをセットする。この時 Docker 側に GitLab Runner の立ち上げを依頼する。
+トークンの設定後, Web コンソールから CI/CD 用の Yaml ファイルをダウンロードし Dockerfile と一緒に学科 GitLab のリポジトリに Push する。
+Docker イメージの Build が成功すると Web コンソールのイメージ一覧で確認ができる。作成した Docker イメージは編集からイメージの使い方を記述でき, 他の学生に共有するか設定を行える。
+必要なくなったイメージは Web コンソールのイメージ一覧から削除することができる。
+
+\subsection{Singularity の利用}
+Singularity は Docker イメージをSingularity 用に Build することで, Docker イメージを使用することができる。
+だが, イメージの Build には sudo 権限が必要となる。Docker イメージの Build を申請性にすると, 管理者の仕事が増え, 学生も利用しづらい。
+また, Singularity はユーザ権限で動作するため, 学生が ssh でブレードサーバへ接続し利用する方が適している。
+そこで, Web コンソールから Singularity 用のイメージをダウンロードできる仕様とする。\par
+学生は利用したいイメージをダウンロードし, ブレードサーバへ送信して Singularity を使用することができる。
 
 \begin{figure}[tb]
     \begin{center}
@@ -171,20 +187,46 @@
     \label{fig:wm}
 \end{figure}
 
-\section{WhaleMountain と他ツールとの比較}
-関連研究である ie-docker と digdog との比較を行う。
+\section{サービスの実装}
+本コースでは ブレードサーバが 4 台導入され, 1 台に 1 つ GPU が搭載されている。コンテナ貸出サービスの機能を 1 つにまとめると Docker の操作が 1台のブレードサーバのみになる。
+そこで, 機能ごとに以下の 3 つにサービスに分ける。また, Docker や Kubernetes の操作を HTTP API で提供することで, リクエスト先の変更で複数のブレードサーバにコンテナを分散することができる。\par
+実装にはDocker や Kubernetes の実装言語であり, 操作するためのライブラリが揃っている Go 言語を使用する。
+\begin{itemize}
+  \item Web コンソールの表示
+  \item Docker の操作
+  \item Kubernetes の操作
+\end{itemize}
+
+\subsection{Web コンソールの表示}
+実装には Go 言語の Web フレームワークの 1 つである Gin を使用した。
 
-\subsection{ie-docker と比較}
-ie-docker では学生が自由に Docker イメージを作成することができない。またコンテナで使用できる Docker イメージも制限される。
-WhaleMountain の Docker コンテナでは学生がコンテナの log の確認することができない。また ie-docker の attach と比べ WhaleMountain では, 
-コンテナに接続するのではなく, コンテナでコマンドを実行し出力を表示するため, ファイルの編集などを行うことができない。そのため, WhaleMountain では,
-Docker コンテナだけでなく Kubernetes の Pods を作成することができる。 Kubernetes で作成した Pods に対して 学生は kubectl コマンドで操作ができる。
+\subsection{Docker の操作}
+実装には Web コンソールと同じ Gin を使用し, Docker の操作を行うための SDK である Docker client \cite{dockercli} を使用する。
+Docker は sock に対して curl コマンドで操作できる HTTP API を提供している。sock だと複数のサーバに対応できないため, Go で HTTP API を実装する。\par
+サービスを提供する上で Docker の必要となる操作は以下である。
+\begin{itemize}
+  \item コンテナの作成
+  \item コンテナの削除
+  \item コンテナでコマンド実行
+  \item コンテナへファイル送信
+  \item イメージの削除
+  \item GitLab Runner の作成
+\end{itemize}
 
-\subsection{digdog と比較}
-WhaleMountain は digdog を参考にして作られたため, 基本構成は似ている。だが, digdog はコンテナ作成に学生が作成した Docker イメージのみに制限されている。
-また, GitLab CI/CD の CI で Dockerfile を build する際に利用する GitLab Runner が共有される。そのため複数の学生が同時に Dockerfile を build することができない。
-WhaleMountain では コンテナ作成で Docker イメージに制限をかけないため Docker Hub に登録されている Docker イメージも利用できる。
-また, 学生用のGitLab Runner を Token の設定時に用意するため, 複数の学生が同時に Dockerfile を build することができる。
+コンテナを作成するにあたって必要となるリクエスト情報は以下である。
+\begin{itemize}
+  \item コンテナ名
+  \item コンテナ
+  \item イメージの削除
+  \item GitLab Runner の作成
+\end{itemize}
+
+\subsection{Kubernetes の操作}
+実装には Web コンソールと同じ Gin を使用し, Kubernetes の操作を行うためのライブラリである client-go \cite{kubecli} を使用する。
+
+\section{サービスの評価}
+
+\section{類似サービスとの評価}
 
 %\begin{lstlisting}[frame=lrbt,label=src:example,caption={コード書き方例}]
 %package main
@@ -203,5 +245,4 @@
 \bibliographystyle{ipsjunsrt}
 \bibliography{mk-wm}
 
-
-\end{document}
+\end{document}
\ No newline at end of file