近年、抽象化された分散システムでアプリケーションをデプロイ、管理するための手段として、コンテナが主流になっています。 Gartnerによると、世界企業の75%超が、2022年までに本番環境でコンテナ化アプリケーションを実行する見通しです。 その結果、世界のコンテナ管理市場の売上高は、2020年の4億6580万米ドルから2024年には9億4400万米ドルへと増加すると見込まれており。
コンテナは軽量でポータブルなソフトウェアパッケージであり、企業はアプリケーションを迅速にスケール、デプロイしやすくなります。 しかし、コンテナによって俊敏性の向上、迅速なデリバリー、効率化が実現する一方で、 企業内で同時に稼働する数百、数千ものコンテナを追跡して管理するのは 困難です。そのため、コンテナオーケストレーションソリューションが必要となる 。これは 大規模環境でこうした複雑さを管理できるものです。
Kubernetesの登場です。
K8sとも呼ばれるKubernetesは、分散環境におけるコンテナの管理とデプロイを自動化するオープンソースのコンテナオーケストレーションシステムです。手動でのデプロイは負担が大きく、ミスも起こりやすいものです。デプロイプロセスを自動化することで、生産性が向上し、待ち時間が短縮され、企業は製品をはるかに速くリリースできるようになります。
Googleが当初設計し、現在は KubernetesはCloud Native Computing Foundation (CNCF)によって管理されています。CNCFは、オープンソースプロジェクトを通じてクラウドネイティブコンピューティングを誰もが利用できるようにすることを目指すソフトウェア財団です。豊富な開発者コミュニティから寄せられた知見により、Kubernetesはコンテナオーケストレーションの強力なツールへと進化しました。
関連記事: 仮想化とコンテナ化の違いとは?
Kubernetesの特徴とは?
Kubernetesは アプリケーションのデプロイ手法に伴う多くの問題を 解決します。Kubernetesが特別な理由を見ていきましょう。
- Kubernetesは宣言的な性質を持っています。つまり、アプリケーションの望ましい状態を宣言し、実際の状態を望ましい状態に一致させる作業をKubernetesに任せられます。
- Kubernetesは自己修復型のシステムです。 システムを継続的に監視し、 障害の影響を受けない状態を維持します。
- Kubernetesはアプリケーションを自動的にスケールし、 追加のワークロードに対応できます。
- Kubernetesはデプロイプロセスを合理化し、簡素化します。
「Kubernetesは単なるオーケストレーションサービスの域を超え、今日のクラウドネイティブOSへと進化しています」と、Dotan Horovits氏(Logz.ioのプロダクトエバンジェリスト)は語ります。「当社では、KubernetesによってSaaSアプリケーションのミッションクリティカルなワークロードを実質的に実行できます。Kubernetesを利用する利点の1つは、マルチクラウド環境で統一的に運用し、マルチテナント構成を管理しやすくなることです」
Kubernetesの仕組み
Kubernetesは、マスターノードがワーカーノードを制御するマスター・スレーブアーキテクチャを採用しています。
マスターノードはAPIエンドポイントを管理し、クラスター内で行われるすべての処理を制御します。マスターノードとはCLIまたはAPIを介して通信できます。マスターノードには4つのコンポーネントがあります。
- Kube API serverはコントロールプレーンのフロントエンドで、すべての管理タスクを実行します。
- Kube Schedulerはポッドを実行するノードを選択します。
- Etcd Storageは重要な情報を保存するキーバリューストアです。
- Kube Controllerは望ましい状態を維持します。
ワーカーノードはマスターノードの指示に従ってアプリケーションを実行します。ワーカーノードのコンポーネントは次のとおりです。
- Kubeletは各ワーカーノード上で稼働する主要なノードエージェントです。
- Kube-proxyは各ワーカーノード上で稼働するネットワークプロキシです。
- コンテナランタイムはコンテナイメージを管理するソフトウェアプログラムです。
Kubernetesのその他の重要なコンポーネントは次のとおりです。
- ポッドはコンテナの集合であり、Kubernetesにおけるデプロイ可能な最小単位です。ポッドのマニフェストに記述され、オブジェクトの望ましい状態を定義します。
- クラスターはノードの集合であり、 ポッド内でコンテナ化アプリケーションを実行します。 すべてのクラスターには、少なくとも1つのノードが必要です。
- Deploymentはポッドを自動的に管理し、必要な数のレプリカが常に稼働するようにします。望ましい状態を定義すると、Deployment Controllerがその状態の維持を支援します。
- Persistent Volumesコンテナは本質的に一時的なものです。 データをコンテナのライフサイクル終了後も存続させるため、Kubernetesは 永続ボリュームを使用します。これは、ライフサイクルが 個々のポッドから独立した種類のボリュームです。
- Serviceはポッドへのネットワークアクセスを提供する通信チャネルです。
関連記事: コンテナがIoT開発を変える
Kubernetesのメリット
標準化について、Sławek Górawski氏(ULAM LABSのブロックチェーン開発者)は次のように指摘しています。「Kubernetesの最大の利点の1つは標準化です。ほとんどのプロジェクトで利用することで、同じように予測可能な方法で設定できます。あるプロジェクトでK8sに慣れている人なら、別のプロジェクトに移っていくつかコマンドを実行するだけで、どこに何があるかを数秒で把握できます。デプロイ、ルーティング、TLS証明書のどれを探していても、あるべき場所にあるのです」
柔軟性。Kubernetesは非常に柔軟で、複数の環境やインフラにデプロイできます。そのため、オンプレミス、プライベートクラウド、パブリッククラウドのいずれにもデプロイ可能です。さらに、Kubernetesは1ノードから最大5000ノードまで、さまざまな規模のクラスターに対応できます。
ダウンタイムゼロ。Kubernetesはローリングアップデート戦略を採用しています。これは、更新中もアプリケーションを停止させない方法です。この戦略では、新しいバージョンのポッドが古いポッドを段階的に置き換えるため、ダウンタイムゼロを実現できます。問題が発生した場合は、クラスター全体を停止させることなくデプロイを中断できます。
迅速なスケーリング。動的スケーリングはKubernetesの主要機能の1つです。宣言的な設定では、設定ファイルに数値を指定して望ましい状態を宣言するだけで実現できます。その後の処理はKubernetesが担います。
実際、Kubernetesには3つの自動スケーリング機能があります。Horizontal Pod Autoscaler(HPA)、Vertical Pod Autoscaler(VPA)、Cluster Autoscalerです。HPAが変化するワークロードに応じてポッド数を増減させるのに対し、VPAはメモリリソースとCPUを調整して最適に利用します。一方、Cluster Autoscalerはノードを追加または削除することで、Kubernetesクラスターの規模を調整します。
Kubernetesのデメリット
Kubernetesが非常に多くの機能を提供していることは間違いありませんが、導入にあたってはいくつかの落とし穴があります。
「Kubernetesのデメリットは初期導入にあります。Kubernetesはどのシステムに導入する場合も時間がかかり、柔軟性が高いがゆえに、ゼロから学ぶのは困難です」と David Johnson氏(最高技術責任者、 Mulytic Labs)は語ります。「企業が初めてクラウドオーケストレーションを導入し、社内チームでデプロイする場合、険しい道のりになるでしょう。クラウドオーケストレーションにまったく慣れていない人だけでKubernetesの導入を始めるのは得策ではありません。さらに、Kubernetesの柔軟性が重要でない小規模企業にとっては、過剰なソリューションになる可能性があります」
組織はKubernetesの導入時に、いくつもの課題にも直面しています。
Robert Boyd氏(CTO、 Guide-Rails.io)は、こうしたハードルを次のように挙げています。
- クラスター内のリソースに対する可視性と監視の不足
- 設定ミスによる露出の回避
- デプロイ前に、ソフトウェアサプライチェーンがコンテナ、設定、アプリケーションのセキュリティを検査し、報告することの徹底
- ランタイムセキュリティ――ゼロトラストモデルの実装
「Kubernetesに移行する企業は、既存のファイアウォールやセキュリティ対策では、新たなコンテナ化環境に十分対応できないことに気づきます」と、Glen Kosaka氏(プロダクトセキュリティ責任者、SUSE)は指摘します。「さらに、Kubernetesをはじめとする各種コンテナオーケストレーターやツール自体も、脆弱な(そして標的にされることが増えている)攻撃対象領域となっています。こうした脅威から防御するには、アプリケーションのライフサイクル全体にわたる徹底したセキュリティ対策が必要です。つまり、開発のごく初期段階からテストを経て、アプリケーションが最も脆弱になるデプロイに至るまで対策を講じなければなりません」
Kubernetesを不可欠なものにする
急な学習曲線を伴うものの、Kubernetesの導入には十分な価値があります。コンテナは現代の企業にとって不可欠な存在となっており、Kubernetesに関する十分な知識があれば、アプリケーションのライフサイクルのあらゆる側面を効果的に 管理できるようにし ます。
「Kubernetesの利用を始める組織に1つだけアドバイスするとしたら、終わりのない分析に陥らないことです。Kubernetesの素晴らしい点の1つは、無限に再構成できることなので、まずは小さく始め、そこから構築していくべきです」と、Mitchell Smith氏、 Relevance AIのリードDevOpsエンジニアは語ります。「Kubernetesで最初のアプリケーションを本番環境に移行することが最大の課題です。そこから先は、格段に容易になります」