Mercurial > hg > Papers > 2021 > mk-thesis
view paper/chapter/technology_overview.tex @ 55:a822207b796f
update paper
author | Ken Miyahira <e175733@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 14 Feb 2021 16:29:06 +0900 |
parents | d0b469710cb2 |
children | c4264143b8c5 |
line wrap: on
line source
\chapter{技術概要} 本章では,本研究で使われる技術,本コースで利用しているサービスについて概要を説明する. \section{仮想化} 仮想化はコンピュータのCPUやメモリ,ディスクなどハードウェアのリソースを分割又は統合して, 仮想的なコンピュータやネットワーク環境を生成し提供する技術である. 仮想化技術にはホストのどの部分から仮想化するかによってホスト型,ハイパーバイザー型,コンテナ型に分けることができる. \subsection{ホスト型} ホスト型の仮想化は,ホストとなるOS上(以下,ホストOS)に仮想化ソフトウェアをインストールし,仮想化ソフトウェア上で別のOS(以下,ゲストOS)を稼働させる手法である(図\ref{fig:host}). 仮想化ソフトウェアをホストOSのアプリケーションの1つとして導入及び管理できるため,手軽に仮想化を実現することができる. しかし,ゲストOSの処理はホストOSを経由しなければならないため,オーバーヘッドが大きくなる. \begin{figure}[H] \begin{center} \includegraphics[width=120mm]{fig/host.pdf} \end{center} \caption{ホスト型} \label{fig:host} \end{figure} \subsection{ハイパーバイザー型} ハイパーバイザー型の仮想化は,仮想化システムを直接ハードウェアにインストールし,ハイパーバイザー上で複数のゲストOSを稼働させる手法である(図\ref{fig:hyper}). ハイパーバイザーが直接ハードウェアを管理するため,仮想化によるオーバーヘッドを小さくすることで,リソースを効率的に利用することができる. \begin{figure}[H] \begin{center} \includegraphics[width=120mm]{fig/hyper.pdf} \end{center} \caption{ハイパーバイザー型} \label{fig:hyper} \end{figure} \subsection{コンテナ型} コンテナ型の仮想化は,OSレベルの仮想化技術を利用して複数のコンテナと呼ばれる独立空間を形成し,独立空間でアプリケーションをそれぞれ構築することができる手法である(図\ref{fig:container}). 各コンテナはKernelによって独立したプロセスとして実行される. 前述のホスト型やハイパーバイザー型と比べ,コンテナはゲストOSを起動することなくアプリケーションを実行することができるため,リソース効率が良く処理が軽量である. \begin{figure}[H] \begin{center} \includegraphics[width=120mm]{fig/container.pdf} \end{center} \caption{コンテナ型} \label{fig:container} \end{figure} \section{KVM} KVM(Kernel-based Virtual Machine)\cite{kvm}はLinux Kernel2.6.20以降に標準搭載されているハイパーバイザーである. KVMはIntel VT及びAMD-Vを含むx86ハードウェア上の完全仮想化をサポートしている. KVMはハイパーバイザーと各仮想マシン間のレイヤーとしてVirtio APIを使用する. Virtio APIにより,仮想マシンに準仮想化デバイスを提供する. これにより,仮想化によるオーバーヘッドを少なくできる. \section{Docker} Docker\cite{docker}はDocker社が開発,提供するLinux上で動作する隔離されたLinuxコンテナをデプロイ,実行するアプリケーションである. Dockerはコンテナを実行するだけでなく,コンテナイメージの作成や共有する仕組みも提供している. Dockerコマンドを処理するにはDocker daemonと呼ばれるデーモンプロセスを実行する必要がある. このDocker deamonはDockerで行う処理を一箇所で実施する(図\ref{fig:docker}). \begin{figure}[H] \begin{center} \includegraphics[width=150mm]{fig/docker.pdf} \end{center} \caption{Docker} \label{fig:docker} \end{figure} \subsection{Docker Registry} Docker RegistryはDcokerイメージを保存,配布できるサーバサイドアプリケーションである\cite{registry}. 以下の場合に利用される. \begin{itemize} \item イメージの保存場所を厳密に管理する \item イメージを配布するパイプラインを全て所有する \item イメージの保存と配布を社内や学内の開発ワークフローに密に統合する \end{itemize} \section{Podman} PodmanはRedHat社が開発,提供するLinux上でOCIコンテナを開発,管理,実行するためのデーモンレスコンテナエンジンである\cite{podman}. PodmanはOCI準拠のコンテナランタイムに依存するため,前述したDockerなど他のコンテナエンジンと互換性を持つ. また,Podman CLIはDocker CLIと同じ機能を提供する. Podmanはコンテナとイメージストレージ,コンテナランタイムを介してLinxuカーネルと直接対話することで,デーモンレスで実行される(図\ref{fig:podman}). Podmanの制御下にあるコンテナは,特権ユーザ又は非特権ユーザのいずれかによって実行することができる. \begin{figure}[H] \begin{center} \includegraphics[width=120mm]{fig/podman.pdf} \end{center} \caption{Podman} \label{fig:podman} \end{figure} \section{Singularity} Singularity\cite{singularity} とは,HPC環境向けに設計されたコンテナプラットフォームである. Singularityはマルチユーザに対応しており,コンテナ内での権限は実行ユーザの権限を引き継ぐため,ユーザに特別な権限の設定が必要ない. またデフォルトで,\$HOME,/tmp,/proc,/sys,/dev がコンテナにマウントされ,サーバ上のGPUを簡単に利用できる. コンテナイメージはSingularity Image Format(以下,sif)と呼ばれる単一ファイルベースのため,アーカイブや共有が容易である. \section{Ceph} Cephは,RedHat社が開発,提供する分散ファイルシステムである. Cephは分散オブジェクトストレージであるRADOS(Reliable Autonomic Distributred Object Storage)がベースとなっている(図\ref{fig:ceph}). オブジェクトストレージはデータをオブジェクトという単位でやり取りをするストレージシステムである. 複数のストレージを束ねて利用できるオブジェクトストレージが分散オブジェクトストレージと呼ばれる. RAODSでは,Object Storage Daemonにデータ格納する. オブジェクトの配置には,クラスタマップを元にControlled Replication Under Scalable Hashing(以下,CRUSH)アルゴリズムによりオブジェクトの格納先を選択する. 配置の計算に必要とする情報はごくわずかであるため,Cephクラスタ内のすべてのノードは保存されている位置を計算できる. そのため,データの読み書きが効率化される.また,CRUSHはデータをクラスタ内のすべてのノードに均等に分散しようとする. \par RODOSはクラスタに保存されるデータの管理を待ち受け,保存オブジェクトへのアクセス方法としてObject Gateway,RADOS Block Device(以下,RBD),CephFS がある. Object GatewayはHTTP REST経由でクラスタに保存されるオブジェクトへ直接アクセスが可能である. RBD はブロックデバイスとしてアクセスが可能で,libvirt を組み合わせてVMのディスクとして使用できる. また,RBDドライバを搭載したOSにマップし ext4 や XFS などでフォーマットして利用できる. CephFS は POSIX互換のファイルシステムである. \begin{figure}[H] \begin{center} \includegraphics[width=120mm]{fig/ceph.pdf} \end{center} \caption{Cephのアーキテクチャ} \label{fig:ceph} \end{figure} \par Cephクラスタのノードとはクラスタを構成するサーバであり,ノードは以下の4つのデーモンが実行できる. \begin{itemize} \item Ceph Monitor \item Ceph OSD \item Ceph Manager \item Ceph Metadata Server \end{itemize} \subsection{Ceph Monitor} Ceph Monitor(以下,MON)ノードはクラスタのヘルス状態に関する情報,データ分散ルールを維持する. 障害が発生した場合,クラスタ内のMONノードでPaxosという合意アルゴリズムを使用して,どの情報が正しいかを多数決で決定する. そのため,奇数個のMONノードを設定する必要がある. \subsection{Ceph OSD} Ceph OSD(以下,OSD)は物理ストレージになる.このデーモンは1台のHDDなどの物理ストレージに対して,1つのデーモンが動作する. OSDはMONと通信し,OSDデーモンの状態を提供する. \subsection{Ceph Manager} Ceph Manager(以下,MGR)ノードはクラスタ全体から状態情報を収集する. MGRはMONと共に動作し,外部のモニタリングシステムや管理システムのインターフェースとして機能する. \subsection{Ceph Metadata Server} Ceph Metadata Server(以下,MDS)ノードはCephFSのメタデータを保存する. \section{Ansible} Ansible\cite{ansible}はRedHat社が開発,提供するシステム構成,ソフトウェアの展開などを行う自動化ツールである. あらかじめ用意した設定ファイルに従ってソフトウェアのインストールや設定を自動的に実行できるため,コンピュータクラスタを構築する際に時間の短縮やミスの削減に有用である. Ansibleの特徴としてエージェントレスがある.構成管理を行う機器がPythonの使用が可能,SSHで疎通することが可能であれば対象とすることができる. Ansibleの一連の処理はPlaybookという単位にまとめられ,YAML形式で記述される.YAML形式で記述されていることで,可読性が高く学習が容易である. また,インフラストラクチャをコードとして残すことができる. \section{Slurm} Slurm\cite{slurm}はLinuxクラスタ向けのフォールトトレラント設計のジョブスケジューリングシステムである. ジョブスケジューラではサーバ上で実行される処理を「Job」という単位で管理する. ユーザはプログラムの実行手順,実行に必要とするリソースを記したbatchファイルを作成し,ジョブスケジューラにJobの実行を依頼する. ジョブスケジューラは要求するリソース,実行時間を考慮し,複数の計算ノードからJobを実行するノードを決定する. このようにサーバ上でのプログラム等の実行,サーバのリソースを管理するのがジョブスケジューラである(図\ref{fig:jobs})。 \begin{figure}[H] \begin{center} \includegraphics[width=150mm]{fig/jobscheduler.pdf} \end{center} \caption{ジョブスケジューラ} \label{fig:jobs} \end{figure} Slurmには以下の3つの主要機能を提供する. \begin{itemize} \item 計算を実行するユーザに対してリソースへの排他的,非排他的なアクセスを割り当てる \item 割り当てられたノード上のジョブの開始,実行,モニタリングを行う \item 待機中のジョブキューを管理することにより,リソースの競合を解決する \end{itemize} \par Slurmでは主にslurmctldとslurmdで構成される(図\ref{fig:slurm}). また,slurmdbdを有効にすることで,データベースへアカウンティング情報を記録することができる. アカウンティング情報を記録することで,ジョブの優先度を調整することが可能となる. \begin{figure}[H] \begin{center} \includegraphics[width=150mm]{fig/slurm.pdf} \end{center} \caption{Slurmのアーキテクチャ} \label{fig:slurm} \end{figure} \section{rsnapshot} rsnapshot\cite{rsnapshot} はrsycnに基づく増分バックアップユーティリティである. ローカルマシンやリモートマシンのスナップショットを取ることができる. リモートマシンとはSSH経由で通信を行う. rsnapshotは設定された数のスナップショットを保持するため,使用されるディスク領域は継続的に増加することはない. データの復元にはバックアップの保存先からrsyncなどを用いてコピーを行うことで,特定のファイルの復旧などにも迅速に対応できる. バックアップを自動化するにはcronなどと併用する必要がある. \subsection{Akatsuki} Akatsukiは本コースで利用しているVM貸出システム,有線LAN接続サービス,内部DNSの機能を提供するWebコントロールパネルである. Rubyで記述されており,フレームワークとしRuby on Railsを採用している. 利用者はシステム管理チームへVMの利用申請を行い,VM作成の権限を取得する. 権限を取得後,WebコントロールパネルよりVM作成,電源操作を行えるようになっている. VMのリソースはCPU 1コア,メモリ1GB,ストレージ10GBとなり,申請を行うことでリソースを増やすことができる. VM貸出サービスの概要を図\ref{fig:akatsuki}に示す. \begin{figure}[H] \begin{center} \includegraphics[width=150mm]{fig/akatsuki.pdf} \end{center} \caption{Akatsukiの概要} \label{fig:akatsuki} \end{figure} \subsection{ie-virsh} ie-virsh\cite{ie-virsh}は本コースで利用しているvirshをラップしたVM管理ツールである. ユーザのUID及びGID情報を取得することで,マルチユーザに対応している. ユーザは手元のPCで作成したVMを学科のブレードサーバにデプロイできるサービスである. また,VM管理だけでなく Linux Kernelのデバッグを行うことができる. そのため,本コースのOperating Systemという授業で,OSについて学ぶ一環として課題で利用されている. 表\ref{tb:ie-virsh}は ユーザが利用できる ie-virsh の機能である. ie-virshは手元のPCで作成したVMを実行できるため,ユーザが好みのOSや環境を構築できるなど自由度が高い. \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から利用することができる. ie-virshと同じく,ユーザのUID及びGID情報を取得することで,マルチユーザに対応している. 表\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}