コンテナ型仮想化技術は、ITインフラのパフォーマンスや拡張性を高められる点が強みです。特にKubernetesは、コンテナ環境の設定・管理・調整を自動化できるため、多くの企業で採用されている仕組みです。ただし、Kubernetesを安定して運用するためにはいくつかの課題があります。そこで、クラウドプラットフォームが持つ機能と組み合わせながら、運用効率を上げていく方法がおすすめです。本記事では、Kubernetesの仕組みやメリット、運用時の課題、その解決方法について解説します。
Kubernetesが普及した背景と基本的な仕組み
Kubernetes は、コンテナ型仮想化技術「Docker」で生成されたコンテナ群に対して、開発・管理・運用を行うためのツールです。ITインフラのクラウド化が進む中で、コンテナ型仮想化技術の有用性は高まり続けています。特にアジャイル開発やマイクロサービス化の普及は、コンテナ型仮想化技術の地位向上に拍車をかけました。Kubernetesは、コンテナが持つ強みをさらに強化する技術として広く使われています。
Kubernetesの概要
現在のKubernetesはオープンソースソフトウェアですが、もともとはGoogle社が社内のITインフラを運用するために開発したツールでした。オープンソースソフトウェアとして世に出たのは2014年のことで、以降はコンテナ型仮想化技術の普及に伴って広く使われるようになりました。Kubernetesは、比較的規模の大きなシステムの運用に適したツールです。最も特徴的な機能である「コンテナオーケストレーション」は、複数のコンテナで構成された大規模システムの運用管理を大幅に効率化します。コンテナオーケストレーションを活用することで、複数のコンテナをきめ細かく管理しつつ、単一のシステムとして運用するための手間が減り、運用コストの低減や迅速なリソースの最適化などが期待できるでしょう。
Kubernetesの仕組み
Kubernetesをより深く理解するためには、コンテナに対する知識が欠かせません。そこでまずは、コンテナについて簡単に解説します。
コンテナとは、端的に言うと「他のプロセスから隔離され、独立した実行環境」です。コンテナの中には、OSやミドルウェア、アプリケーションが内包されています。以下は、コンテナを用いたシステムの簡易的な構成図です。グレーの部分がコンテナを表しています。
引用:Kubernets
コンテナは本来、Linuxカーネルが持つ「コンテナ機能」を用いた技術です。コンテナ機能では、独立したシステムリソースとユニークな名称、独自の設定を持つ隔離環境を作ることができます。
コンテナは従来型の仮想化技術とは異なり、ひとつの環境の中で複数のOSを実行できるという特徴があります。たとえば、あるコンテナではWindowsを、別のコンテナではLinuxを実行し、これらをまとめて単一のシステムとして運用することが可能です。しかし、コンテナ自体はネットワークやストレージの連携機能を持っていません。また、その数に比例して運用管理の手間が増えるという弱点があります。具体的には、あるコンテナが負荷でダウンした場合に別のコンテナが即座に代替するという動きは、コンテナのみでは実現しにくいものです。この点を解決するのがKubernetesをはじめとしたコンテナオーケスオレーションツールなのです。
kubernetesは、「Pod」という機能によって複数のコンテナをまとめて管理します。さらにPodをまとめて「Node」を構成し、最も大きな単位である「クラスタ(Cluster)」として管理することも可能です。大規模なシステムになればなるほど、PodやNodeが増えていくためkubernetesの重要性も増していきます。
Kubernetesの機能
では、もう少し具体的にKubernetesの機能について見ていきましょう。
Kubernetes Pod
複数のコンテナをまとめて、1つの単位として扱う機能です。PodはKubernetesにおける最小単位で、1個以上のコンテナを含みます。また、Kubernetesが公表しているコンテナ構成のパターン(デザインパターン)でPodを構築することも可能です。さらにPodは1つのNodeに割り当てられます。
Node(ノード)
Nodeは一般的に「実行環境」や「実行マシン」と呼ばれる単位です。1個以上のPodで構成され、それぞれ異なった役割を持たせることができます。Nodeはさらに、何らかの処理を実行する「ワーカーノード」と、ワーカーノードを管理する「マスターノード」に分類されます。このワーカーノードとマスターノードをまとめたものがCluster(クラスタ)です。
Kubernetes Cluster(クラスタリング機能)
Kubernetes Clusterは、複数のノードを管理するための機能です。いわゆるクラスタリング機能であり、コンテナオーケストレーションツールであるKubernetesの中核的な機能と言えるでしょう。Kubernetes Clusterでは、物理/仮想やクラウド/オンプレミスなど、異なる方法論で作られたシステムをまたいでコンテナを管理できます。また、従来型の仮想環境のように特定のOSに依存せず、多種多様な構成をクラスタリングすることが可能です。オンプレミスとクラウドを併用するハイブリッドクラウド環境などで重宝するでしょう。
プラットフォームや地域を跨ぐクラスタの管理機能(Kubernetes Federation)
耐障害性や信頼性向上・BCP対策としてクラスタを複数に分けることがあります。このとき役立つのが複数のクラスタをまとめて管理する機能「Kubernetes Federation」です。Kubernetes Federationでは、プラットフォームや地域(リージョン)が異なるクラスタを一括で管理できるため、マルチクラウド環境との親和性が高いと言えるでしょう。
負荷分散やサービス検出機能
KubernetesにはPodをサポートするために「Service」という機能が含まれています。Serviceは、Podに対して負荷分散(ロードバランシング)やサービス検出(サービスディスカバリ)を提供し、システム全体の安定性を高めます。サービス検出では、サービス(アプリケーション)が持つ複数の情報(IPアドレス、使用ポート番号、ホスト名など)をリアルタイムで検出します。この機能を活用することで、どのサービスに負荷がかかっているかを検知し、負荷分散の適正化を進めることができます。
Node調節機能(Cluster Auto Scaling)
Kubernetesには大きく2つのオートスケール機能が搭載されています。その1つがCluster Auto Scalingです。Cluster Auto Scalingでは、Podがスケジュールできない状態に陥った場合にAPIを通じて指示を出し、Nodeを追加します。また、高負荷状態の解消などでNodeが過剰になった場合は、Nodeの数を減らします。
Pod調節機能(Pod Autoscaler)
Pod Autoscaler は、CPU使用率に応じて自動的にPodの数を調節します。Pod AutoscalerにはHorizontal Pod Autoscaler(水平オートスケール機能)とVertical Pod Autoscaler(垂直オートスケール機能)の2つが用意されています。
Horizontal Pod Autoscalerは、CPUやメモリなどの使用率を監視し、しきい値に応じてPodの数を調節します。これに対してVertical Pod Autoscalerは、しきい値に応じてPodが使用するCPUやメモリのリソース量を変更することができます。
セルフヒーリング機能
Kubernetesでは、Nodeが停止もしくは削除された場合、実行中のインスタンスが中断しないように、クラスタ内の別のNodeにある別のインスタンスと置き換える処理を行います。
ローリングアップデート機能
ローリングアップデートとは、アップデートの際にすべての機能を停止するのではなく、一部だけを順番にアップデートすることで、システムを停止させることなくアップデートを完了するための手法です。Kubernetesにもローリングアップデートが搭載されており、複数のPodを段階的にアップデートすることでダウンタイムの発生を防ぐことが可能です。
Kubernetesのメリットと課題
このような機能によってKubernetesは現代のシステム構築にさまざまなメリットを提供します。一方、実際の運用ではいくつかの課題も発生するようです。
Kubernetes活用時のメリット
Kubernetesを活用することのメリットとしては、以下が挙げられます。
- コンテナを多数生成する大規模環境の運用管理を効率化できる
- オープンソースソフトウェアであることから、特定のベンダーに依存しにくい環境を構築できる(ベンダーロックインに陥りにくい)
- 負荷分散、リソース配分など高度な状況判断を必要とされる操作を自動化できる
- アプリケーション開発と運用に必要な機能が網羅されており、管理が一元化できる
Kubernetes活用時に発生しがちな課題
また、課題としては主に以下4点が挙げられます。
サーバー管理が煩雑になりやすい
Kubernetesではマスターノードとワーカーノードのセット運用が基本であることから、システムあたりのサーバー台数が増えやすいという課題があります。また、クラスタ構成も複雑になりがちで、規模に応じて管理工数が肥大化しやすいことも課題です。
障害発生時にサポートが受けられない
Kubernetesはオープンソースソフトウェアだけに、手厚いサポートを提供する母体がありません。したがって、高負荷やアップグレードなどによって不具合が発生した場合も、自己責任で対応する必要があります。
セキュリティ対策
一般的なパッケージ製品やマネージドサービスのようにセキュリティ強度が保証されていないため、独自に対策を進める必要があるでしょう。
導入時の学習コストが高い
一般的にオープンソースソフトウェアを活用する場合は、仕様把握、新しい機能の調査、アップデート内容の理解など一定の学習コストがかかります。Kubernetesは比較的新しい技術であり、学習コストが高くなる傾向にあります。
Kubernetesの弱点を補うAzure Kubernetes Service
Kubernetes活用時の課題を解決する方法としては、Kubernetesを核としたマネージドサービスの活用が挙げられるでしょう。AzureでもマネージドKubernetesとして「Azure Kubernetes Service」を提供しています。
Azure Kubernetes Serviceとは
Azure Kubernetes Service は、クラウドプラットフォームであるAzureに組み込まれたKubernetes向けマネージドサービスです。Azure Kubernetes Service を活用することで、Kubernetesが持つメリットはそのままに、課題解決やリスク回避を進めることができます。
Azure Kubernetes Serviceを活用するメリット
開発、構築作業の高速化
Azure Kubernetes Serviceでは、Azureが持つリソースを活用することによりアプリケーション構築の高速化が可能です。Kubernetes単体運用時よりも使用可能なリソース・ツールが多いため、より簡素で高速なアプリケーション開発につながります。特にMicrosoft Visual StudioにはKubernetes用の拡張機能が用意されているため、効果を体感しやすいでしょう。クラスタ構築についても同様で、単体で使用するよりも簡素かつ迅速に作業を進められます。
セキュリティレベルを維持しやすい
zure Kubernetes Serviceは、Azure内に構築されるサービスです。そのため、Azureが持つ高いセキュリティレベルによって一定以上の安全性が確保されています。また、Azure ADやAzure Private Linkといった他のマネージドサービスとの連携も可能です。この連携によって、Iアクセス制御や通信の保護などをきめ細かく制御できるようになります。また、Azure Policy を使用して、コンプライアンス制御を施すことも可能です。Kubernetes単体での運用に比べて、容易にセキュリティレベルを向上させることができます。
クラウド移行のタイミングで導入しやすい
Azure Kubernetes Serviceはクラウド上で完結するサービスです。そのため、クラウド移行のタイミングでシステムに組み込みやすいという利点があります。
既存環境が活用しやすい
Windowsベースのシステムを運用している場合は、ユーザー基盤をAzure Active Directoryでそのまま引き継ぐことが可能です。
サポートを受けやすい
Azure Kubernetes ServiceはAzure内の機能として扱われるため、Microsoftからのサポートが受けられます。具体的には、API サーバーをはじめとしたKubernetes コンポーネントへの接続、データストアのバックアップ、各種コンポーネントへのカスタマイズに関する質問などが含まれます。
まとめ
今回は、コンテナオーケストレーションツール「Kubernetes」の概要やメリット、課題について解説しました。Kubernetesはコンテナオーケストレーションのデファクトスタンダードとして広く使用されています。その一方で、単体運用時にはセキュリティや障害対応に関する課題が少なくないようです。Azure Kubernetes Service は、こうした課題解決のきっかけや発生防止につながるため、導入を検討してみてはいかがでしょうか。