Kubernetes は Google が原型を開発したオープンソースのコンテナオーケストレーションプラットフォームです。コンテナ化されたアプリケーションのデプロイメント、スケーリング、管理を自動化するフレームワークを提供します。Kubernetes を使用すると、クラスタ化されたマシン全体でコンテナの管理と連携が可能になり、高い拡張性とレジリエンスを備えた分散型アプリケーションを実行するためのインフラが実現します。
Google のエンジニアが社内での利用を想定して開発しましたが、オープンソースのシステムとして 2014 年に社外に公開されて以来広く普及が進み、今や、クラウドネイティブのエコシステムに欠かせない存在になっています。Kubernetes はコンテナとともに、現代のクラウドアプリケーションやクラウドインフラにおける基本構成要素として広く認識されています。
Kubernetes は、ハイブリッドクラウド環境や、パブリッククラウド、プライベートクラウド、仮想マシン、ベアメタルサーバーをはじめとするさまざまなインフラで実行できるため、IT 部門は優れた柔軟性を得ることができます。
Kubernetes の仕組み
Kubernetes のアーキテクチャを構成する主要なコンポーネントには、次のようなものがあります。
クラスタとノード
Kubernetes の構成要素であるクラスタは、ノードと呼ばれる物理/仮想コンピュートマシンから構成されています。マスターノードという 1 つのノードがクラスタのコントロールプレーンとなり、「どのアプリケーションを常時稼働させるか」、「どのコンテナイメージを使用するか」などを管理します。そのために実行されるのが、スケジューラーサービスです。このサービスは、開発者が規定した要件などの要素に基づきコンテナの展開を自動化します。
ワークロードやコンテナ化されたアプリケーションの実行、展開、管理は、複数のワーカーノードが担います。ワーカーノードには、組織が選択した Docker などのコンテナ管理ツールや、マスターノードから命令を受け取って実行するソフトウェアエージェントである Kubelet が含まれています。
クラスタには、オンプレミスからパブリッククラウド、プライベートクラウド、ハイブリッドクラウド環境まで、組織のアーキテクチャ全体にわたるノードを含めることができます。Kubernetes がクラウドネイティブなアーキテクチャにおいて不可欠なコンポーネントである理由の 1 つはここにあります。迅速なスケーリングを必要とするクラウドネイティブのアプリをホストするのに最適なシステムです。
コンテナ
コンテナは、軽量で移植性の高いソフトウェアパッケージ化の技術です。コンテナを使用すると、どのコンピューティング環境でも同じように、アプリケーションを展開、実行できます。コンテナは、アプリケーションとそれに依存するライブラリ、フレームワーク、ランタイム環境などの全てをカプセル化するスタンドアロンの実行可能ユニットです。
コンテナは、基盤インフラからアプリケーションを分離して、アプリケーションがどのホストシステムでも同じように動作できるようにする技術です。分離は、Docker のようなコンテナ化技術によって実現します。オペレーティングシステムレベルの仮想化によって、コンテナと呼ばれる分離された環境を作成します。
ポッド
ポッドは、Kubernetes のスケーラビリティを構成する最も小さな要素で、同じネットワークリソースとコンピュートリソースを共有するコンテナの一群です。コンテナをグループ化すると、特定のコンテナにトラフィックが集中し過ぎても、Kubernetes が自動でクラスタの他のノードにポッドのレプリカを作成して負荷が分散されるというメリットがあります。
各要素の連携の仕組み
Kubernetes プラットフォームはシステムの OS(通常は Linux)上で実行され、ノードで動作するポッドとやり取りします。kubectl と呼ばれるコマンドラインインターフェースから、管理者や DevOps ユーザーは必要とするクラスタの状態を入力します。具体的には、「どのアプリケーションを実行するか」、「どのイメージやリソース使用するか」などの詳細情報を入力します。
クラスタのマスターノードがこれらのコマンドを受け取り、ワーカーノードに渡します。クラスタのどのノードがコマンドを実行するのに最適であるのかを、Kubernetes プラットフォームは自動で判断します。次にプラットフォームは、リソースや、リクエストされた処理を実行するノード内の特定のポッドを割り当てます。
Kubernetes では、コンテナ管理の基本的なプロセスを変更するのではなく、単にプロセスを自動化して作業の一部を引き継ぐだけなので、それぞれのノードやコンテナを個別に管理しなくても、管理者や DevOps のチームは高度な制御を実現できます。人がする作業は、Kubernetes システムの構成と、システム内の要素の定義だけです。実際のコンテナのオーケストレーション作業は全て Kubernetes が行います。
Kubernetes の機能
Kubernetes には、複数のノードにおけるコンテナのオーケストレーションの簡素化やクラスタの管理の自動化、リソース利用の最適化といったさまざまな機能が用意されており、具体的には機能には、次のようなものがあります。
- 自動スケーリング:利用状況に応じて、コンテナとコンテナのリソースのスケールアップ、スケールダウンを実行します。
- ライフサイクル管理:管理者は、デプロイメントの中断、継続や、前のバージョンへのロールバックができます。
- 望ましい状態の宣言:管理者が必要な状態を定義すると、Kubernetes がその状態を実現します。
- 自己修復とレジリエンス:再起動、配置、レプリケーション、スケーリングを自動化します。
- スケーラブルなストレージ:必要に応じて動的にストレージを追加できます。
- 負荷分散:システムは多くのツールを使用するため、内部および外部で負荷を分散します。
- DevSecOps のサポート:コントローラのライフサイクル全体とクラウド全体で、コンテナ運用のセキュリティを簡素化し、セキュアなアプリの市場投入までの時間を短縮します。
Kubernetes の用途
Kubernetes は、複雑なアプリケーションをより適切に管理し、既存のリソースを最大限に活用できるようにします。アプリケーションの可用性も確保され、ダウンタイムを大幅に抑えられます。コンテナのオーケストレーションを通じ、アプリケーションのデプロイメントやロールアウト、サービスの検出、ストレージのプロビジョニング、負荷分散、自動スケーリング、自己修復をはじめとする数多くの処理を自動化します。この結果、IT チームや DevOps チームの管理作業の負荷が大幅に軽減されます。
コンテナに障害が発生した場合、Kubernetes がその障害を検出すると、ダウンタイムを最小限に抑えるために(または完全に排除するために)、障害が発生したコンテナを再起動、置き換え、削除することによって、自動的に切り替えを実行します。また、システムが全クラスタの状態を監視しており、現在リソースがどこでどのように利用されているのかに応じて、コンテナを実行する最適な場所を判断します。これらの処理が全て数ミリ秒以内に自動で行われます。人手による作業では不可能です。
Kubernetes as a Service とは
Kubernetes as a Service(KaaS)は、マネージド型の Kubernetes クラスタをユーザーに提供するクラウドベースのサービスです。基盤インフラを詳細に設定、管理しなくても Kubernetes の機能を利用できます。複雑なクラスタの管理を行う必要がないため、アプリケーションの展開や管理に注力できます。
クラスタのプロビジョニングやスケーリング、アップグレード、監視などは KaaS プロバイダが実施するため、ユーザーの運用上の負荷が軽減されます。Kubernetes クラスタの操作で使用するユーザーフレンドリーなインターフェースと API が提供されるほか、多くの場合、負荷分散や自動スケーリング、ロギングと監視の統合機能などが追加で提供されます。
Kubernetes の詳しいノウハウやインフラ管理のスキルがない開発者や組織でも、クラウドプロバイダやマネージドサービスプロバイダが提供する Kubernetes as a Service を利用することで、コンテナ化された大規模なアプリケーションを迅速かつ容易にデプロイ、管理できるようになります。
Docker とは
Kubernetes と同じく Docker もまた、アプリケーションのデプロイメントを自動化できるオープンソースのソリューションです。Kubernetes と異なるのは、Docker がコンテナのファイルフォーマットである点です。Docker は現在、Linux コンテナのためのデファクトのファイルフォーマットになっています。Docker Engine を使用すると、開発環境でコンテナを開発、実行できます。また、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 は現在利用できるコンテナ管理システムのなかでも特に高い人気を集めていますが、その理由の一部として、以下に示すメリットが挙げられます。
- 最適な運用ができる場所へワークロードを移動:プラットフォームはオンプレミスでもクラウドでも動作するので、シンプルな運用が可能です。
- 監視、管理、デプロイ、構成を簡素化:アプリの規模を問わず、コンテナ化されたアプリの監視、管理、デプロイメント、構成が簡素化されます。
- 既存アーキテクチャとの容易な統合:高い拡張性により、既存のアーキテクチャとの統合が容易です。
- IT 投資をコントロール:Kubernetes の組み込みのリソース最適化機能や、場所を選ばずワークロードを実行できる機能、オンデマンドの自動スケーラビリティ機能により、 IT コストを制御できます。
- IT チームや DevOps チームの管理負荷を軽減:IT チームや DevOps チームは、コンテナ化されたアプリの管理とオーケストレーションの作業から解放されるため、より重要度の高い業務に取り組めるようになります。
- ハードウェアリソースの使用を最適化:使用量の上限を定義する機能により、ネットワーク帯域幅やメモリ、ストレージ I/O をはじめとするハーウェアリソースの使用を最適化できます。
- アプリケーションを効率化:Kubernetes の自己修復機能で、アプリケーションの効率を高め、アップタイムを向上させます。
- スケジューリング機能:ソフトウェアのアップデートをスケジューリングし、計画ダウンタイムの発生を回避できます。
- 将来を見据えたインフラ:分離したアーキテクチャで実行し、急速かつ大規模な成長に対応できる Kubernetes の機能により、将来を見据えたインフラを実現します。
Kubernetes のセキュリティのベストプラクティス
セキュリティは、ワークロードやアプリケーションをどこで実行しているかにかかわらず、今日の組織にとって最優先事項になっています。Kubernetes のシステムと、システムで使用するアプリケーションとデータのセキュリティを確保するためのベストプラクティスをいくつかご紹介します。
クラスタへのアクセスのセキュリティを確保:RBAC(役割ベースのアクセス制御)などの強力な認証・許可のメカニズムを使用し、Kubernetes API へのアクセスを制限します。強固な一意のパスワードを用い、証明書ベースの認証をはじめとする、より安全な認証手法を導入します。API へのアクセスの監査と監視を有効にして、不正なアクティビティや疑わしいアクティビティを検知します。
Kubernetes のコンポーネントを定期的にアップデート:セキュリティパッチやバグ修正が反映されている最新の安定したリリースを使い、Kubernetes のコンポーネント(コントロールプレーン、ワーカーノード、etcd)を最新の状態に維持します。
ネットワークポリシーの適用:クラスタ内のトラフィックフローを制御するネットワークポリシーを実装し、ポッド間の通信を制限します。ネットワークポリシーを使用すると、コミュニケーションチャネルの安全性を強化し、機密性の高いサービスやデータへのアクセスを制限します。
セキュアなコンテナイメージの使用:信頼のおけるソースが提供する高信頼なコンテナイメージのみを使用します。コンテナイメージは定期的なスキャンによる脆弱性の有無の’確認、パッチの適用とアップデートを確実に実行します。イメージの署名や検証を使用することで、イメージの整合性を確保します。
RBAC と最小限の権限を使用:役割ベースのアクセス制御(RBAC)を導入し、ユーザーやサービスに適切な権限と役割を割り当てます。最小限の権限の原則に従い、ユーザーやサービスが必要としている権限だけを付与します。
ポッドセキュリティポリシーを有効化:ポッドセキュリティポリシー(PSPs)を使用して、特権を持つコンテナの使用やホストへのアクセスの禁止など、ポッドの作成に関するセキュリティ制限を適用します。
監視とログの記録:Kubernetes クラスタのロギングと監視の機能を有効化し、セキュリティインシデントの検知と迅速な対応ができるようにします。API サーバーのログやコンテナのログ、クラスタレベルのイベントを監視することで、疑わしいアクティビティや不正アクセスの試みを検出します。
etcd データの安全な保存:保存データや転送中のデータを暗号化し、etcd データをセキュアに保存できるようにします。etcd へのアクセスを制限し、権限のあるエンティティのみが、クラスタの設定データに対するアクセスと変更ができるようにします。
バックアップとディザスタリカバリのテストの定期的な実施:問題が発生したときやサイバー攻撃を受けたときにディザスタリカバリが速やかに機能するよう、重要度の高い Kubernetes のコンポーネントや構成、データを一定の間隔でバックアップします。ディザスタリカバリの手順は定期的にテストし、ディザスタリカバリが確実に効果を発揮するようにします。
常に最新の情報を入手し、ベストプラクティスに従う:Kubernetes のコミュニティやセキュリティのエキスパートから最新のセキュリティのベストプラクティスやアドバイスを入手し、常に新しい情報を把握できるようにします。
Kubernetes のユースケース
現在、さまざまな組織が、広範囲なユースケースで Kubernetes を使用しています。具体的なユースケースには、次のようなものがあります。
- アプリケーションの大規模なデプロイメント
- マイクロサービスの管理
- 継続的統合/継続的開発(CI/CD)ソフトウェアの開発
- サーバーレスコンピューティングの実現
- ハイブリッドやマルチクラウドでのデプロイメント
- ビッグデータ分析
- 大規模または複雑な計算プロジェクト
- 機械学習プロジェクト
- オンプレミスのサーバーからクラウドへのデータの移行
アプリケーションの開発における Kubernetes の役割
Kubernetesは、コンテナ化されたアプリケーションのデプロイ、管理、スケーリングのためのスケーラブルで弾力性のあるプラットフォームを提供することで、アプリケーション開発において重要な役割を果たしています。具体的な内容を以下のとおりです。
コンテナ化:Docker などのテクノロジーを使用することで、開発者はアプリケーションとその依存関係をコンテナイメージにパッケージ化できます。コンテナを使用すると、どの環境でも同じようにアプリケーションを実行し、アプリケーションも容易にデプロイできるようになります。
宣言的設定:開発者は、通常 YAML または JSON 形式で記述された Kubernetes 構成ファイルを使用して、アプリケーションとそのコンポーネントの望ましい状態を定義します。この構成ファイルでは、レプリカの数やネットワークの要件、リソース使用量の上限など、アプリケーションのデプロイ方法に関する情報を指定できます。
デプロイメント:開発者は Kubernetes を使って、コンテナ化されたアプリケーションをデプロイできます。Kubernetes のデプロイメントオブジェクトを作成し、必要とするレプリカやコンテナイメージの数を指定できる。クラスタ内の利用可能なノードへのコンテナのスケジューリングは Kubernetes が行います。
スケーリングと負荷分散:Kubernetes には、アプリケーションをスケーリングする組み込みのメカニズムがあります。開発者は CPU の利用状況などの指標をもとに、自動スケーリングのポリシーを定義し、アプリケーションの自動スケールアップや自動スケールダウンできます。また、Kubernetes は、ロードバランシングも行います。アプリケーションのレプリカに着信したトラフィックを分散して、高可用性と最適なリソースの利用を可能にします。
サービスの検出とネットワーク機能:Kubernetes が提供するサービス抽象化機能により、アプリケーションがクラスタ内の別のアプリケーションを検出して通信を行うことが可能になります。開発者が各アプリケーションのエンドポイントを公開するサービスを定義すると、Kubernetes が自動的に一意の DNS 名と IP アドレスを個々のサービスに割り当て、これにより、アプリケーションの別の部分同士でシームレスなコミュニケーションが可能になります。
更新プログラムの展開とロールバック:Kubernetes では更新プログラムを展開でき、開発者はダウンタイムを発生させずにアプリケーションをアップデートできます。開発者が新しいバージョンのコンテナイメージを指定すると、Kubernetes が段階的に既存のコンテナを新しいコンテナに置き換えていくので、スムーズな移行が可能になります。問題やエラーが発生した場合には、Kubernetes がロールバックを行い、以前の正常に稼働していたバージョンに戻すことが可能です。
監視とモニタリング:Kubernetes には、監視とモニタリングの機能があり、開発者がアプリケーションをロギングシステムやモニタリングシステムと連携させると、アプリケーションとアプリケーションのコンポーネントのメトリクスやログ、イベントが Kubernetes から提供されるようになります。これにより、開発者はアプリケーションのパフォーマンスを把握し、問題をトラブルシューティングし、リソースの使用を最適化することができます。
Kubernetes は、コンテナ化されたアプリケーションのライフサイクル、スケーラビリティ、ネットワーキングを管理するプラットフォームを提供することで、アプリケーション開発を簡素化します。デプロイメント、スケーリング、高可用性の維持を Kubernetes が行うことにより、開発者はコードの記述や、必要とするアプリケーションの状態の定義に専念できるようになります。
Nutanix による Kubernetes の管理
Kubernetes には、ストリーミング機能や、コンテナのオーケストレーションと管理を自動化できる機能、活発な活動を続けるオープンソースコミュニティの存在、柔軟性の高いスケーラビリティなど、さまざまなメリットがあります。Kubernetes はクラウドネイティブ戦略において重要な役割を果たしており、ハイブリッドとマルチクラウドのコンピューティングモデルに対応しているため、開発の迅速化、アプリ展開の省力化、アプリとサービスの運用の最適化を目指している組織には、戦略的な選択肢になります。
Nutanix では、Nutanix Kubernetes Engine(NKE)により、Kubernetes の運用と管理をさらに簡素化しています。NKE を使用すると、次のことが可能になります。
日単位、週単位ではなく、分単位で、本番環境に対応した Kubernetes クラスタのデプロイメントおよび構成。
K8s ストレージ、監視機能、ロギング機能、アラート機能を容易に統合し、完全にクラウドネイティブなスタックを実現。
オープンな API で、ネイティブな Kubernetes のユーザーエクスペリエンスの提供。