Kubernetes とコンテナー

Kubernetes とコンテナー

Kubernetes とは

Kubernetes とはコンテナーを統合管理するためのオーケストレーション ソフトウェアです。マイクロサービスなどの分野で注目され、各種クラウドプラットフォームでもマネージド Kubernetes サービスが提供されています。

元々 Google 社で利用されていたコンテナー アプリケーションを大規模に管理するためのプロジェクトでしたが、2014 年にこれを Kubernetes としてオープン ソース化しました。オープン ソース プロジェクトの段階では、クラウド ネイティブ コンピューティングを推進する団体である Cloud Native Computing Foundation (CNCF) によってホストされています。

コンテナーとは

コンテナーはアプリケーションと必要なライブラリーをひとつにまとめたものを実行単位とし、コンテナー ランタイムと呼ばれるプラットフォーム上で実行する技術です。仮想化技術で従来使われていた仮想マシンよりも可搬性に優れ、実行速度も高速となっています。

元々、コンピューターは物理マシン単位で利用されていました。ですが、リソースの効率的な利用を実現するために仮想化技術が発展し、仮想マシンの利用が主流となりました。

仮想マシンでは物理マシン上にハイパーバイザーを動作させ、その上でゲスト OS を仮想マシン単位で実行します。通常のコンピューターと同様に OS ごとに環境が分離されるため、アプリケーションの互換性にも優れています。しかし、仮想マシンごとに OS 環境が必要となるため、OS 実行分のオーバーヘッドが発生してしまいます。また、

コンテナーでは、ホスト OS のカーネルを共有することでイメージ サイズを削減し、ハイパーバイザーやゲスト OS 分のオーバーヘッドを削減することでパフォーマンスを向上させます。つまり、コンテナーではより軽量でより高速にアプリケーションを実行することができます。

システム開発サイクルの変化

ビジネスに IT が活用されるのが一般化し、その重要性は年々高まってきました。そうすると、ビジネス要求をコード化・システム化するためのシステム開発サイクルはよりスピードが求められるようになります。そこで、システムを利用するために必ず必要となる開発とその運用を効率的に進めるために、前述のコンテナー技術などが活用されるようになります。

従来システムの開発者と運用者はそれぞれが異なるリリース サイクルに関わっていました。しかし今ではシステムの高速な開発と安定した運用を両立するために、両方の立場がより効率的にシステム開発サイクルへ関わる DevOps が注目されています。

コンテナー技術が採用されると、アプリケーションが個別の単位で開発しやすくなり、システムを疎結合にできます。また、イメージの可搬性が向上するため、クラウド プラットフォームなど様々な環境にシステム基盤を構築できるようになります。

Kubernetes の特徴

コンテナー技術によって、前述のようにシステム基盤を柔軟に構築できるようになります。しかし、便利なコンテナーも管理する数が増加すると運用の負荷も増加します。そこで、コンテナおよびコンテナを稼働するホストを一元的に管理する仕組みとして Kubernetes が利用されます。

Kubernetes には次のような特徴があります。

  • リソース管理
  • スケーリング
  • セルフヒーリング
  • ロードバランシング
  • データ管理
  • 宣言的コード管理

リソース管理

Kubernetes ではコンテナーおよびコンテナーを配置するノードを統括的に管理することができます。新規に展開するコンテナーを、リソースの使用状況に応じてどのノードに展開するかといったスケジューリングを自動で行います。スケジューリングによって、アプリケーションを展開する操作だけ行えば、正常に起動するまでの配置をシステム側で行なってくれます。

また、配置先のノードをユーザーがある程度制御するための仕組みも備えています。これは Affinity 機能と呼ばれ、特定のノードへの配置を強制したり、あるいは逆に配置されないようにしたりできます。

スケーリング

Kubernetes では単体のコンテナーだけでなく複数のコンテナーを制御できるため、負荷状況などに応じてコンテナーの数を増減することもできます。複数のコンテナーを展開することにより、耐障害性が向上します。コンテナー アプリケーションに更新があった場合に、新しいバージョンへ円滑に移行できるように順次アップデートしていく仕組みも実装されています。

リソースの使用状況に応じて自動的にスケーリングできるようにすると、負荷状況に応じて適切なリソースを割り当てることができます。この仕組みはオートスケーリングと呼ばれます。

セルフヒーリング

コンテナーが停止する事態が発生した場合に、自動的に再配置する仕組みもあります。再配置は同じノード上で実行されることもあれば、ノード障害で別のノードで改めて配置されることもあります。Kubernetes が標準でプロセスの監視を行うため、人為的な監視よりも高速に障害を検知し、復旧できます。正常性の監視方法には、HTTP/HTTPS での監視やプロセス監視など複数の方法が用意されています。

ロードバランシング

Kubernetes 上で実行されているアプリケーションに対して、外部からアクセスできるようにするための機能も提供しています。これは大きく次の 3 つの機能で提供されます。

  • エンドポイント:外部から接続するためのエンドポイントを提供
  • サービスディスカバリ:サービスを定義し、振り分け先のコンテナーを指定する機能
  • ロードバランシング:振り分け先のコンテナーに対してトラフィックを分散する機能

データ管理

Kubernetes のバックエンドでデータを一元管理することで、ノード障害に対する耐障害性や、機密データを安全に保管する仕組みを実現しています。この仕組みによって、コンテナー単位で個別に機密データを配置する必要がなく、不必要なアクセス管理やデータの流出を最小限に抑えられます。

宣言的コード管理

Kubernetes では宣言的コード管理の概念によってリソースを管理できます。宣言的というのは、あるべき姿を定義することであり、例えば 4 つのコンテナーを用意しておくように定義しておけば、障害などでコンテナーの数が減った際にも自動的にコンテナーの数を復旧してくれます。

アプリケーションの実行基盤をコードによって管理することができるため、Infrastructure as Code (IaC) や CI/CD との相性が非常に良いです。