開発・運用方法やビジネスニーズの変化で注目されるコンテナ

コンテナ(container)」とは、アプリケーションを効率的に実行するための仮想化技術のひとつです。

もともとコンピュータでアプリケーションを実行するには、各マシンのOSに合ったバージョンのソフトウェアをそれぞれインストールする必要がありました。仮想化技術は1つのハードウェア上に複数環境の動作を実現します。ただし従来の仮想化では、各仮想環境に必要なものはOSレベルから仮想化していました。

コンテナではOS周りの環境は共有し、アプリケーションとその動作に必要なライブラリ、設定ファイルをそれぞれのパッケージにまとめて(コンテナ化して)管理しています。OSの共有により、コンテナでは従来と比べて、より効率的にリソースを利用しながら独立した仮想環境を実現します。また、プロセスなどの起動も従来の仮想環境より高速に行えるというメリットもあります。

コンテナ技術が注目される背景には、ソフトウェア開発・運用方法の進化やテクノロジーの進歩、ビジネスニーズの変化があります。

ビジネス環境の急速な変化に対応するためには、ソフトウェアのより迅速な開発と頻繁なリリースが求められます。コンテナ技術は、開発からリリースまでの高速化と環境の一貫性を実現。開発と運用の統合(DevOps)が進む中、開発者がローカルで作成した環境を運用環境へ移行することも容易にします。

さらに近年、従来の大きな1つのモジュールで構成されたモノシリックなアプリケーションから、マイクロサービス(小さな独立した機能単位のサービスで構成されるアーキテクチャ)への移行が進んでいますが、これもコンテナ技術の採用を促しています。疎結合された多数のマイクロサービスを実行する環境として、それぞれを独立させてデプロイ(deploy、アプリケーションの機能やサービスをサーバー上に配置・展開し、利用可能な状態にすること)できるコンテナは理想的です。

アプリケーションがさまざまな環境で動作するクラウドコンピューティングの台頭も、コンテナが必要とされるようになった要因のひとつです。コンテナは、クラウド環境間のアプリケーションの移動とデプロイのハードルを下げるからです。

コンテナにはセキュリティや運用管理の複雑化という課題も

このようにコンテナには、デプロイのスピードやワークフローの効率化、リソースの有効活用などの点でメリットがあります。一方で、セキュリティや運用管理の複雑さなどの面でデメリットもあります。

コンテナ技術ではホストOSを共有します。各コンテナで異なるOSを同時に実行することはできません。また複数のコンテナが同一ホスト上で動作するため、脆弱(ぜいじゃく)性があるとシステム全体が影響を受ける可能性があります。セキュリティ対策が不十分な場合は、コンテナをターゲットとしたサイバー攻撃のリスクが高まります。

また、コンテナは軽量である一方で、多数のコンテナが同時に動作するとシステムリソースに負荷をかける場合があります。特定の性能が高く要求されるアプリケーションでは、パフォーマンスが低下することもあります。

もうひとつ大きな課題として、運用や管理の複雑さがあります。アプリケーションごとにシステムを細かく分割できるコンテナは、運用が複雑になりやすいのです。特に大規模なコンテナ環境では、コンテナの[オーケストレーション]](複数コンテナの効率的な運用管理と自動化)や監視、ロギングなどに、適切なツールやスキルが必要とされます。

コンテナの構築を簡単かつ一貫して行えるツールとして、コンテナエンジンのデファクトスタンダードとされるオープンソースソフトウェアの「Docker」があります。Dockerイメージはバージョン管理ができ、過去のバージョンへ戻すことや、同じ設定での再現が可能。「Docker Hub」と呼ばれる[レジストリ
から、公開されているDockerイメージをダウンロードして、迅速に環境を構築することもできます。

ただ、Docekrには複数のコンテナを管理する機能はありません。そこでコンテナ運用・管理の複雑さを軽減するツールとして利用が広がっているのが、グーグルで開発されたコンテナオーケストレーションプラットフォームの「クーバネティス(Kubernetes)」です。

コンテナ管理・運用を効率化・自動化するクーバネティス

Kとsの間の8文字を省略して「K8s」と記されることもあるクーバネティス(Kubernetes)。現在はオープンソースソフトウェアとして提供されています。コンテナ化されたアプリケーションのデプロイメント、スケーリング、管理を自動化できるクーバネティスにより、大規模なコンテナ環境も効率的に管理できます。

トラフィックの増減に応じてクーバネティスは、コンテナを自動的にスケーリング。負荷に応じてコンテナの数を増減させ、過負荷やリソースの無駄使いを防ぎ、リソースの効率的な利用を実現します。またCPUやメモリなど、コンテナに必要なリソースを適切に割り当てることで、性能の最適化を図ります。

コンテナに問題が発生した場合、クーバネティスは自動的に再起動し、異常なコンテナを置き換えます。これにより、アプリケーションの可用性と信頼性が向上します。またアプリケーションのバージョン管理を行い、「ローリングアップデート」を実行。サービスの中断を最小限に抑えながら、新しいバージョンへの切り替えを可能とします。

オープンソース化されているクーバネティスには、監視やロギングといった機能を拡張するさまざまなツールも用意されています。さらにGoogleの「Google Kubernetes Engine(GKE)」やMicrosoftの「Azure Kubernetes Service(AKS)」、Amazonの「Amazon Elastic Kubernetes Service(Amazon EKS)」など、主要なクラウドベンダーがクーバネティスのサービスを提供。各社のクラウドサービスとの連携や管理がしやすい環境が用意されています。

そんなクーバネティスにも課題はあります。機能が豊富であるがゆえに設定が複雑で、特に初めてクーバネティスを利用する組織や担当者にとっては、学習に時間がかかります。運用と保守にも専門知識が必要で、クーバネティスのクラスター(複数のコンピュータの集合体)の監視やアップグレード、セキュリティ対策などにおいて、継続的な管理が求められます。

また、特に大規模なクラスターや複雑なアプリケーションを運用する場合は、クラスターの管理・監視やコンテナ間ネットワーク通信の管理などでCPUやメモリ、ストレージなどのリソース要件が増え、コストや管理の手間も増加します。

クーバネティスは非常に強力なツールで導入メリットも大きいのですが、その運用や設定にあたっては、これらの課題を認識しておく必要があるでしょう。

コンテナとクーバネティスの代表的なユースケースと活用例

コンテナとクーバネティスは具体的にどのように利用されているのでしょうか。以下は代表的なユースケースです。

・マイクロサービスアーキテクチャ
システムの柔軟性向上、新機能の迅速な導入やスケーリングが可能

・CI/CDパイプライン
継続的なコード統合とアプリケーション提供でソフトウェア開発プロセスを自動化するツール(CI/CDパイプライン)において、負荷に応じてリソースを自動的にスケールさせることが可能

・クラウドネイティブアプリケーションの運用
Google Cloud、AWS、Azureなどのクラウドサービスを利用するアプリケーションがクラウドリソースをより効率的に活用することで、地理的分散や高可用性を実現

・IoTデバイスの管理
デバイスの状態監視やアップデートを効率的に実施できる

・ビッグデータ、機械学習
データ分析や機械学習のワークロードにおいて、リソースの柔軟な管理と効率的なスケーリングを実現

実際の活用例も見てみましょう。

オーディオストリーミングのSpotifyは、早くからコンテナ技術とマイクロサービスを取り入れていましたが、コンテナオーケストレーションには自社開発システムを使っていました。しかしオープンソースコミュニティで支持されているクーバネティスを採用したことで、自社サービスの機能の開発や改善に集中できる時間が増加。新機能の稼働までの時間短縮やCPU使用率の効率化にもつながったといいます。

またフリマアプリのメルカリは、米国版アプリの刷新にあたり、今後のサービス拡張にも備えてマイクロサービス化を図りました。その際にクーバネティスを導入し、開発効率を向上させています。

デンソーはコネクテッドカー時代に合わせた車両エッジ・車両クラウド製品の開発に取り組むため、クラウドネイティブのエコシステムを活用。オーケストレーションにはクーバネティスを採用し、環境の統一、保守運用の簡素化により、ソフトウェアの開発サイクルを高速化しています。

コンテナとクーバネティスは、企業・組織における高速で柔軟な開発、効率的なインフラ管理を可能にします。データとアプリケーションの活用が最適化され、企業・組織のデジタルトランスフォーメーション(DX)が加速すれば、迅速なイノベーションや市場への素早い適応も期待できるでしょう。

著者プロフィール

ムコハタワカコ(むこはた わかこ)

書店員からIT系出版社営業、Webディレクターを経て、編集・ライティング業へ。ITスタートアップのプロダクト紹介や経営者インタビューを中心に執筆活動を行う。派手さはなくても鈍く光る、画期的なBtoBクラウドサービスが大好き。うつ病サバイバーとして、同じような経験を持つ起業家の話に注目している。