コンテナってなんだろう

今回は、汎用機おじさんである私がコンテナを使うべく色々調べてみたので、その整理としてメモを書きました。内容はおじさんターゲットです。コンテナガチ勢の方は間違いがあったらコメントください。

コンテナ管理ツールって何?

コンテナ管理ツールとはdockerやKubernetesが有名ですね。
と書いてしまうとすでに説明が終わるくらいこの2つはとっても有名です。開発や本番運用に至るまでコンテナは必須のツールです。
一つのハードウェア(仮想マシンも含む)上に独立したアプリケーション実行環境(コンテナ)をたくさん作って動かすことができます。

コンテナと仮想マシンの違い

コンテナと仮想マシンの違いとしては仮想化するレイヤが異なることが大きな違いです。
ざっくりいうとこんな感じです。仮想化している範囲が違うのです。

そもそも仮想化ってなんだっけ

仮想化は汎用機おじさんにとっては昔からある技術です。
私がSI業界に入る前のガチ汎用機の時代はハードウェアもとても高い値段だったので、ハードウェアを物理的にいくつかのパーティションに切って、アプリケーションをパーティション単位に動かしていたりとかやっていたようです。
それがPCサーバが普及してきてハードウェア単体の値段も下がったことからオープンシステムの初期は仮想化することもなく、また仮想化できるほど高性能ではなかったので、私がSI業界に入った頃はハードウェア単位にOS、アプリケーション単位にサーバを構成してデータセンターにサーバが乱立していたことを記憶しています。

そもそも仮想化ってなんで始めたんだっけ

VMware等の仮想化が流行った理由の一つとして、物理サーバだと場所や電気を必要とするからとの理解です。
サーバが100台必要であれば物理サーバ100台分の設置場所と電気が必要です。
その100台がすべて業務稼働していれば良いですが、DBサーバのフェールオーバクラスタ構成の待機系サーバや、リソース消費の少ない管理系サーバはリソースが常に余りがちですし、サーバ集約しようにも入れるソフトウェアによっては混ぜるな危険みたいな食い合わせのあるとんでもソフトウェアもあって、システム開発の現場では、結局無駄にサーバを台数を必要としていました。

サーバ個体においては、処理性能はピーク時に耐えられるように設計するので、平常時は精々30-50%程度しか使わないように設計することもよくありました。現場によっては謎の安全係数とかいう言葉の性能の掛け目もありました。未だに根拠レスの数字と疑惑を持っています。

さらにハードウェアの信頼性が低いこともあり、よく停電開けにサーバ起動したらハードディスクが壊れたとか、電源が壊れたとか、100台もサーバがあれば月に数回はハードウェア故障が起きていた記憶があります。

仮想化してよかったこと、微妙なこと

上のような物理サーバ時代に比べ、サーバを仮想化して、いくつかのハイパーバイザーが稼働するサーバ上に集約して場所と電気を減らすことができました。
また、ハードウェアの信頼性も上がった理由もありますが、仮想化して物理ハードウェアが減ったことでハードウェア障害の頻度も大きく減ったことは良かったです。
昼間にハード故障でシステム停止して、お客さんキレギレの中、ハードウェアベンダーよんで部品交換したり、夜中に電源壊れて寝ているときに呼び出しなんてこともほとんど無くなりました。

食い合わせのために独立したハードウェア構成にしていたサーバ、クリティカルな基幹DB以外の念の為クラスタ構成にしていたDBサーバは仮想化ソフトのHA機能で代替することで、待機系サーバのほとんどが姿を消し、アプリケーションサーバなどの分散サーバは平常時は少ない構成にしておいて、ピーク時だけスケールアウトするなんてことができるようになり、だいぶ効率的になりました。
なによりスナップショット機能や仮想マシンのクローンの作成、引っ越しなどサーバがハードウエアに縛られることがなくなったので本当に便利になりました。

ただ、物理ハードウェアを仮想マシンに変えただけなので、サーバ一台あたりの必要なリソース計算は減らないケースは仕方ないにしても、仮想化の利点のオーバコミットも本当のピーク時の性能リスクを取りたくないから、そこまでオーバーコミットしないので、結局、仮想マシンを動かすハードウェアの台数は減ったけど物理サーバ単体では、高性能スペック(大量なCPUコア、メモリ、高速なストレージ)が必要になってしまいがちでした。
また、物理サーバは減りましたが、サーバ台数(仮想マシン)自体はまだまだそれなりの台数があるので、OS、ミドルウェアのバージョンアップやセキュリティパッチ適用などまだまだ手がかかる部分は残っています。

コンテナになるとどうなるの

コンテナを使った仮想化になると、仮想マシンを使った仮想化とちがい、OSは共有できるようになり、アプリケーション、ミドルウェア、環境設定は独立した環境となります。
仮想マシンでは仮想マシン単位に必要だったOSが必要とするCPU、メモリ、ストレージが共通化することから必要なリソースが減ります。
共有だとソフトウェア同士の競合って大丈夫なの?に関してはコンテナ同士は独立していることから、互いに競合する可能性はないのではないかと思いますが、どうなんでしょうね。

また、仮想化の利点であるコンテナのクローンや他のハードウェアへの移動などの利点はそのままになることから、サーバ(というかアプリケーション実行環境)の集約や柔軟な運用ができるようになるのではないかと考えます。

一番のメリットは開発環境で作成してテストしたアプリケーション実行環境(コンテナ)を、そのまま本番にリリースできたり、本番環境で発生した障害に関してもコンテナ毎開発環境に持ってくることで障害のトレースなどがより便利にできるという運用面での利点も多いと思っています。

おわりに

今回はコンテナの基礎知識の整理をまとめてみました。
私自身がコンテナはまだ現場では使っていないので、論評できるような立場ではないのですが、仮想化することでインフラが仮想マシンの時代と比較してもますますソフトウェア化していくことに時代の変化を感じるとともにますます便利になっていくことが非常にありがたい限りです。
コンテナのdockerが最近有償化されたようですし、Redhatがpodmanというコンテナ管理ツールを作り、RHEL上での動作はdockerではなく、podmanを推奨したりと、コンテナ界隈で色々なことが起きているので、良い機会なので遅ればせながらコンテナを使ってみようと思います。



etc

Posted by Qtaro