view paper/mk-wm.tex @ 7:790bc05dc78c

update tex, mm
author Ken Miyahira <e175733@ie.u-ryukyu.ac.jp>
date Tue, 04 Aug 2020 15:34:49 +0900
parents db794a6414e4
children aa9a8f31b61d
line wrap: on
line source

%%
%% 研究報告用スイッチ
%% [techrep]
%%
%% 欧文表記無しのスイッチ(etitle,eabstractは任意)
%% [noauthor]
%%

%\documentclass[submit,techrep]{ipsj}
\documentclass[submit,techrep,noauthor]{ipsj}



\usepackage[dvips,dvipdfmx]{graphicx}
\usepackage{latexsym}
\usepackage{listings}
\lstset{
  language=C,
  tabsize=2,
  frame=single,
  basicstyle={\tt\footnotesize}, %
  identifierstyle={\footnotesize}, %
  commentstyle={\footnotesize\itshape}, %
  keywordstyle={\footnotesize\ttfamily}, %
  ndkeywordstyle={\footnotesize\ttfamily}, %
  stringstyle={\footnotesize\ttfamily},
  breaklines=true,
  captionpos=b,
  columns=[l]{fullflexible}, %
  xrightmargin=0zw, %
  xleftmargin=1zw, %
  aboveskip=1zw,
  numberstyle={\scriptsize}, %
  stepnumber=1,
  numbersep=0.5zw, %
  lineskip=-0.5ex,
}
\usepackage{caption}


\def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline}
\def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\}
\def\|{\verb|}
%

%\setcounter{巻数}{59}%vol59=2018
%\setcounter{号数}{10}
%\setcounter{page}{1}
\renewcommand{\lstlistingname}{Code}

\begin{document}


\title{情報工学科演習用のコンテナ技術を用いた新規サービスの設計・実装}

%\etitle{How to Prepare Your Paper for IPSJ SIG Technical Report \\ (version 2018/10/29)}

\affiliate{KIE}{琉球大学大学院理工学研究科情報工学専攻}
\affiliate{IE}{琉球大学工学部工学科知能情報コース}


\author{宮平 賢}{Miyahira Ken}{IE}[mk@cr.ie.u-ryukyu.ac.jp]
\author{河野 真治}{Shinji Kono}{IE}[kono@ie.u-ryukyu.ac.jp]

\begin{abstract}
IT技術を学ぶ時の学習環境の 1つとして, OS 上の隔離された環境を構築する技術であるコンテナがある. これらはローカルに設置された計算機, あるいはクラウド上に作られる. 
作成されるコンテナは学生, あるいは教員側から適切に管理するシステムが必要となる. 
管理システムはマルチユーザで動作するのは当然として, 利用者や管理者に適したUI, sudo権限で動作するコンテナへの対処などが含まれる. 
学生の演習には, Webサービスの実装や人工知能の学習などがある. そのため, 気軽に開発環境やテスト環境などを用意できる利用のしやすさが重要である. 
本稿ではコンテナ管理ソフトウェアである Docker, Singularity を用いた新規 Web サービスの設計・実装を行う. 
\end{abstract}


\maketitle

\section{はじめに}
情報通信技術の普及に伴い学生が学ぶ学習環境が必要となる。その学習環境として VM や コンテナにより, 手軽に開発し試せる技術が普及している。
だが, 手元の PC 上で VM や コンテナを立ち上げ, 開発を行うことはできるが, VM や コンテナの使用には高性能 PC や 有料のクラウドサービスが必要になる場合がある。
この大きな負担を学生に負わせない仕組みが必要である。\par
琉球大学工学部工学科知能情報コースでは希望の学生に学科のブレードサーバから仮想環境を貸出すサービスを行なっている。貸出をする VM のデフォルトのスペックでは
不足の場合, 要望に応じてスペックの変更を行なっている。だが, 貸出サービスでは GPU を利用した処理環境を提供することができない。
%だが, 貸出サービスでは近年盛んに行われている人工知能の研究に必要な環境を提供することができない。
GPU が搭載されている PC は研究室によっては用意されているが, 研究室に所属していない学生は利用することができない。そのため, 新たな仕組みが必要である。\par
学科のブレードサーバに搭載される GPU は VM の貸出サービスでは利用することができない。そこでコンテナ技術を利用する。
コンテナ管理ソフトウェアである Docker では NVIDIA Container Toolkit である nvidia-docker を利用することで, 複数のコンテナで GPU を共有することができる。
Docker は基本的に root 権限で動作する。また一般ユーザが docker コマンドを使用するには docker グループに追加する必要がある。
そのため Docker をマルチユーザ環境で使用すると, 他ユーザのコンテナへアクセスができるなどセキュリティの問題がある。\par
そこで, 本論文では, Docker と マルチユーザ環境で利用しやすい Linux コンテナである Singularity を利用したコンテナ貸出サービスを提案する。
このコンテナ貸出サービスでは, Web コンソールからコンテナの操作を行うことで他ユーザのコンテナへの操作をさせない。また, 本コースの類似サービスの課題でもあったデータの永続化を
Singularity で, 外部リポジトリの利用を Docker の操作を HTTP API で提供することで解消する。


\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 で利用できる機能である。

\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 は 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}


\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 を使用する。Singularity を利用する流れを図\ref{fig:singu} に示す。

\begin{figure}[tb]
    \begin{center}
        \includegraphics[width=80mm]{Images/whalemountain.pdf}
    \end{center}
    \caption{システム構成}
    \label{fig:wm}
\end{figure}

\begin{figure}[tb]
    \begin{center}
        \includegraphics[width=80mm]{Images/singularity.pdf}
    \end{center}
    \caption{Singularityの利用}
    \label{fig:singu}
\end{figure}

\section{サービスの実装}
本コースでは学科システムを教員の指導の下, 学生主体でシステム管理チームと呼ばれる組織によって構築・運用・管理が行われている。
学科システムはブレードサーバを 4 台, SAN 用ストレージと汎用ストレージをそれぞれ 2台ずつ導入している。本コースの基幹サービスはこのブレードサーバの仮想環境上で VM として動作している。
新たにサービスを実装するとなると, システム管理チームが運用・管理を行いやすい実装にする必要がある。\par
Web コンソールや Docker の操作を 1 つにまとめると, Docker コンテナの作成が 1台のブレードサーバのみになってしまう。
そこで, コンテナ貸出システムは, 機能ごとに以下の 3 つにサービスに分ける。
Docker や Kubernetes の操作を HTTP API で提供することで, 図\ref{fig:api} のようにリクエスト先の変更で複数のブレードサーバにコンテナを分散することができる。
だが, 現時点では未実装である。\par
実装にはDocker や Kubernetes の実装言語であり, 操作するためのライブラリが揃っている Go 言語を使用する。
\begin{itemize}
  \item Web コンソール
  \item Docker の操作
  \item Kubernetes の操作
\end{itemize}

\begin{figure}[tb]
    \begin{center}
        \includegraphics[width=80mm]{Images/apihukusu.pdf}
    \end{center}
    \caption{機能の分散}
    \label{fig:api}
\end{figure}

\subsection{Web コンソール}
Web コンソールは本コースの学生や教員が利用するため, 学科のアカウントでログインできる LDAP 認証が必須である。
また, GUI で操作するため, 新しく GUI の操作に慣れる必要があることから, ユーザが操作しやすい必要がある。\par
Docker の操作や Kubernetes の操作を行う HTTP API はセッション管理を行わないため, Web コンソールで管理する必要がある。
そのため, ユーザのコンテナやイメージの情報をデータベースに格納して管理する。
ユーザのアカウントID と コンテナに紐づけられたアカウントID が等しい場合のみ操作を行うことができる。そのため, 他のユーザのコンテナやイメージを操作できない。
また, ユーザが作成する Docker イメージは他のユーザに共有や非共有ができる。共有されたイメージは共有イメージの一覧に表示され, 他のユーザがコンテナ作成時に利用することができる。
コンテナ作成時にイメージの確認が行われることで, 非共有に設定したイメージを他のユーザが利用することはできない。

\subsection{Docker の操作}
Docker は Docker Engine API を提供している。Docker デーモンは指定した IP アドレスと ポート を リッスンする。 IP アドレスと ポートの指定を行うことで外部から Docker の操作が可能になる。
だが, Dockr デーモンが稼働しているホスト上の root アクセスを得られるため, 推奨されてない。
また, 本論文で実装するサービスでは Docker のすべての操作を必要としない。そこで, Docker の操作を行うための SDK \cite{sdk} を使用し, 必要な機能のみを実装する。\par
サービスを提供する上で Docker の必要となる操作は以下である。
\begin{itemize}
  \item コンテナの作成
  \item コンテナの削除
  \item コンテナでのコマンド実行
  \item コンテナへファイル送信
  \item イメージ一覧の取得
  \item イメージの削除
\end{itemize}


\subsection{Kubernetes の操作}
実装には Kubernetes の操作を行うためのライブラリである client-go \cite{kubecli} を使用する。


\section{サービスの評価}

\section{類似サービスとの評価}

%\begin{lstlisting}[frame=lrbt,label=src:example,caption={コード書き方例}]
%package main
%import "fmt"

%func main() {
%    fmt.Println("Hello, World!!")
%}
%\end{lstlisting}

\section{今後の課題}

\section{まとめ}

\nocite{*}
\bibliographystyle{ipsjunsrt}
\bibliography{mk-wm}

\end{document}