Kubernetes とは

本ページは、機械翻訳を利用しています。本ページの記載内容とオリジナルの英語ページ の記載内容に齟齬がある場合は、英語ページの記載内容が優先します。ご参考のために掲載するものであり、それ以外の目的のためのご利用や法的効力を生じさせることを意図しておりません。

Kubernetes とは

Kubernetes は Google が原型を開発したオープンソースのコンテナオーケストレーションプラットフォームです。コンテナ化されたアプリケーションの展開、スケーリング、管理を自動化するフレームワークを提供します。Kubernetes を使用すると、クラスタ化されたマシン全体でコンテナの管理と連携が可能になり、分散型アプリケーションを実行するための高い拡張性とレジリエンスを備えたインフラが実現します。

Google のエンジニアが社内での利用を想定して開発しましたが、オープンソースのシステムとして 2014 年に社外に公開されて以来広く普及が進み、、今や、クラウドネイティブのエコシステムに欠かせない存在になっています。Kubernetes はコンテナとともに、現代のクラウドアプリケーションやクラウドインフラにおける基本構成要素として広く認識されています。

Kubernetes は、ハイブリッド クラウド環境、パブリック クラウドプライベート クラウド仮想マシン、ベアメタル サーバーなど、幅広いインフラストラクチャ上で実行され、IT チームに優れた柔軟性を提供します。

Kubernetes の仕組み

Kubernetes アーキテクチャは、いくつかの主要コンポーネントで構成されています。

Kubernetes クラスターとノード

Kubernetes クラスターは、ノードと呼ばれるコンピューティング マシンから構築されます。コントロール プレーン ノードはクラスターを管理し、ワークロードをスケジュールし、コンテナーのデプロイメントを指示します。ワーカーノードはアプリケーションを実行し、コンテナランタイム (containerd や CRI-O など) と、コントロールプレーンからの指示を実行する kubelet エージェントを含みます。クラスターはオンプレミス、パブリック、ハイブリッド クラウド環境にまたがることができるため、Kubernetes はクラウド ネイティブ アーキテクチャの中核部分になります。

コンテナ

コンテナーは、アプリケーションとその依存関係を軽量で移植可能なユニットにパッケージ化します。この分離により、さまざまな環境間で一貫した動作が保証されます。Docker などのテクノロジーは、OS レベルの仮想化を使用して、これらの自己完結型実行環境を作成します。

ポッド

ポッドは、Kubernetes のスケーラビリティを構成する最も小さな要素で、同じネットワークリソースとコンピュートリソースを共有するコンテナの一群です。コンテナをグループ化すると、特定のコンテナにトラフィックが集中し過ぎても、Kubernetes が自動でクラスタの他のノードにポッドのレプリカを作成して負荷が分散されるというメリットがあります。

各要素の連携の仕組み

Kubernetes プラットフォームは Linux ノード上で実行され、クラスター全体のポッド間の通信を管理します。管理者と DevOps チームは、コマンドライン ツール kubectl を使用して、実行するアプリケーション、使用するコンテナ イメージ、リソースの割り当て方法など、クラスターの望ましい状態を定義します。コントロール プレーンはこれらの構成を処理し、ワーカー ノード間でワークロードを自動的にスケジュールし、リソースの可用性と制約に基づいて各ポッドに最適なノードを選択します。次に、Kubernetes はリソースを割り当ててそれに応じてポッドを展開し、オーケストレーションを自動化して、チームが個々のコンテナやノードを手動で管理するのではなく、望ましい状態の宣言に集中できるようにします。これにより、Kubernetes はスケーリング、負荷分散、ワークロード実行を処理しながら、環境全体で一貫性と制御を実現できます。

Kubernetes の機能

Kubernetes には、複数のノードにわたるコンテナ オーケストレーションの簡素化、クラスター管理の自動化、リソース使用率の最適化を実現する包括的な機能が備わっています。これらには次のものが含まれます。

  • 自動スケーリング- 使用状況に応じて、必要に応じてコンテナとそのリソースをスケールアップまたはスケールダウンします。
  • ライフサイクル管理– 管理者はデプロイメントを一時停止および続行したり、以前のバージョンにロールバックしたりできます。
  • 望ましい状態の宣言– 管理者は必要なものを定義し、Kubernetes がそれを実現します。
  • 自己修復と回復力- 自動再起動、配置、レプリケーション、スケーリングが含まれます。
  • スケーラブルなストレージ:必要に応じて動的にストレージを追加できます。
  • 負荷分散- システムはさまざまなツールを使用して、内部および外部の負荷を分散します。
  • DevSecOps のサポート– Kubernetes には、コンテナのライフサイクル全体にわたって DevSecOps アプローチをサポートするセキュリティ機能と構成機能が含まれています。

Kubernetes のユースケース

Kubernetes は、組織が複雑なアプリケーションをより効率的に管理し、リソースの使用率を最適化するのに役立ちます。自動化されたコンテナ オーケストレーションにより、アプリケーションの展開、ロールアウト、サービスの検出、ストレージのプロビジョニング、負荷分散、自動スケーリング、自己修復などのタスクを処理し、アプリケーションの可用性を向上させ、ダウンタイムを最小限に抑えます。この自動化により、IT チームと DevOps チームの運用上の負担が大幅に軽減されます。

例: コンテナに障害が発生すると、Kubernetes は自動的に障害を検出し、障害が発生したコンテナを再起動、置換、または削除することでアプリケーションの可用性を維持します。スケジューラはクラスターの健全性を継続的に監視し、現在のリソースの使用状況と可用性に基づいてコンテナを最適に配置します。これらの操作は数ミリ秒以内に自動的に実行されるため、手動による介入よりもはるかに高速です。

組織は、次のような幅広いシナリオで Kubernetes を使用します。

  • アプリケーションの展開と最新化- 大規模なアプリケーションやレガシー アプリケーションをより効率的かつ移植可能な方法で実行します。

  • マイクロサービスと CI/CD パイプライン– アジャイル開発、継続的インテグレーション、迅速な配信サイクルを実現します。

  • クラウドとインフラストラクチャの戦略- ハイブリッドおよびマルチクラウドの展開、サーバーレス アーキテクチャ、シームレスなクラウド移行をサポートします。

  • 高度なデータとコンピューティングのワークロード– ビッグ データ分析、機械学習モデル、高性能コンピューティング プロジェクトを強化します。

Kubernetes as a Service とは

Kubernetes as a Service(KaaS)は、マネージド型の Kubernetes クラスタをユーザーに提供するクラウドベースのサービスです。基盤インフラを詳細に設定、管理しなくても Kubernetes の機能を利用できます。複雑なクラスタの管理を行う必要がないため、アプリケーションの展開や管理に注力できます。

クラスタのプロビジョニングやスケーリング、アップグレード、監視などは KaaS プロバイダが実施するため、ユーザーの運用上の負荷が軽減されます。Kubernetes クラスタの操作で使用するユーザーフレンドリーなインターフェースと API が提供されるほか、多くの場合、負荷分散や自動スケーリング、ロギングと監視の統合機能などが追加で提供されます。

クラウドプロバイダやマネージドサービスプロバイダは、Kubernetes as a Service を提供することで、Kubernetes の詳しいノウハウやインフラ管理のスキルがない開発者や組織でも、コンテナ化された大規模なアプリケーションを素早く用意にデプロイ、管理できるようにしています。

Docker とは

Kubernetes と同様に、Docker はユーザーがアプリケーションのデプロイメントを自動化できるオープンソース ソリューションです。Kubernetes とは異なり、Docker はコンテナ ランタイムも提供し、Linux コンテナの標準となっている OCI (Open Container Initiative) イメージ形式に従います。Docker エンジンを使用すると、開発環境でコンテナを構築および実行できます。Docker Hub などのコンテナ レジストリを使用すると、コンテナ イメージを共有および保存できます。Docker ソリューション スイートは、個々のコンテナの展開と実行を支援するのに特に効果的です。

Kubernetes と Docker の比較

Kubernetes と Docker は全く異なるテクノロジーですが、コンテナベースの最新のアプリケーション環境では組み合わせて使用されることの多い補完的なテクノロジーです。Kubernetes と Docker には次のような差異があります。

Docker:

  • Docker は、コンテナを開発、実行するためのプラットフォームとツールセットから構成されており、分離された軽量のコンテナに、アプリケーションとアプリケーションの依存関係をパッケージ化できます。

  • Docker を使用すると開発者は、コードやライブラリ、ランタイム環境など、アプリケーションの実行に必要な全ての要素を格納したコンテナイメージを作成できます。

  • 異なる環境でも同じようにアプリケーションをデプロイできるので、どのホストシステムでも、高い信頼性を維持しながらアプリケーションを運用できます。

  • 使いやすいコマンドラインインターフェース(CLI)が提供されており、コンテナを管理するためのツールとサービスの強力なエコシステムも整っています。

Kubernetes:

  • K8s と呼ばれることの多い Kubernetes は、コンテナ化されたアプリケーションのデプロイメント、スケーリング、管理を自動化するオープンソースのコンテナオーケストレーションプラットフォームです。

  • Kubernetes では、クラスタ化されたマシン全体のコンテナの実行や連携のためのフレームワークが提供されます。

  • 自動スケーリングや負荷分散、サービスの検出、自己修復などの機能が用意されています。

  • 宣言的設定やスケジューリングが可能であるため、複雑なアプリケーション環境も容易に管理できます。

  • 障害発生時にも、アプリケーションが稼働を続け、常に利用可能な状態を確保することで、高レベルの耐障害性と回復力を実現します。

以上のように、Docker では主として、コンテナの開発とパッケージ化に主眼を置いており、一方、Kubernetes では、大規模なコンテナのオーケストレーションと管理に重点が置かれています。また、Docker ではコンテナを作成、実行するツールが提供されますが、Kubernetes で提供されるのは、コンテナ化されたアプリケーションを分散環境でデプロイ、管理するためのインフラです。コンテナイメージを作成する場合には Docker を使用し、クラスタ化されたマシンでコンテナを管理、オーケストレーションするときには Kubernetes を使用するのが一般的です。

Kubernetes のメリット

Kubernetes の提供するさまざまなメリットは、クラウドネイティブのアプリケーションを重視する組織には特に有効です。Kubernetes は現在利用できるコンテナ管理システムのなかでも特に高い人気を集めていますが、その理由の一部として、以下に示すメリットが挙げられます。

  • オンプレミスでもクラウドでも、ワークロードを最も効率的に動作する場所に移動します
  • 監視、管理、デプロイ、構成を簡素化:アプリの規模を問わず、コンテナ化されたアプリの監視、管理、デプロイメント、構成が簡素化されます。
  • 高い拡張性により、 Kubernetes を既存のアーキテクチャに簡単に統合できます
  • IT 投資をコントロール:Kubernetes の組み込みのリソース最適化機能や、場所を選ばずワークロードを実行できる機能、オンデマンドの自動スケーラビリティ機能により、 IT コストを制御できます。
  • IT チームや DevOps チームの管理負荷を軽減:IT チームや DevOps チームは、コンテナ化されたアプリの管理とオーケストレーションの作業から解放されるため、より重要度の高い業務に取り組めるようになります。
  • ハードウェアリソースの使用を最適化:使用量の上限を定義する機能により、ネットワーク帯域幅やメモリ、ストレージ I/O をはじめとするハーウェアリソースの使用を最適化できます。
  • アプリケーションを効率化:Kubernetes の自己修復機能で、アプリケーションの効率を高め、アップタイムを向上させます。
  • スケジューリング機能:ソフトウェアのアップデートをスケジューリングし、計画ダウンタイムの発生を回避できます。
  • 将来を見据えたインフラ:分離したアーキテクチャで実行し、急速かつ大規模な成長に対応できる Kubernetes の機能により、将来を見据えたインフラを実現します。

アプリケーションの開発における Kubernetes の役割

Kubernetes は、コンテナ化されたアプリケーションを構築、展開、管理するためのスケーラブルで回復力のあるプラットフォームを提供します。開発者は Docker や Podman などのツールを使用してアプリケーションをコンテナーにパッケージ化し、環境間の一貫性を確保します。

次に、チームは、レプリカの数、リソース要件、ネットワーク構成を指定して、YAML または JSON マニフェスト ファイルでアプリケーションの望ましい状態を定義します。Kubernetes はデプロイメントを自動化し、利用可能なノード上でポッドをスケジュールし、スケーリングと負荷分散を管理して高可用性を維持します。

このプラットフォームは、アプリケーション コンポーネント間のシームレスな通信のために DNS 名と IP アドレスを割り当てることで、サービス検出を簡素化します。アップデートに関しては、Kubernetes はローリング アップグレードとロールバックをサポートしており、ダウンタイムなしでスムーズな移行を可能にします。

組み込みのメトリックと監視ツールとの統合により、開発者はアプリケーションのパフォーマンスとリソース使用率に関する洞察を得ることができます。最終的に、Kubernetes を使用すると、プラットフォームがオーケストレーション、スケーリング、ライフサイクル管理を自動的に処理するため、チームはコードの記述に集中できるようになります。

NutanixでKubernetesを管理する

組織がクラウド ネイティブ アプリケーションを採用するにつれて、Kubernetes を大規模に管理することが運用上の大きな課題となります。Nutanix は、Nutanix Kubernetes Platform (NKP)Nutanix Data Services for Kubernetes (NDK)という 2 つの包括的なソリューションを通じてこれらの複雑さに対処します。

Nutanix Kubernetes プラットフォームは、迅速かつ簡単な導入を実現するように設計された、完全なエンタープライズ グレードの Kubernetes プラットフォームであり、組織がベンダー ロックインなしでアプリケーション開発を加速できるようにします。パブリック クラウド、データセンター、エッジにわたる Kubernetes クラスター群の管理を標準化しながら、回復力、セキュリティ、Day 2 運用を提供します。

Nutanix Data Services for Kubernetes は、エンタープライズ データ サービスをコンテナ化されたアプリケーションに直接拡張し、クラウド ネイティブ アプリケーションのプロビジョニングと運用のプロセスを簡素化および統合します。これらのプラットフォームを組み合わせることで、価値実現までの時間が短縮され、管理者の運用リスクが軽減され、開発者向けのクラウド運用モデルが実現し、企業のコスト効率が向上します。