Google のコンテナ

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

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

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

クラウド内に埋め込まれた、コンテナを搭載した貨物船。背景でクジラが泳いでいる。
コンテナ 101: コンテナの概要

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

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

仮想マシンとコンテナの図。
仮想マシンには、アプリ、Bin/Libs、ゲスト OS、ハイパーバイザ、ホスト オペレーティング システム、インフラストラクチャの各ユニットが含まれています。ここでは視覚化のために、これらのユニットを上から順に重ね合わせています。コンテナには、アプリ、Bin/Libs、コンテナ ランタイム、ホスト オペレーティング システム、インフラストラクチャの各ユニットが含まれています。ここでは視覚化のために、これらのユニットを上から順に重ね合わせています。
コンテナを選ぶ理由

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

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

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

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

一貫した環境

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

場所を選ばず実行

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

分離

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

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

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

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

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

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

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

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

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

Google Cloud でコンテナを実行する方法のトップ 3 をご覧ください。

コンテナ オーケストレーション ソリューションには Google Kubernetes Engine、完全なサーバーレス アプローチには Cloud Run、仮想マシンを使用するだけなら Compute Engine がおすすめです。

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

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

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

Kubernetes の特長
  • 自動化されたロールアウトとロールバック
  • サービス正常性のモニタリング
  • サービスの自動スケーリング
  • 宣言型管理
  • どこでもデプロイ(ハイブリッド デプロイを含む)

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

Kubernetes ハイブリッド クラウド: アプリは Kubernetes 上で実行され、他のクラウドや GCP、お使いのデータセンターにデプロイできます。
クラスタを 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 Cloud Run を使用するフルマネージド環境、Kubernetes Engine によるクラスタ管理、ワールドクラスの価格性能比を誇る Google Compute Engine 上の自己展開インフラストラクチャといった選択肢の中から、Google Cloud Platform でコンテナを実行する最適なソリューションを見つけることができます。

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

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

ビルド: Container Builder、保存: Container Registry、実行: Container-Optimized OS、オーケストレーション: Kubernetes Engine

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

- 「Borg、Omega、Kubernetes: 3 つのコンテナ管理システムから 10 年間に学んだ教訓」、Google LLC、2016 年