はじめに
こんにちは!四日市に住み始めてから2か月が経ち1人暮らしにもだいぶ慣れてきた中山です。
先日、RedHatOpenShift Lounge+ (#16) - Metaverse に参加して先輩技術者の方々のお話を拝聴してきました!
自分自身コンテナ技術については知見が少ないのですが、KubernetesとMetaverseの融合とその可能性について楽しみながらも勉強になるお話がたくさん聞けて非常に有意義な時間となりました!
しかし、同期達の話を聞いていると「Kubernetesって何?Dockerと何が違うの?」「コンテナ技術って名前は聞いたことはあるけど…」という声がありました。恥ずかしながらOpenShiftに関しては私も今回のお話で初めて知りました…
確かに情報系の技術に携わっていると名前を聞く機会は多くありますがその実がなんなのかいまいちわかっていないという状態に陥りがちだと思います。私自身もそうでした。
そこで改めてDocker・Kubernetes、さらにOpenShiftについてまとめてみようと思います!
そもそも「コンテナ」って?
Docker・Kubernetes・OpenShiftの話をするにはまずコンテナがどのようなものなのか知っておかないといけません。なのでまずはコンテナ、そして同じ仮想化技術である仮想マシンについて比較することでなぜコンテナが使われているのかまとめたいと思います。
仮想マシンもコンテナも同じ仮想化技術ですが、「自由度」「可搬性」(移植のしやすさ)「使用するリソース」という3点で違いを見ていくとわかりやすいと思います。
仮想マシン
仮想マシンは物理サーバ、ホストOSの上にハイパーバイザと呼ばれるコンピュータを仮想化し、制御実行するソフトウェアがいます。
そこから上は一般的なサーバを仮想化しているだけなので
- アプリケーション
- ミドルウェア
- ゲストOS
- 仮想マシン
というような構成になります。(厳密には仮想化のうちホスト型というものに該当しますが説明の都合上ハイパーバイザという言葉を使っています。有識者の方は見逃してくださるようお願いします。)
蛇足ですが有名なハイパーバイザとしては
- VMware ESXi
- Microsoft Hyper-V
- Oracle VM VirtualBox
- KVM
があります。もし「あれってハイパーバイザだったのか!」となっていただければ幸いです。
仮想マシンのメリットはなんといってもその自由度にあります。仮想化していても物理サーバと同じ構成なので使用するOSやインターフェースを指定することができ、使用感は物理サーバとあまり変わりません。
しかし、物理サーバと同じようにプロセッサやメモリ、ストレージを使用するので仮想マシンに割り当てたリソースは仮想マシンが起動している間は占有されてしまいます。
さらに、仮想マシンの環境を移行しようとすると環境がすべて変わるので物理サーバ、ホストOSの設定から確認する必要があるため手間がかかります。
もしもアプリケーションごとに環境を分ける場合はアプリケーションごとに仮想マシンを立てる必要があり、必要以上にリソースを消費してしまいます。しかも物理サーバ、ホストOSの設定がすべて同じだった場合この構成は無駄に感じませんか?
コンテナ
コンテナとはアプリケーションや実行環境をまとめたものです。
また、コンテナエンジンとはそれらコンテナを制御実行するソフトウェアのことです。
仮想マシンとの決定的な違いは、アプリケーションの管理に特化していてコンテナに含まれるのはアプリケーションとミドルウェアのみということです。
これによって受ける恩恵は大きく、仮想マシンとは違い消費するリソースはアプリケーションで使用する分のみでアプリケーションの実行が終われば使用していたリソースはホストに戻るので無駄を最小限に抑えることができます。
さらにアプリケーションを他の環境で実行したい、といった場合にも非常に便利です。コンテナエンジンが環境の差を吸収してくれるのでオンプレクラウド、OSを問わずコンテナエンジンを実行することができればアプリケーションを動作させることができます。
ただ、図にもあるようにホストOSの上に直接コンテナエンジンが立つのでコンテナごとに実行するOSを変更するといったことはできずすべて同一のOS上で動かす必要があります。
Docker・Kubernetes・OpenShiftの関係性
少し長くなってしまいましたが、ここでやっと本題のコンテナ関連技術についてまとめていきたいと思います。
先に結論から話すと
- DockerがあってのKubernetes
- KubernetesがあってのOpenShift
だと思っています。KubernetesとOpenShiftに関しては解釈にもよりますがそれら単体では主要な意味を持たず、KubernetesならDockerが、OpenShiftならKubernetesが欠かせないという理解をしています(もし間違っていたらこっそり教えてください)。
各技術の解説
Docker
Dockerは前述したコンテナエンジンと呼ばれるものです。
Dockerに関しては
「Dockerといえばコンテナ」「コンテナといえばDocker」
といっても差支えがないほどコンテナエンジンとしては圧倒的なシェア率を誇ります。試しに「コンテナとは」と調べてみるとさも当然かのようにDockerの話が大量にヒットします。これがかえって初学者の人の混乱を招いているのかもしれませんね…
また、Dockerはミドルウェアのインストールや環境の設定をコード化して管理します。これはIaC(Infrastracture as Code)と呼ばれ、様々なメリットがあります。
環境構成や自動化(プロビジョニング)をファイルにコードとして記述、管理するのでそのコードを共有すればどの環境でも誰でも容易に同じ実行環境を再現することができます。また、環境を配布する際もイメージファイルのように容量が重く取り扱いにくいものではなくコードなのでとても手軽です。
そして環境の再現が容易なので「失敗しちゃった~」といったときも気軽にスクラップし、再ビルドすることができます。
ただ、Dockerが便利とはいってもいくつか難点もあります。その1つが複数コンテナの管理です。
もちろんDockerに管理機能はありますがちょっと込み入ったことをやろうとすると操作が煩雑になり、管理のハードルが上がります。
そんな問題を解決してくれるのが次に紹介するKubernetesです。
Kubernetes
Kubernetesとは、コンテナの運用管理と自動化を行うソフトウェアです。このように複雑な情報システムの管理、自動化を行う様をオーケストラの指揮に見立ててオーケストレーションと呼び、ソフトウェアをオーケストレーションツールと呼びます。
また、Kubernetesは一般的にk8sと省略されます(以下k8sという)。
k8sは複数コンテナの運用管理を行うことができ、デプロイの自動化やスケーリング、ロードバランスなど様々な便利機能を有しています。
そしてk8sで欠かせない用語としてクラスタというものがあります。
クラスタとは、簡単に説明するとコンテナの集合のことです。クラスタ構成をとることでロードバランシングをしたり、スケーリングや冗長化などを行うことができ可用性を担保することができます。
この部分に関してはノードの説明も行わなければいけませんが長くなりすぎてしまうので今回は割愛します。
ただ、覚えておいてほしいのはk8sはあくまでコンテナの管理ツールであること、基本的にはDockerと組み合わせて使うものであるということです。
これが関係性のセクションで書いた「Dockerあってのk8s」というやつですね
そんな万能そうなk8sですが、これもまた少し難点があります。
Dockerでは厳しかった複雑な機能に対応しているため、機能形態が複雑化してしまっています。
これはある種どうしようもないことなのですが、概念の理解が少し難しいことも相まって初学者にはハードルが高くなってしまっています。
実際のところk8sを「使いこなす」というのは本当に難しく、私は一種の職人技のようなものだと思っています。なのでインフラエンジニアで「k8s?俺に任せな」なんてことを言える人は一目も二目も置かれますね。そんなセリフ言ってみたいものです。
OpenShift
OpenShiftはRedHat社が開発したk8sを企業向けに活用するためのコンテナソリューションです。
k8sは前述の通り扱いが難しいといった点以外にも、セキュリティ面での不安やマイナーバージョンのアップデートが早くそれに従ってサポートの終了も早いという問題点があります。
OpenShiftはこれら問題を取り除いて企業がk8sを安定かつ継続的に利用するためのソリューションになります。
OpenShiftは
- 企業運用レベルのセキュリティ機能の搭載
- 長期サポートの提供
- CI/CDの実装
といった企業向けの機能を搭載しています。細かい機能はもちろん他にもいろいろとあります。
そして、OpenShiftもあくまでk8sを企業向けに活用するためのものです。
これが「k8sあってのOpenShift」ってやつですね。
Azure上で「Azure Red Hat OpenShift」という形で利用できるようなのでぜひ触ってみたいですね(いつ触れるレベルに到達できるかわかりませんが)。
おわりに
今回はDocker・Kubernetes・OpenShiftについて簡単にまとめてみましたが、これらのイメージがなんとなくつきましたでしょうか?
まとめてて感じましたがやはりコンテナ技術というのは奥が深く、情報量も多いためどの程度でまとめていいか悩みました。
少しでもDockerやk8s、OpenShiftの理解に役立てていただければ幸いです。