1
|
1 \documentclass[9.5pt]{jarticle}
|
|
2 \usepackage[dvips,dvipdfmx]{graphicx}
|
|
3 \usepackage{multicol}
|
0
|
4 \usepackage{picins}
|
|
5 \usepackage{fancyhdr}
|
2
|
6 \usepackage{here}
|
0
|
7 \lhead{\parpic{\includegraphics[height=1zw,keepaspectratio,bb=0 0 251 246]{pic/emblem-bitmap.pdf}}琉球大学主催 工学部工学科知能情報コース 中間発表予稿}
|
1
|
8 \usepackage[top=2cm, bottom=2cm, left=1cm, right=1cm]{geometry}
|
0
|
9
|
|
10 \begin{document}
|
1
|
11
|
4
|
12 \title{情報工学科演習用のコンテナ技術を用いたサービスの設計・実装 \\
|
2
|
13 Design and Implementation of service using container technology for Information science exercise}
|
5
|
14 \author{175733E 氏名 {宮平 賢} 指導教員 : {河野 真治} }
|
6
|
15 \date{令和2年9月14日}
|
1
|
16
|
0
|
17 \maketitle
|
4
|
18 %\begin{abstract}
|
|
19 %情報技術の普及に伴い情報系の学生が課題や演習を行う学習環境が必要である。
|
5
|
20 %学習環境を複数の学生に提供する方法として,VM や コンテナがある。
|
4
|
21 %琉球大学工学部では VM 貸出サービスがある。
|
|
22 %課題や演習によっては CPU より GPU が必要となる場合がある。
|
5
|
23 %しかし,本コースの VM 貸出サービスは GPU の共有に対応していない。
|
|
24 %そこで,コンテナ仮想化技術を利用できる Docker と Kubernetes,Singularity を用いて,GPU を含む学習環境を提供する。
|
4
|
25 %本稿では学習環境を提供するサービスの設計・実装を行う。
|
|
26 %\end{abstract}
|
2
|
27
|
|
28
|
|
29 \renewcommand{\abstractname}{Abstract}
|
|
30 \begin{abstract}
|
|
31 With the spread of information technology, there is a need for a learning environment in which information students can do assignments and exercises.
|
3
|
32 There are VMs and containers as a way to provide a learning environment for students.
|
|
33 The University of the Ryukyus has a VM rental service. Some assignments and exercises require GPUs rather than CPUs.
|
2
|
34 However, the VM rental service in this course does not support GPU sharing.
|
5
|
35 Therefore, we provide a learning environment that includes GPUs by using Docker, Kubernetes, and Singularity, which can utilize container virtualization technologies.
|
2
|
36 In this paper, we design and implement a service that provides a learning environment.
|
1
|
37 \end{abstract}
|
|
38
|
4
|
39 \thispagestyle{fancy}
|
1
|
40
|
|
41 \begin{multicols*}{2}
|
2
|
42 \section{コンテナ技術を用いた学習環境の提供}
|
5
|
43 情報通信技術の普及に伴い学生が学ぶ学習環境が必要となる。その学習環境として VM や コンテナにより,手軽に開発し試せる技術が普及している。
|
|
44 だが,手元の PC 上で VM や コンテナを立ち上げ,開発を行うことはできるが,VM や コンテナの使用には高性能 PC や 有料のクラウドサービスが必要になる場合がある。
|
1
|
45 この大きな負担を学生に負わせない仕組みが必要である。
|
7
|
46
|
1
|
47 本コースでは希望する学生に学科のブレードサーバから仮想環境を貸出すサービスを行なっている。
|
5
|
48 貸出 VM スペックは CPU 1コア,メモリ 1GB,ストレージ 10GB である。
|
|
49 このスペックで不足する場合,要望に応じてスペックの変更を行なっている。
|
|
50 だが,貸出 VM でも課題によっては処理に時間がかかることがある。
|
|
51 例として,人工知能の講義において課される課題においては CPU より GPU が必要となる場合がある。
|
|
52 しかし,現在の VM 貸出サービスでは GPU の共有に対応していない。
|
|
53 VM 上で GPU を共有するには PCI パススルーを利用することで可能だが,PCI パススルーでは複数の VM に共有することができない。
|
|
54 そこで,GPU を含めた学習環境をコンテナ技術を用いて提供するサービスの設計・実装を行う。
|
4
|
55
|
|
56 \vspace{-2zh}
|
1
|
57
|
|
58 \section{技術概要}
|
5
|
59 本研究で使用したコンテナ仮想化技術,また本コースで利用しているサービスについての概要を説明する。
|
1
|
60
|
|
61 \subsection{Docker}
|
7
|
62 Docker\cite{docker} とは OS レベルの仮想化技術を利用して,ソフトウェアをコンテナと呼ばれるパッケージで提供する。またコンテナの実行だけでなく,
|
5
|
63 コンテナの実行に用いるイメージの作成,イメージを共有する仕組みを持つコンテナ管理ソフトウェアである。
|
|
64 コンテナの実行には Docker 社が提供している Docker Hub\cite{dockerhub} に登録されているイメージ,Dockerfile を用いて作成したイメージを利用することができる。
|
|
65 Dockerfile を用いることで,必要なソフトウェアや各種設定を含んだイメージを作成できる。
|
1
|
66
|
|
67 \subsection{Kubernetes}
|
5
|
68 Kubernetes\cite{k8s} とは,アプリケーションのデプロイ,スケーリング,及び管理を用意にするためのコンテナを動的管理するコンテナオーケストレーションである。
|
|
69 Kubernetes ではオブジェクトによりクラスターの状態を表現する。オブジェクトはコンテナだけでなく,ネットワークやストレージ,接続ポリシーの望ましい状態を記述できる。
|
1
|
70
|
|
71 \subsection{Singularity}
|
7
|
72 Singularity\cite{singu} とは,HPC クラスタ上で複雑なアプリケーションを実行するために開発されたコンテナプラットフォームである。
|
5
|
73 Singularity は マルチユーザに対応しており,コンテナ内での権限は実行ユーザの権限を引き継ぐため,ユーザに特別な権限の設定が必要ない。
|
|
74 またデフォルトで,\$HOME,/tmp,/proc,/sys,/dev がコンテナにマウントされ,サーバ上の GPU を簡単に利用できる。
|
|
75 Singularity のコンテナイメージは Docker Hub に登録されているイメージ,またはDockerfile から作成したイメージを変換することで利用することができる。
|
1
|
76
|
|
77 \subsection{GitLab}
|
|
78 GitLab\cite{gitlab} とは バージョン管理システムである Git のリポジトリマネージャである。
|
5
|
79 GitLab は GitHub と違い,オンプレミス環境に構築することができるため,本コースでは GitLab を使用している。
|
7
|
80 本研究では GitLab の統合機能の GitLab CI/CD\cite{gitlabcicd},また GitLab CI/CD と組み合わせて使用する GitLab Runner\cite{gitlabrunner} を利用する。
|
|
81
|
1
|
82 GitLab CI/CD は 継続的インテグレーション(CI)・継続的デリバリー(CD)を GitLab から利用することができる。
|
5
|
83 CI では GitLab のコードを定期的または自動的にビルド・テストを行う。CD は CI を拡張した機能であり,ビルドやテストだけでなくリリースの準備も行う。
|
7
|
84
|
5
|
85 GitLab Runner とは,ビルドのためのアプリケーションであり,GitLab CI と連携することで別の場所でビルドを動かすことができる。
|
1
|
86
|
|
87 \subsection{digdog}
|
2
|
88 digdog\cite{digdog} とは Kubernetes を利用し Web コンソールからコンテナを作成することができるコンテナ貸出サービスである。
|
5
|
89 学生は学科アカウントを使用して Web サービスへログインし,登録されている Docker イメージでコンテナを作成することができる。
|
1
|
90
|
|
91 \section{サービスの設計}
|
5
|
92 サービスは本コースの学生や教員が利用する。そのため,ユーザが他のユーザのコンテナの削除などの操作を行えないように制限をするなどの,マルチユーザ環境へ対応する必要がある。
|
|
93 また,管理者にコンテナで利用するイメージを用意してもらうのではなく,利用したい学習環境をユーザが構築できる仕組みが必要である。
|
|
94 GPU を含む学習環境を提供するために,複数のコンテナへ GPU を共有できる仕組み,またコンテナへのファイルの共有ができる仕組みが必要となる。
|
2
|
95
|
|
96 \subsection{マルチユーザへの対応}
|
|
97 Docker は基本的に root 権限で動作する。また一般ユーザが docker コマンドを使用するには docker グループに追加する必要がある。
|
5
|
98 そのため docker グループに追加されたユーザは,他ユーザのコンテナを操作できるなどセキュリティ上の問題がある。
|
7
|
99
|
5
|
100 そこで,Web コンソールを用いて管理を行う。 Web コンソールには学科のアカウントを用いてログインし,コンテナの作成や操作を可能とする。
|
1
|
101 コンテナ作成は Docker コンテナと Kubernetes コンテナの 2つから選択することができる。
|
|
102 コンテナ作成を選択するとコンテナを作成するために必要な情報を入力する。入力する内容は表\ref{tb:wmcon} である。
|
5
|
103 作成時にコンテナ名をユーザのアカウント名で補完されるため,他のユーザと被ることはない。
|
1
|
104
|
2
|
105 \begin{table}[H]
|
1
|
106 \begin{center}
|
|
107 \caption{コンテナ作成時の入力内容}
|
7
|
108 \begin{tabular}{|c|l|} \hline
|
1
|
109 ContainerName & コンテナ名 \\ \hline
|
|
110 Image & Docker イメージ \\ \hline
|
|
111 Environments & コンテナ作成時の環境変数 \\ \hline
|
|
112 GuestPort & コンテナが使用するポート番号 \\ \hline
|
|
113 GPU & GPU を使用するか \\ \hline
|
|
114 \end{tabular}
|
|
115 \label{tb:wmcon}
|
|
116 \end{center}
|
|
117 \end{table}
|
|
118
|
|
119 \subsection{イメージの作成}
|
2
|
120 Docker イメージの作成は学科で使用している GitLab の CI/CD の CI 機能を利用する。ユーザがイメージを作成する流れを図\ref{fig:gitlab} に示す。
|
5
|
121 ユーザは学科 GitLab から CI トークンを取得し,Web コンソールに取得したトークンをセットする。この時 Docker 側に GitLab Runner の立ち上げを依頼する。
|
|
122 トークンの設定後,Web コンソールから CI 用の YAML ファイルをダウンロードし Dockerfile と一緒に学科 GitLab のリポジトリにプッシュする。
|
2
|
123 GitLab にプッシュした Dockerfile が GitLab Runner 上でビルドされる。
|
5
|
124 ビルドの成否は GitLab から確認することができ,作成されたイメージは Web コンソールから確認することができる。
|
|
125 GitLab の CI/CD 機能を利用することで,学生に権限を与えることなくイメージの作成を行うことが可能となる。
|
1
|
126
|
2
|
127 \begin{figure}[H]
|
|
128 \begin{center}
|
|
129 \includegraphics[width=95mm]{Images/gitlab.pdf}
|
|
130 \end{center}
|
|
131 \caption{イメージの作成}
|
|
132 \label{fig:gitlab}
|
|
133 \end{figure}
|
|
134
|
|
135 \subsection{GPU の利用}
|
4
|
136 GPU を使った学習を行うには NVIDIA Container Toolkit である nvidia-docker\cite{nvidia-docker} を利用する。
|
5
|
137 nvidia-docker を導入することで,GPU を利用するための環境が整っている nvidia/cuda イメージを利用することが可能となる。
|
4
|
138 GPU を使った学習環境を利用するには nvidia/cuda でイメージを作成する。
|
2
|
139 作成したイメージをコンテナ作成時の表\ref{tb:wmcon} の Docker イメージに入力する。
|
5
|
140 また GPU を利用するかのチェックを入れることで,コンテナへ GPU を共有することが可能となる。
|
2
|
141
|
|
142 \subsection{ファイルの共有}
|
5
|
143 コンテナに大量のデータを送信する必要がある場合や,データを永続化させたい場合に Singularity を利用する。
|
|
144 Singularity はユーザ権限で動作することから,学生が ssh でブレードサーバへ接続し利用する方が適している。
|
2
|
145 Singularity は Docker イメージを変換し使用できる。
|
5
|
146 だが,イメージの変換には sudo 権限が必要となる。
|
7
|
147 そこで,Web コンソールから Singularity 用のイメージをダウンロードできる仕様とする。
|
|
148
|
5
|
149 ユーザは利用したいイメージをダウンロードし,ブレードサーバへ送信して Singularity を使用する。Singularity を利用する流れを図\ref{fig:singu} に示す。
|
1
|
150
|
2
|
151 \begin{figure}[H]
|
|
152 \begin{center}
|
|
153 \includegraphics[width=80mm]{Images/singularity.pdf}
|
|
154 \end{center}
|
|
155 \caption{Singularityの利用}
|
|
156 \label{fig:singu}
|
|
157 \end{figure}
|
|
158
|
|
159 \section{サービスの実装}
|
|
160
|
|
161 サービスのシステム構成を図\ref{fig:wm} に示す。
|
5
|
162 Web コンソールで Docker や Kubernetes の操作をまとめるのではなく,機能ごとに以下の 3 つにサービスを分ける。
|
2
|
163 Web コンソールから HTTP API で各機能へリクエストを送信し操作を行う。
|
7
|
164
|
5
|
165 実装にはDocker や Kubernetes の実装言語であり,操作するためのライブラリが揃っている Go 言語を使用する。
|
2
|
166 \begin{itemize}
|
|
167 \setlength{\parskip}{0cm} % 段落間
|
|
168 \setlength{\itemsep}{0cm} % 項目間
|
|
169 \item Web コンソール
|
|
170 \item Docker の操作
|
|
171 \item Kubernetes の操作
|
|
172 \end{itemize}
|
|
173
|
1
|
174 \begin{figure*}[tb]
|
|
175 \begin{center}
|
|
176 \includegraphics[width=100mm]{Images/whalemountain.pdf}
|
|
177 \end{center}
|
|
178 \caption{システム構成}
|
|
179 \label{fig:wm}
|
|
180 \end{figure*}
|
|
181
|
|
182 \subsection{Web コンソール}
|
7
|
183 Web コンソールは本コースの学生や教員が利用するため,学科アカウントでログインできる必要がある。学科の LDAP サーバを利用して学科アカウントで LDAP 認証を実装する。
|
|
184
|
5
|
185 Docker の操作や Kubernetes の操作を行う機能では,ユーザの管理を行わないため Web コンソールで管理する必要がある。
|
|
186 そのため,ユーザのコンテナやイメージの情報をデータベースに格納して管理する。
|
|
187 ユーザがコンテナやイメージの操作を行う時は,紐づけられたアカウントID の確認を行うことで,他のユーザのコンテナやイメージの操作を制限する。
|
1
|
188
|
|
189 \subsection{Docker の操作}
|
|
190 Docker は Docker Engine API を提供している。Docker デーモンは指定した IP アドレスと ポート を リッスンする。 IP アドレスと ポートの指定を行うことで外部から Docker の操作が可能になる。
|
5
|
191 だが,Dockr デーモンが稼働しているホスト上の root アクセスを得られるため,推奨されてない。
|
7
|
192 また,本研究で実装するサービスでは Docker のすべての操作を必要としない。そこで,Docker の操作を行うための SDK \cite{sdk} を使用し,必要な機能のみを実装する。
|
|
193
|
1
|
194 サービスを提供する上で Docker の必要となる操作は以下である。
|
|
195 \begin{itemize}
|
2
|
196 \setlength{\parskip}{0cm} % 段落間
|
|
197 \setlength{\itemsep}{0cm} % 項目間
|
1
|
198 \item コンテナの作成
|
|
199 \item コンテナの削除
|
|
200 \item コンテナでのコマンド実行
|
|
201 \item コンテナへファイル送信
|
|
202 \item イメージ一覧の取得
|
|
203 \item イメージの削除
|
|
204 \end{itemize}
|
0
|
205
|
2
|
206 Web コンソールから JSON 形式でリクエストを受信する。このリクエストを元に上記の操作を行う。
|
5
|
207 だが,ファイルの送信では JSON 形式ではなく,multipart/form-data 形式でリクエストを受ける。
|
1
|
208
|
|
209 \subsection{Kubernetes の操作}
|
5
|
210 Docker と同様に Kubernetes のすべての操作を必要としないため,Kubernetes と対話するためのライブラリである client-go \cite{kubecli} を使用し,必要な機能のみを実装する。
|
1
|
211 サービスを提供する上で Kubernetes の必要となる操作は以下である。
|
|
212
|
|
213 \begin{itemize}
|
2
|
214 \setlength{\parskip}{0cm} % 段落間
|
|
215 \setlength{\itemsep}{0cm} % 項目間
|
1
|
216 \item コンテナの作成
|
|
217 \item コンテナの削除
|
|
218 \item 認証トークンの取得
|
|
219 \end{itemize}
|
|
220
|
5
|
221 Docker と同様に Web コンソールから JSON 形式でリクエストを受信し,リクエストを元に上記の操作を行う。
|
|
222 Kubernetes ではコンテナへのコマンドの実行やファイルの送信は実装せず,認証のトークンを取得する機能を実装する。
|
|
223 Kubernetes では,Kubernetes API の利用権限 Namespace ごとに定義する Role,ユーザやグループに Role を関連付ける RoleBinding がある。
|
2
|
224 この Role と RoleBinding を用いた Role-based access control (RBAC) を利用することで手元の PC からコンテナに対して操作を行うことが可能となる。
|
5
|
225 そのため,RBAC への認証トークンを取得する。RBAC で許可するリソースの操作は表\ref{tb:wm} である。
|
2
|
226
|
|
227 \begin{table}[H]
|
1
|
228 \begin{center}
|
|
229 \caption{kubectl のコマンド}
|
7
|
230 \begin{tabular}{|c|l|} \hline
|
|
231 get & Pod, Deployment, Service, Ingress の一覧を表示する \\ \hline
|
1
|
232 log & Pod の Log を表示する \\ \hline
|
|
233 exec & Pod にアクセスする \\ \hline
|
|
234 cp & Pod にファイルを送信する \\ \hline
|
|
235 \end{tabular}
|
|
236 \label{tb:wm}
|
|
237 \end{center}
|
|
238 \end{table}
|
0
|
239
|
1
|
240 \section{今後の課題}
|
7
|
241 本研究で実装したサービスでは学生が学習環境として利用するには,まだ必要な実装が不足している。
|
|
242
|
5
|
243 本サービスでは,大量のデータを用いる時に Singularity を使用できる環境を用意している。
|
|
244 だが,Web コンソールから作成した Docker や Kubernetes のコンテナではデータの永続化に対応していないため,コンテナの削除で削除されてしまう。
|
|
245 そこで,学科のサーバでは学生ごとのディレクトリにマウントするなどの対策を行う必要がある。
|
7
|
246
|
5
|
247 本サービスでは,学生が自由に Docker イメージを作成できる。また,Docker イメージを Singularity 用のイメージに変換する。
|
|
248 そのため,イメージの容量でブレードサーバのストレージを圧迫してしまう可能性があることから,あまり利用されていないイメージは定期的に削除する必要がある。
|
7
|
249
|
2
|
250 次にネットワークの設定である。
|
5
|
251 作成したコンテナへのアクセスには,コンテナが動作しているサーバの IP アドレス,設定されたポート番号を使用する。
|
|
252 そのため,外部からアクセスなどに対応することができない。そこで,コンテナごとに IP アドレスを設定するなどの対策が必要である。
|
7
|
253
|
5
|
254 また,本サービスではユーザごとにリソースの制限を行っていないため,過剰なリソースの占有を防ぐための対策をする必要がある。
|
2
|
255 GPU などの負荷がかかるプログラムの実行で使用されるリソースにはジョブ管理ソフトウェアなどで対策をとる。\
|
1
|
256
|
|
257 \begin{thebibliography}{99}
|
|
258
|
5
|
259 \bibitem{docker} Docker, https://www.docker.com/. 2020/9/11.
|
1
|
260 \bibitem{dockerhub} Docker Hub, https://hub.docker.com/, 2020/9/11.
|
|
261 \bibitem{k8s} Kubernetes, https://kubernetes.io/, 2020/9/11.
|
7
|
262 \bibitem{singu} Singularity. https://sylabs.io/singularity/, 2020/9/11.
|
|
263 \bibitem{gitlab} GitLab, https://about.gitlab.com/, 2020/9/11.
|
|
264 \bibitem{gitlabcicd} GitLab CI/CD, https://docs.gitlab.com/ce/ci/, 2020/9/11.
|
|
265 \bibitem{gitlabrunner} GitLab Runner Docs, https://docs.gitlab.com/runner/, 2020/9/11.
|
|
266 \bibitem{digdog} 秋田 海人 and 高瀬 大空 and 上地 悠斗 and 長田 智和 and 谷口 祐治, 情報系学科における教育研究情報システムの運用管理並びに新規システムの構築に関する取り組み, インターネットと運用技術シンポジウム(2019).
|
|
267 \bibitem{nvidia-docker} NVIDIA Container Toolkit, https://github.com/NVIDIA/nvidia-docker, 2020/9/11.
|
1
|
268 \bibitem{sdk} Docker Engine API, https://docs.docker.com/engine/api/, 2020/9/11.
|
|
269 \bibitem{kubecli} Go clients for talking to a kubernetes cluster, https://github.com/kubernetes/client-go, 2020/9/11.
|
7
|
270
|
|
271 %\bibitem{kvm} KVM, https://www.linux-kvm.org/, 2020/9/11.
|
2
|
272 %\bibitem{ie-virsh} 平良 太貴 and 河野 真治, OS 授業向けマルチユーザ VM 環境の構築, 研究報告システムソフトウェアとオペレーティング・システム(OS)(2014).
|
0
|
273
|
|
274 \end{thebibliography}
|
1
|
275 \end{multicols*}
|
|
276
|
0
|
277 \end{document}
|