Google のコンテナ

アプリケーション開発とデプロイの新しいスタイル

無料トライアル ドキュメントを見る
Google 式

Gmail、YouTube から検索まで、Google ではあらゆるものがコンテナで実行されています。コンテナ化により、Google の開発チームは開発をスピードアップし、ソフトウェアを効率的にデプロイし、運営規模をこれまでにないほど拡大できました。Google は毎週 20 億以上のコンテナを起動しています。この 10 年間、Google は本番環境でのコンテナ化ワークロードの運用について試行錯誤を重ね、Linux カーネルへの cgroups の貢献に始まり、社内ツールから採用した設計を Kubernetes プロジェクトとしてオープンソース化したものまで、コミュニティとこの知識を共有してきました。この専門知識は Google Cloud Platform の中に組み込まれ、あらゆる規模のデベロッパーとお客様が最新のコンテナ イノベーションを簡単に入手できるようになっています。

コンテナ 101: コンテナの概要

コンテナは、アプリケーションをそれらが実際に実行される環境から抽象化して格納するための論理パッケージング メカニズムとして機能します。こうしてアプリケーションを切り離すことで、ターゲット環境がプライベート データセンター、パブリック クラウド、開発者個人のパソコンのどれであっても同じ方法で、コンテナベースのアプリケーションを簡単にデプロイできるようになります。コンテナ化の導入で、開発者と IT 運営チームの担当分野が明確に分離されます。つまり、開発者はアプリケーション ロジックと依存関係に集中し、IT 運営チームは特定のソフトウェア バージョンやアプリケーション固有の構成などのアプリケーション細部に煩わされることなく、デプロイと管理に集中できます。

仮想環境が提供するシステムとして、コンテナは仮想マシン(VM)と比較されることがよくあります。すでにご存じかもしれませんが、VM は Linux や Windows などのゲスト オペレーティング システムをホスト オペレーティング システム上で実行し、基盤となるハードウェアへの仮想アクセスを提供します。コンテナも仮想マシンと同様にライブラリや他の依存関係とアプリケーションをまとめてパッケージ化し、ソフトウェア サービスの実行用に独立した環境を提供します。ただし類似点はここまでで、コンテナは、以下の図に示すように、開発者と IT 運用チームがうまく連携できるように、多くのメリットを備えたさらに軽量なユニットが提供されます。

コンテナを選ぶ理由

コンテナでは、仮想マシン方式のようなハードウェア スタックの仮想化を行わず、オペレーティング システム レベルで仮想化して、複数のコンテナを OS カーネル上で直接実行します。そのため、コンテナは非常に軽量となります。OS カーネルを共有し、起動が非常に速く、OS 全体を起動する場合と比較してほんのわずかのメモリしか使用しません。

多くのコンテナ形式を利用できます。たとえば Docker は、Google Cloud Platform と Google Kubernetes Engine でサポートされる人気の高いオープンソースのコンテナ形式です。

サンドボックスを使う理由

開発者が明示的に関連付けない限り、コンテナはアプリケーション間を分離します。これはつまり、依存関係やリソースが競合することを心配する必要がないということです。開発者はサービスごとにリソースの制限を明示的に設定します。アプリケーションはホスト オペレーティング システムで直接実行されないので、セキュリティが一段と高まります。

一貫した環境

コンテナの利用で、開発者は他のアプリケーションから分離された予測可能な環境を作成できるようになります。コンテナには特定のバージョンのプログラミング言語ランタイムや他のソフトウェア ライブラリなど、アプリケーションで必要なソフトウェア依存関係も組み込むことができます。開発者の観点から見ると、アプリケーションが最終的にどこにデプロイされても、一貫性が保証されます。開発者と IT 運営チームがデバッグや複数の環境での差異の診断に時間を割く必要がなくなり、その分の時間をユーザーに新たな機能を提供するために使うことができ、生産性が向上します。開発環境とテスト環境での想定が本番環境でもそのまま当てはまるため、バグが減少します。

場所を選ばず実行

コンテナは、Linux、Windows、Mac オペレーティング システム、仮想マシン、ベアメタル、開発者のマシン、オンプレミスのデータセンター、そしてもちろんパブリック クラウドでも実行が可能で、開発とデプロイが非常に簡単になります。非常に人気が高い、コンテナの Docker イメージ形式がポータビリティを促進します。ソフトウェアを実行する場所がどこであっても、コンテナを使用できます。

分離

コンテナは CPU、メモリ、ストレージ、ネットワークの各リソースを OS レベルで仮想化します。これで、開発者に他のアプリケーションとは論理的に分離された OS のサンドボックス型ビューが提供されます。

  コンテナのメリット 仮想マシンのメリット
一貫したランタイム環境
アプリケーションのサンドボックス化
ディスク上のサイズが小さい  
オーバーヘッドが少ない  
コードからアプリケーションへ

コンテナの利用で、アプリケーションとその依存関係を、バージョン管理が可能な 1 つの簡潔なマニフェストにまとめることができます。これで、チームの開発者とクラスタ内のマシン間で、アプリケーションのレプリケーションが容易になります。

ソフトウェア ライブラリがコードの断片をパッケージ化する方法とまったく同じように、開発者はユーザー認証やセッション管理のようなロジックなしで、コンテナでアプリケーション全体をパッケージ化できます。オペレーティング システム、マシン、さらにコードそのものも抽象化されます。開発者による識別が必要なユニット全体がサービスベースのアーキテクチャと結合して非常に小さくなり、俊敏性と生産性の向上につながります。これで開発、テスト、デプロイ、アプリケーションの全体の管理がしやすくなります。

モノリシック アーキテクチャからサービスベースのアーキテクチャへ

コンテナはサービスベースのアーキテクチャに最も適しています。アプリケーションのあらゆる部分が関連し合うモノリシック アーキテクチャとは異なり、IO、データ処理、レンダリングに至るまで、サービスベースのアーキテクチャはこれらを別々のコンポーネントに分離します。サービスベースで分割して区分すると、他のサービスで障害が発生しても、自分のサービスは実行し続けることができます。これでアプリケーション全体の信頼性が高まります。

コンポーネント化を利用しても、開発が加速化し、信頼性が高まります。コードベースが小さく保守が容易で、サービスが分離されているため、特定の入力に対する出力を簡単にテストできます。

各コンテナのヘルスチェックを実行し、それぞれのサービスを特定のリソースに制限し、起動と停止をコンテナ単位で独立して行うことができるため、コンテナはサービスベースのアプリケーションに最適です。

コンテナではコードが抽象化されるため、個々のサービスをブラック ボックスとして処理することが可能で、開発者の注意が必要な範囲がさらに少なくなります。開発者が別のサービスに依存するサービスを使用している場合は、適切な環境の設定や、事前のトラブルシューティングに時間を使わずに、その特定のサービス用のコンテナを簡単に起動できます。

Kubernetes: 本番環境レベルのコンテナ オーケストレーション

Google は社内クラスタ管理システムの Borg で大きな成功を収め、ここから得た教訓をオープンソース プロジェクト Kubernetes に生かし、お客様に Google の数十年にわたる経験を提供しています。Kubernetes は「k8s」とも呼ばれ、自動コンテナ オーケストレーション機能(デベロッパーに代わりマシンとサービスを管理する)を提供します。これで、信頼性を向上させ、DevOps に費やす時間と資源を削減しながら、こうした作業に関連する負荷も軽減します。

Kubernetes を利用すると、アプリケーションのデプロイと管理に関連するすべてが容易になります。Kubernetes はロールアウトとロールバックを自動化し、サービスの健全性をモニタリングして、サービスに問題が発生する前に不良ロールアウトを回避します。サービスに対して継続的にヘルスチェックも実行し、障害のあるコンテナまたは停滞しているコンテナを再起動します。正常に再起動したことが確認できた場合のみ、クライアントにサービスをアドバタイズします。さらに、Kubernetes はサービスの利用状況に基づいてそのスケールを自動的に調整し、必要な分だけ、必要なときに実行します。Kubernetes もコンテナと同様にクラスタを宣言的に管理するので、設定がバージョン管理され、レプリケーションも容易になります。

Kubernetes の特長
  • ロールアウトとロールバックを自動化
  • サービスの健全性をモニタリング
  • サービスの自動スケーリング
  • 宣言的管理
  • ハイブリッド デプロイを含め、任意の場所でのデプロイが可能

Kubernetes はどんなところでも使用できるように構築されているという点が最も重要な特長と言えるでしょう。この特長により、オンサイト デプロイ、パブリック クラウド、ハイブリッド デプロイにまたがるオーケストレーションが可能になります。これでデベロッパーのインフラストラクチャがユーザーの場所まで到達し、アプリケーションの可用性がさらに高まります。さらに企業が抱えるセキュリティとコストの問題のバランスが良くなり、具体的なニーズにすべて対応できるようになります。

クラスタを Google で

Kubernetes は Google Cloud Platform で実行することをおすすめします。Google Kubernetes Engine はプレミア マネージド Kubernetes ソリューションで、設定と本番環境対応を迅速に行います。

Kubernetes Engine は Google の担当エンジニアによって完全に管理されるため、クラスタの可用性が確保され、常に最新の状態に保たれます。Stackdriver によるモニタリング、診断、ロギング、ID とアクセスの管理、Google が誇る業界最高水準のネットワーキング インフラストラクチャなどのすべての GCP サービスとシームレスに統合されます。

Kubernetes Engine の特長
  • マネージド オープンソース Kubernetes
  • 99.5% SLA、統合型マルチゾーン デプロイによる高い可用性
  • 他の GCP サービスのシームレスな統合
  • 業界屈指の価格性能比
  • オンプレミス クラスタまたは他のクラウド プロバイダとの柔軟な相互運用が可能
  • Google レベルのマネージド インフラストラクチャ

Google はさまざまなオプションを提供しています。Google Cloud Platform では、さまざまな方法でコンテナを実行できます。Google App Engine フレキシブル環境によるフルマネージドのサービスとしてのプラットフォーム(Platform as a Service)、Kubernetes Engine によるクラスタ管理、世界クラスの価格性能比を誇る Google Compute Engine 上の自分でローリングするインフラストラクチャの中から、Google Cloud Platform でコンテナを実行する理想的なソリューションが見つかります。

完結したコンテナ ソリューション

進化はさらに続きます。Google Cloud Platform は、開発環境から本番環境まで、コンテナの利用に必要なツールを提供します。Cloud BuildContainer Registry は、Google の高度なセキュリティ基準と、世界トップレベルのネットワークでサポートされる Docker イメージ ストレージおよび管理機能を提供します。Google の Container-Optimized OS は、Docker ランタイムと Kubernetes ランタイムがプリインストールされた、軽量で安全なオペレーティング システムを提供します。コンテナ管理のすべてを GCP で行うことができます。

「10 年にわたりコンテナ管理システムの構築に携わってきた経験から、たくさんの教訓を得ることができました。この教訓を Google 最新のコンテナ管理システムである Kubernetes に生かしています。最終的にはコンテナの機能を利用し、プログラマの生産性を大幅に向上させ、手動および自動システム管理を容易にすることを目指しています。」

Google, Inc