DevOpsは、アプリケーションを開発して公開し、サポートからのフィードバックを反映していく方法として主流になりつつあります。しかし、DevOpsを成功に導くには、組織面での複雑さやマシンデータの収集といった課題を克服する必要があります。
公開日:2022年9月9日
コンテナオーケストレーションとは、自動化を使用してコンテナを管理するプロセスです。これにより、組織はコンテナやホストのデプロイ、管理、スケーリング、ネットワーキングを自動的に行えるため、エンジニアはこれらのプロセスを手動で行う必要がなくなります。
ソフトウェア開発がモノリシックアプリケーションから進化し、新しいアプリケーションの開発や古いアプリケーションの移行の際は、コンテナが選択肢となっています。コンテナは、ターゲット環境に関係なく、簡単に作成し、すばやくデプロイできるため人気があります。1つの小さなアプリケーションが数十個のコンテナで構成されることもあれば、企業によってはアプリケーションやサービス全体で数千個のコンテナがデプロイされる場合もあります。
コンテナの数が多いほど、それを管理するために多くの時間とリソースを費やす必要があります。コンテナが25個ある場合、手動でアップグレードすることもできますが、それにはかなりの時間がかかるでしょう。コンテナオーケストレーションでは、このような重要なライフサイクル管理作業を、人間がほとんど介入することなく瞬時に実行できます。コンテナオーケストレーションは、多くの場合、SOAR (セキュリティのオーケストレーションと自動化によるレスポンス)に対する組織のアプローチにおいて重要な役割を果たします。
この記事では、コンテナオーケストレーションの概念とその仕組みを説明し、オーケストレーションの一般的なユースケースを示します。さらに、代表的なコンテナオーケストレーションプラットフォームとツールをご紹介し、導入方法に関するガイダンスも提供します。
「オーケストレーション」の意味は?
オーケストレーションとは、アプリケーションインフラの一部として連携して機能する複数のコンテナを管理するプロセスを意味します。ちょうど編曲家が、楽曲の演奏のために、全体が調和するように楽器の割り当てと編成を行うように、コンテナオーケストレーターは、コンテナベースのアプリケーションが正しくスムーズに動作するように、構成、デプロイ、スケーリングを調整します。
コンテナオーケストレーションの仕組みは?
コンテナオーケストレーションとは、基本的には、コンテナのライフサイクルや、環境のコンテナ化を管理することです。一般に、コンテナのライフサイクルは従来のソフトウェア開発における構築、デプロイ、実行のフェーズに従いますが、具体的なステップは使用するコンテナオーケストレーションのツールによって多少異なる場合があります。典型的なライフサイクルは次のようになります。
- 構築:この最初のステップでは、開発者が選択した機能を利用してアプリケーションを構築する方法を決定します。
- 取得:次のステップでは、コンテナ化アプリケーションが、通常はパブリックまたはプライベートのコンテナイメージリポジトリから取得されます。開発者は1つのアプリケーションのベースイメージから始めて、その上に別のアプリケーションのレイヤーを配置することで機能を拡張します。このように複数のソースの既存コードを使用する手法は、すべてをゼロから作成するよりも効率的で生産的ですが、一方でさまざまなイメージ間の相互依存性を追跡しなければならないという課題も生じます。
- デプロイ:これには、テストしたアプリケーションを本番環境に配置して統合するというプロセスが含まれます。
- 維持:このステップでは、開発者が継続的にアプリケーションを監視し、正しく動作していることを確認します。適切な状態から逸脱したりエラーが起きたりした場合は、問題を理解して修正を試みます。
コンテナオーケストレーションのライフサイクルとは環境のコンテナ化を管理することである
コンテナオーケストレーションにより、組織はライフサイクルプロセスを合理化して大規模に管理できます。また、開発者はコンテナオーケストレーションツールを利用して、コンテナ化アプリケーションのデプロイやスケーリングに必要な多くのタスクを自動化することもできます。
オーケストレーションプロセスを開始するために、開発者チームは設定ファイルを作成します。このファイルには、アプリケーションの設定が記述されており、コンテナイメージの検索や構築を行う場所、ストレージボリュームのマウント方法、コンテナログやその他の重要な情報を保存する場所が定義されています。設定ファイルはバージョン管理を行う必要があります。これにより、管理者は本番環境にプッシュする前に、異なる開発環境やテスト環境に同じアプリケーションをデプロイできます。
その後、設定ファイルがコンテナオーケストレーションツールに渡され、デプロイがスケジュールされます。コンテナをクラスターにデプロイする際に、ツールはCPUや利用可能なメモリーなど、設定ファイルに定義されたリソース基準に基づいて、コンテナの配置に適したホスト(またはホストの集合)を選択します。
コンテナの実行後は、コンテナオーケストレーターがコンテナのライフサイクルを監視して管理します。コンテナの設定と一致しないものがある場合やエラーが発生した場合は、ツールが自動的に修正とコンテナの復元を試みます。
コンテナオーケストレーションの用途は?
コンテナオーケストレーションは、コンテナのライフサイクル全体にわたってタスクを自動化して管理するために使用されます。これには、以下のものが含まれます。
- 設定とスケジューリング
- プロビジョニングとデプロイ
- 健全性の監視
- リソースの割り当て
- 冗長性と可用性
- 更新とアップグレード
- コンテナのスケーリングや削除によるインフラ全体のワークロードの分散
- ホスト間のコンテナの移動
- ロードバランシングとトラフィックルーティング
- コンテナの相互作用の保護
コンテナオーケストレーションの大きなメリットの1つは、コンテナを実行できるあらゆる環境に実装できるという点です。オンプレミスサーバーはもちろん、アマゾン ウェブ サービス (AWS)、Microsoft Azure、Google Cloud Platformなどを実行しているパブリッククラウド、プライベートクラウド、マルチクラウドにも実装できます。
コンテナオーケストレーションが重要な理由とは?
コンテナオーケストレーションが重要なのは、本番環境における複雑なコンテナ管理を合理化できるからです。マイクロサービスアーキテクチャアプリケーションでは、パブリッククラウドやオンプレミスサーバーの内外で数千個のコンテナを実行しなければならないこともあります。これが企業のすべてのアプリケーションやサービスに及ぶと、コンテナオーケストレーションプロセスなしでシステム全体を手動で管理するのは、超人的な努力をもってしてもほぼ不可能になります。
コンテナオーケストレーションを利用すれば、このような複雑な環境がはるかに管理しやすくなります。コンテナのデプロイ、スケーリング、保護に必要な手作業が最小限に抑えられ、速度、俊敏性、効率が向上します。そのため、DevOpsチームにとって非常に有用であり、CI/CDワークフローにも簡単に統合できます。
大規模なコンテナオーケストレーションが必要な理由とは?
コンテナオーケストレーションは複雑なコンテナライフサイクルを効果的に管理するために必要であり、通常は大量のコンテナの管理に利用されます。5~6個のコンテナに1つのアプリケーションがデプロイされているのであれば、実行も管理もそれほど複雑にはならず、手間もかかりません。しかし、企業のほとんどのアプリケーションは数千個のコンテナで実行されており、管理は飛躍的に複雑になっています。このような大仕事を手動で行うための時間とリソースのある企業は、あったとしてもごくわずかでしょう。
コンテナオーケストレーションは、大規模で動的な環境でコンテナを管理するためには欠かせません。コンテナライフサイクルでは、プロビジョニングとデプロイ、コンテナ間のリソースの割り当て、ホスト間のコンテナのスケーリングと移動、ロードバランシング、コンテナの健全性の監視など、数多くの作業が必要になります。
コンテナオーケストレーションにより、これらのタスクが自動化され、正確かつ迅速に実行されるようになるため、開発チームがより効率的にリソースを使用できるようになります。
コンテナオーケストレーションのメリットは?
コンテナオーケストレーションは、開発者と管理者に多くのメリットをもたらします。たとえば、以下のようなものがあります。
- 生産性の向上:コンテナオーケストレーションツールを利用すると、システム内の各コンテナを個別にインストールして管理する必要がなくなるので、エラーが減り、開発チームはアプリケーションの改善に集中できるようになります。
- 迅速なデプロイ:コンテナオーケストレーションツールにより、コンテナのデプロイが簡単になります。トラフィックの増加に対応するために、新しいコンテナ化アプリケーションを必要に応じてすばやく構築できます。
- コストの削減:コンテナの最大のメリットの1つは、従来の仮想マシンと比べてオーバーヘッドを低く抑えることができ、使用するリソースも少ないことです。
- 強固なセキュリティ:コンテナオーケストレーションツールを使用すると、ユーザーはリソースをより安全に共有できます。また、コンテナはアプリケーションプロセスを分離するため、全体的なセキュリティも向上します。(コンテナセキュリティについて詳しくは、こちらの記事をご覧ください。)
- スケーリングが容易:コンテナオーケストレーションツールを使用すると、1つのコマンドでアプリケーションをスケーリングできます。
- 迅速なエラー回復:コンテナオーケストレーションプラットフォームは、インフラ障害などの問題を検出し、自動的に回避できるため、高可用性を維持し、アプリケーションのアップタイムを向上させるのに役立ちます。
コンテナオーケストレーションには、ビジネス目標の達成や収益性の向上に役立つさまざまなメリットがあります。
コンテナオーケストレーションツールとプラットフォームの代表例は?
コンテナオーケストレーションは、それ自体はアイデアでしかありません。アイデアを実現するためには、コンテナオーケストレーションツールが必要です。このツールがコンテナの作成、デプロイ、スケーリングを行うためのフレームワークを提供します。ここでは、代表的なツールをいくつかご紹介します。
- Kubernetes:Google社が開発し、Cloud Native Computing Foundationが管理しているオープンソースプラットフォームのKubernetes (Google Kubernetesとも呼ばれる)は、一時はオープンソースソフトウェア史上最も急成長したプロジェクトであり、デファクトスタンダードとなりました。Kubernetesは、デプロイ、ロールアウト、ストレージのプロビジョニング、ロードバランシング、スケーリング、サービスディスカバリー、「自己修復」(障害が発生したコンテナの再起動、置換、削除を行う機能)など、数多くのコンテナ管理タスクを自動化します。幅広い機能を備え、オープンソースサポートツールのエコシステムも拡大していることから、Kubernetesは主要なクラウドプロバイダーに広くサポートされており、その多くは現在、フルマネージド型のKubernetesサービスを提供しています。
- Mesos Marathon:Marathonは、カリフォルニア大学バークレー校によって開発されたオープンソースのクラスターマネージャーであるApache Mesosのフレームワークです。管理および監視タスクの大部分を自動化することでコンテナインフラをスケーリングできるのはKubernetesやDocker Swarmと同様ですが、そのどちらよりも古くから使用されています。
- Amazon ECS:Amazon Elastic Container Services (ECS)は、アマゾン ウェブ サービス (AWS)上でDockerコンテナのデプロイと管理を行い、コンテナ化アプリケーションを実行できる強力なコンテナオーケストレーションツールです。AWS IAM、Amazon CloudWatch、AWS CloudFormation、Amazon Virtual Private Cloud、Amazon Elastic Container Registry、AWS CloudTrail、AWS CodeStarなど、AWSのアプリケーションやサービスとシームレスに連携するため、すでにAWSを使用しているユーザーにとっては魅力的な選択肢となっています。ただし、Amazon ECSでオーケストレーションされたコンテナは、現在サードパーティのサポートを提供していないため、アマゾン ウェブ サービスEC2でのみ実行できます。
- Nomad:Dockerコンテナアプリケーションに特化して設計されたほとんどのコンテナオーケストレーターとは異なり、HashiCorpが無料で提供しているこのオープンソースのクラスター管理およびスケジューリングツールは、あらゆるオンプレミスインフラおよびクラウドで実行されるすべての主要オペレーティングシステム上の他のスタンドアロンアプリケーション、仮想化アプリケーション、コンテナ化アプリケーションもサポートしています。この柔軟性により、チームはほぼすべての種類とレベルのワークロードをサポートできます。
- Azure Kubernetes Service:Azure Container Serviceは、MicrosoftのクラウドコンピューティングサービスであるAzureのためのコンテナオーケストレーションソリューションです。アーキテクチャはApache Mesosをベースとしており、コンテナオーケストレーターはKubernetes、Docker Swarm、Mesosphere DCOS (Data Center Operating System)の3つから選択できます。これにより、アプリケーション設定とコンテナ管理のポータビリティが向上します。
- Docker Swarm:Docker Swarmもまた、オープンソースのコンテナオーケストレーションプラットフォームとして人気があります。Kubernetesと同様、コンテナ化アプリケーションのデプロイを自動化しますが、Docker Swarmはアプリケーションの構築とコンテナ化のためのテクノロジーであるDocker Engineとの連携に特化して設計されています。また、その他のDockerツールと簡単に統合できることから、すでにDocker環境で作業しているチームに人気の選択肢となっていますが、機能性、カスタマイズ性、拡張性はKubernetesよりも限られています。
コンテナオーケストレーション戦争とは?
「コンテナオーケストレーション戦争」とは、Kubernetes、Docker Swarm、Apache Mesosという3つのコンテナオーケストレーションツールが熾烈な競争を繰り広げた時期を指します。それぞれのプラットフォームには独自の強みがありますが、クラウド環境間の切り替えが複雑なため、標準化されたソリューションが必要でした。この「戦争」は、どのプラットフォームがコンテナ管理の業界標準となるかを競うものでした。
Docker SwarmとKubernetesがリリースされた2015年に最も広く普及していたコンテナ管理ツールはApache Mesosで、Twitter社、Verizon社、Yelp社などの有名企業が利用していました。Apache Mesosとそのコンポーネントフレームワークはコンテナオーケストレーションの実行だけでなく、幅広い機能を備えていたため、コンテナを管理するためだけに使用したい開発者にとっては、実装が複雑でした。一方、KubernetesとDocker Swarmが採用したのは、より焦点を絞った軽量なアプローチでした。
最終的には、主に堅牢なオープンソースコミュニティのおかげでKubernetesが勝者となりました。最近のCNCF調査によると、2020年には回答者の91%がKubernetesを使用しており、その83%は本番環境で使用していました。これは2018年の58%、および前年の78%から着実に増加し続けています。現在では、大手クラウドプロバイダーがそれぞれ独自のマネージドKubernetesサービスを提供しており、コンテナオーケストレーションプラットフォームとして明らかに優勢となっています。(Kubernetesがどのようにしてコンテナオーケストレーション戦争に勝利したかについては、Hacker Noonの記事をご覧ください。)
Kubernetesコンテナオーケストレーションとは?
Kubernetesコンテナオーケストレーションとは、コンテナライフサイクルを管理するためにKubernetesのオープンソースプラットフォームを使用することです。Kubernetesはコンテナを作成しませんが、プロセスを自動化してダウンタイムを最小限に抑えることでコンテナ管理を劇的に簡素化できるため、開発チームはアプリケーションの機能改善と新機能の開発に集中できます。その仕組みがわかるように、Kubernetesの基本コンポーネントとそれらの相互関係について説明します。
KubernetesのコアアーキテクチャであるKubernetesエンジンは階層構造になっており、独自の用語が使用されます。この記事では、プラットフォームのすべての用語はご紹介しませんが、Kubernetesがどのようにデプロイを構成するかを確認することで、Kubernetesによるコンテナオーケストレーションの仕組みを理解できます。Kubernetesの構成要素には以下のものがあります。
- Pod:デプロイ可能なKubernetesの最小単位であるPodは、1つまたは複数のコンテナをまとめてパッケージ化し、ノードにデプロイしたものです。同じPod内のコンテナは、ローカルのネットワークやその他のリソースを共有します。また、同じマシン上にある場合と同様に相互に通信できますが、他のPodから切り離された状態は維持されます。同時に、Podによって、ネットワークとストレージも基盤となるコンテナから切り離されます。
- ノード:1つまたは複数のPodを持つ単一の物理サーバーまたは仮想サーバーがノードです。ノードには、ワーカーノードとマスターノードの2種類があります。元々「ミニオン」(子分)と呼ばれていたワーカーノードは、マスターノードから割り当てられたタスクを受信して実行します。ワーカーノードには、リソースを管理してコンテナに割り当てるために必要なすべてのサービスが含まれています。ノードで障害が発生した場合、マスターノードはそのノードを複製することで介入でき、中断を最小限に抑えたり、機能しているノードに新しいPodをデプロイしたりできます。
- クラスター:マスターノードと複数のワーカーノードが1つになってクラスターを形成します。クラスターは、これらすべてのマシンを1つの強力なユニットとして統合します。その後、コンテナ化アプリケーションがクラスターにデプロイされ、クラスターのマスターノードが各ワーカーノードにワークロードを分散させます。また、ノードが追加または削除されたときは、それに応じてワークロードを分散させます。1つのKubernetesクラスターは、最大5,000個のノードと15万個のPodを含むようにスケーリングできます。複数のクラスターを使用することで、インフラとアプリケーションの各部分を論理的に分離できるため、ビジネスを可視化しやすくなります。
- Kubernetes API:Kubernetes APIは、クラスターの状態に関する情報を保存し、ユーザーがプラットフォームとやり取りする方法を制御します。ユーザーがクラスターの適切な状態に関する情報をAPIに入力すると、APIがその情報をマスターノードに送信します。その情報に基づいてマスターノードがワーカーノードにタスクを割り当て、アプリケーションを現在の状態から適切な状態へと移行させます。
Kubernetesは、オンプレミスサーバーにも、ハイブリッドクラウドやマルチクラウド環境などにも使用できます。複数のクラウドプロバイダーやサードパーティが、習得しやすいマネージドKubernetesサービスを提供しています。ただし、分離された開発/テスト環境でKubernetesを始める方が、より迅速かつコスト効率良く導入できるでしょう。
単一のコンテナを作成してデプロイするのは簡単ですが、複数のコンテナをデータベースやWebアプリケーションなどの大規模なアプリケーションに組み込むのは複雑なプロセスです。コンテナのデプロイ(アプリケーションごとに数百から数千のコンテナを1つの機能ユニットとして接続、管理、スケーリングすること)は自動化なしではまず実現不可能です。
実際、コンテナオーケストレーションツールが必要になるタイミングを見極める第一の基準は複雑さです。技術的には、アプリケーションが複数のコンテナを使用している場合は、オーケストレーションを検討するべきです。
もう1つの要因は、スケーリングの必要性です。Kubernetesのようなコンテナオーケストレーションツールは宣言型プログラミングをサポートしているため、システムの適切な状態を記述するだけで新しいコンテナを簡単に起動して負荷を分散できます。そのため、数秒で多くのアプリケーションインスタンスをデプロイしなければならない場合には、コンテナオーケストレーションが必須となります。
最後に、ソフトウェア開発にCI/CDを使用している場合は、コンテナオーケストレーションを検討する価値があります。リリースサイクルを短縮し、依存関係エラーを減らすことでアプリケーションの停止を防ぎ、より効率的なサーバー利用を実現することで、CI/CDの成果を最大限に高めることができます。コンテナオーケストレーションの業界標準はKubernetesであり、特にオーケストレーションを初めて利用する場合にはお勧めです。以下のセクションでは、導入方法をご紹介します。
コンテナオーケストレーションが必要になるタイミングは?
Kubernetesの概念と機能に慣れ親しむ最も簡単な方法は、とにかく使い始めることです。幸い、すぐに使い始められる方法がいくつかあります。
- Kubernetesディストリビューション:Kubernetesを自社のハードウェアや仮想マシン上で実行したい場合の最も簡単な方法は、パッケージ化されたKubernetesディストリビューションを使用することです。Red Hat OpenShift、Canonical Kubernetes、Mesosphere Kubernetes Serviceなどはその一例です。
- マネージドKubernetesサービス:Kubernetesは、AWS、Google Cloud Platform、Microsoft Azureなどの多くのクラウドプロバイダーが標準サービスとして提供しています。Kubernetesの動作はプロバイダーごとに多少異なりますが、どのサービスも環境内のKubernetesクラスターのデプロイを簡素化します。
- MiniKube:MiniKubeは、Kubernetesの開発チームが作成したシンプルなツールであり、任意の仮想化ホストにデプロイされた単一ノードのKubernetesクラスターを実行します。これは、Windows、Mac、またはLinuxコンピューター上でKubernetesをローカルに実行する簡単な方法です。
Kubernetesを実行したら、広く普及しているコンテナ化アプリケーションのデモを利用して、Kubernetesによるアプリケーションのデプロイ方法や実行方法を学ぶことができます。
ソフトウェア開発では、コンテナ化アプリケーションの数多くのメリットの活用が進んでおり、コンテナオーケストレーションの必要性はますます高まっています。コンテナオーケストレーションは、アプリケーションのデプロイ、管理、スケーリングの複雑さとコストを大幅に削減するため、開発者チームは顧客やビジネスに価値をもたらすアプリケーションの構築により多くの時間を費やすことができます。
DevOps 5つのプラクティス
DevOpsチームの明暗を分ける5つのプラクティスについてご紹介します。