Kubernetes とは?

分散システムのデプロイと管理を容易にする DevOps プラットフォーム

Max Rehkopf Max Rehkopf

Kubernetes は、ネットワーク化されたハードウェア リソースのクラスタ全体でコンテナー ランタイム システムを連携させる、オープンソース プラットフォームです。これはもともと Google によって開発されました。Google は、1 週間に数十億のコンテナーを大規模に実行するための新しい方法を必要としていました。Google はその目的で長年にわたって 3 つの異なるコンテナー管理システムを開発して、最新ではオープンソース システム Kubernetes になっています。

ギリシャ語に由来する Kubernetes という言葉は、操舵手またはパイロットを意味します。Kubernetes は現在、コンテナーと分散アプリケーションのデプロイのための市場リーダーであり、業界標準の連携ツールとなっています。Kubernetes は、開発者がまとまって分散システムを連携させてきた以前のツールとシステムの進化の頂点です。

DevOps の進化は、サーバー ラック室の物理マシンの管理を開始しました。これらの物理マシンはまだ存在しますが、さほど現場に出てきません。仮想マシンと仮想ハードウェアは、物理マシン上のハイパーバイザーを介して実行される次の抽象化層でした。開発者は、インフラストラクチャとインフラストラクチャ全体にわたる仮想マシンの管理に、多大な労力を費やしていました。コンテナーは、開発者がより大局的なアプリケーション開発に重点を置いて、インフラストラクチャにそれほど重点を置かないようにするために開発されました。その後、Kubernetes が導入されて、クラウド インフラストラクチャ全体でコンテナーを自動化して管理できるようになりました。

Kubernetes は、ネットワーク化されたハードウェア リソースのクラスタ全体にわたるコンテナー ランタイム システムの連携に使用されるため、開発者がクラスタで実行されるアプリケーションを作成する際に役立ちます。Google が指摘しているように、Kubernetes の「主な設計目標は、コンテナーによって実現される利用率の向上からメリットを受けながら、複雑な分散システムのデプロイと管理を容易にすることです」

Kubernetes は K8 または kube と呼ばれることがあり、現在は クラウド ネイティブ コンピューティング財団によって維持されています。

Kubernetes の使用目的は?

Kubernetes は基本的にコンテナー化されたアプリケーションのクラスタをデプロイして管理する際に使用されて、独自の CaaS プラットフォームを確立するために使用できます。マイクロサービス アプリケーション アーキテクチャの管理に役立ち、堅牢な最新の DevOps CI/CD パイプラインを構築するための重要なツールとなっています。

Kubernetes とコンテナーの関係をよりよく理解するには、コンテナーを理解することが重要です。Kubernetes は一連のコンテナーを束ねています。コンテナー セットの例としては、アプリ サーバー、Redis キャッシュ、SQL データベースがあります。Docker コンテナーは、コンテナーごとの 1 つのプロセスです。Kubernetes は、これらのコンテナーを同じマシンで管理しているグループに配置して、ネットワーク負荷を減らしてリソースの使用効率を向上させます。

Kubernetes は、設定で指定された基盤となるハードウェア リソースをプロビジョニングして管理します。その後、ハードウェア リソース全体にアプリケーション コンテナーを増殖させて分散させます。これによって、Kubernetes はマシン間または同じマシン上でコンテナーを連携できます。

Kubernetes は、クラウド向けのアプリケーション開発の最適化にも役立ちます。最新の重要なアプリケーションのほとんどは、アカウント管理、決済、コンテンツなど、いくつかの異なるビジネス ケース責任で構成されています。これらの個別の責任は、マイクロサービス アーキテクチャに最適です。新しいプロジェクトの開発における初期段階で Kubernetes を使用することによって、マイクロサービスの設計と実装は、多くの場合、強力な投資収益率をもたらします。プロジェクトの成長に伴い、Kubernetes が提供する自動スケーリング、監視、容易なデプロイの各機能のメリットを享受します。

Kubernetes を使用すると、リソースを集中的に使用する計算ジョブをスケジュールできます。プロジェクトによっては、長時間にわたってマシン リソースを使い果たす負荷の高いワークロードが必要になる場合があります。タンパク質フォールディング、遺伝子解析、3D グラフィック レンダリングなどの複雑なシミュレーションを実行するプロジェクトを想像してみてください。多くの場合、これらのタイプのプロジェクトには、シミュレーションを非同期で実行するための計算リソースの専用クラスタがあります。Kubernetes は、これらのクラスタを管理するための理想的なツールです。

クラスタ全体でリソースを効率的にプロビジョニングすることは、困難な作業になる場合があります。CPU とメモリ コンテナーに必要な量は、使用量に応じて変動する可能性があります。Kubernetes には、水平拡張と垂直拡張の両方の自動スケーリング メカニズムがあります。水平拡張には 2 つの方法があります。Kubernetes はノード上でさらに多くの Pod を追加/削除できます、または新しいマシンをクラスタに追加/削除します。しかし、垂直拡張は、コンテナーが使用するローカル マシン リソースを増減します。Kubernetes には監視機能が組み込まれており、またスケール アップ/ダウンする必要があるかどうかを判断するために確認される設定可能なルールのセットがあります。

Kubernetes はアプリケーションのデプロイと更新を制御して自動化するため、CI/CD パイプラインを構築するために最新の DevOps パイプライン ツールと組み合わせて使用できます。堅牢な自動テスト スイートと一体化されたこのデプロイ自動化は、完全な CI/CD パイプラインを網羅しています。

Kubernetes の対象者

Kubernetes は現代の高性能ソフトウェア プロジェクトに最適です。しかし、既存のプロジェクトを Kubernetes に移行する際は、高額で時間のかかる切り替えコストが生じます。それを念頭に置くと、これは多くの場合は、プロジェクトの初期段階に適しています。しかし、より古い確立されたシステムを Kubernetes に移行する投資収益率は、コストに見合うかもしれません。これは、エンジニアリング ビジネス コストの決定であり、慎重に検討する必要があります。

Kubernetes と Docker の比較

Docker はコンテナー ランタイムですが、Kubernetes は多くのコンテナー ランタイムからコンテナーを実行して管理するためのプラットフォームです。Docker は、Kubernetes がサポートする多くのコンテナー ランタイムの 1 つです。Kubernetes は「オペレーティング システム」、Docker コンテナーは「オペレーティング システム」にインストールする「アプリ」とおおよそ考えられます。

Docker それ自体は、最新のアプリケーション開発に非常に有益です。「自分のマシンでの作業」だけでの古典的な問題を解決します。スタンドアロン Docker は、いくつかのコンテナーのデプロイを十分に処理できます。システムが成長して互いにネットワーク化された多数のコンテナーを追加する必要がある場合、スタンドアロン Docker は直面する可能性のあるいくつかの生みの苦しみは、Kubernetes によって対処できる可能性があります。

Kubernetes の基本

Kubernetes は多くのコンポーネントで構成されており、いくつかの概念を理解する必要があります。全体的な Kubernetes のインストールは、クラスタと呼ばれます。すべての Kubernetes クラスタには Main インスタンスがあります。Main はクラスタの管理を担当する、デプロイのロールアウト、自動スケーリング、正常性の監視など、クラスタ内のすべてのアクティビティを調整するデーモン プロセスです。

Kubernetes 機能の仕組みを示す図。Master インスタンス、ノード、kublet と Pod を示します。

クラスタはノードで構成されています。ノードは、Kubernetes クラスタのワーカー インスタンスとして機能する VM や物理ハードウェアのようなマシン エンティティです。すべてのノードには、Kubernetes AP を使用して Main プロセスと通信するクライアント プロセスである Kubelet が含まれています。また、ノードには Docker のようなコンテナー ランタイム システムが格納されています。

各ノードには Kubelet が含まれています。Kubelet は、ノードの管理と main との通信を担当する主要なプロセスです。また、Kubelet は、割り当てられた Pod 内のコンテナーのライフ サイクルとメンテナンスを定義する PodSpec をダイジェストします。

ノードには、Kubernetes の最小単位である Pod が含まれています。Pod はコンテナーの抽象化です。通常、Pod にはアプリケーションごとに多数のコンテナーが含まれます。すべての Pod には、「一時停止」コンテナーと呼ばれる隠しコンテナーもあります。これは、Pod 内にある他のコンテナーが localhost と通信するために使用するネットワーク名前空間を保持します。

サービスは Pod への静的ポインタです。Pod は一時的であるため、Pod の再起動または再作成時に再割り当てできる動的 IP を備えています。これは、IP アドレスで Pod にネットワーク接続しようとすると不便になる可能性があります。サービスは、Pod が静的 IP アドレスを持つことを保証する際に役立ちます。

ReplicationController は指定された数の Pod を一度に実行できるメカニズムで、Kubernetes の自動スケーリング機能の重要な部分です。Pod が多すぎると、レプリケーション コントローラはそれらを選別して、数が少なすぎる場合は新しい Pod が作成されます。ReplicationSets は ReplicationController の後継で基本的に同じ機能ですが、ReplicationSets には Pod 一式を簡単に目標にできるユーティリティがあります。

Kubectl は、Kubernetes クラスタに対してコマンドを実行するためのコマンド ライン インターフェイスです。Kubernetes を管理するのに利用できる、広範なリストのコマンドとオプションがあります。

Kubernetes は、物理ハードウェアまたは仮想ハードウェアの両方にデプロイできます。Kubernetes の軽量バージョンである MiniKube は、開発に使用されて、ノード 1 つのみを持つ単純なクラスタをデプロイするローカル マシン上に VM を作成します。

Kubernetes 機能の仕組み

Kubernetes は確認とバランスの 3 フェーズ ループで動作します。Kubernetes ループの 3 つのフェーズは、次のとおりです。

観察する
観察フェーズでは、Kubernetes はクラスタの現在の状態のスナップショットを集約します。Kubelets はそれぞれのノードに関する状態情報を収集してこの状態を main プロセスに送り返し、包括的なクラスタの現在の状態を main に表示します。

違いを確認する
観察フェーズの状態スナップショットは、Kubernetes 設定で指定された予想される静的クラスタ パラメーターと比較されます。現在の状態と予想されるクラスタの状態の間の不一致が特定されて、アクションが予定されます。

アクションの実行
その後、main はコマンドを発行して、クラスタを予期された状態に戻します。これは、Pod の削除または作成、ノード全体の水平拡張または垂直拡張などを意味します。

上記の 3 つのフェーズは、Kubernetes ループの一般的な説明でした。ただし、Kubernetes クラスタには、実際にはさまざまなループがある場合があります。これらのループはコントローラによって実行されます。ReplicationController はループ フェーズに従います。アクションの実行フェーズでは、RC はレプリカ セットによって管理される新しい Pod の選別または作成について単独で行います。

概要

Kubernetes はオープン ソースであるため、オンプレミス、ハイブリッド、パブリック クラウドの各インフラストラクチャを自由に活用できます。また、作業負荷を重要な場所に苦もなく移動できます。Kubernetes は JenkinsX のような最新のパイプライン ツールと組み合わせて、極めてアジャイルでリーンな CI/CD システムを構築でき、最新の優れたパフォーマンスを誇る DevOps チームによって活用する必要があります。