Dockerで実現するゼロダウンタイムデプロイ

QCon New York 2015で,Paul Payne氏は,12分以内の修正と再デプロイを要件とするNordstormのプロジェクトについて講演を行った。それを可能にしたのはGoベースのマイクロサービスDockerコンテナ技術,そして継続的デリバリの方法論だ。

Ivy SoftworksのソフトウェアエンジニアであるPaul Payne氏は,講演の最初に,重要なクライアントであるNordstorm(訳注: 米国の高級デパート)での開発経験について説明した。計画されていたデモをサポートするため,稼働中のサービスの変更を12分以内に可能にする,というのが同社の要件だ。対象となるサービスは,GTINの在庫識別番号をRESTfulなインターフェース経由で受信し,その在庫品目を返す,というものだ。このGTINサービスはGTIN-12を受信するように設計されていたが,クライアントのシステムがGTIN-13のみをサポートしていたため,Nordstormのサービスで使用すると,在庫品目が不一致として返されてしまっていた。

GTINサービスのコードに必要な修正がごくわずかであった上に,サービスがGoベースのマイクロサービスとして開発され,ゼロダウンタイムの継続的デリバリアプローチを使ってDockerにデプロイされていたという事実のおかげで,チームはこの変更を,要求された時間枠内で運用に乗せることができた。

マイクロサービスとしてアプリケーションを開発したことは,チームにとって‘コードに対する自信’を与えてくれた,とPayne氏は言う。単一リポジトリの原則の採用,モジュール設計による構成,各サービス内への状態のカプセル化によって,コードの理解が容易になり,修正を短時間で行えるようになったのだ。これらの特性がサービス間の結合度を低減し,個別にデプロイ可能な機能を実現した。このようなマイクロサービス形式の構築を推奨する理由としては,他にも,堅牢性の原則(受信には寛容であれ,送信には厳格であれ),ツーリングによる迅速なビルドイテレーションの実現,テスト駆動開発(TDD)の利用などが挙げられる。

アプリケーションコンテナ技術が提供するパッケージングとデプロイメントのメリットは,Payne氏とそのチームにとって,修正したサービスを運用環境に迅速にデプロイする上でも大きな役割を果たしている。Dockerなどのアプリケーションコンテナは,仮想マシン(VM)に比較した場合,ハードウェアの有効利用というメリットがある。しかし最大のメリットとして氏が挙げるのは,‘ソフトウェアにとって適切な抽象化’が得られることだ。コンテナ技術は‘クリーンに組織化されたインターフェース’を促進し,開発者や運用担当者がそれぞれの専門領域に集中することを可能にする,と氏は主張する。

氏はゼロダウンタイムの継続的デプロイメントを実現するいくつかのパターンを挙げた上で,このセクションの始めに,Googleの ‘The Datacenter as a Computer’ という論文を紹介した。Googleは2003年,‘Borg’コンテナクラスタマネージャの開発によって,コンテナ技術の前身となった技術への投資を開始した。Payne氏は,Googleが“仮想マシンに関するメモを持っていなかったからだ”,とジョークを言いながら,同社がコンテナ技術に注力したことによって,アプリケーションのパッケージングとデプロイメントへのコンテナ利用という点で,多くの競合他社より早くイノベーションを実現できたことを指摘した。

マイクロサービスプラットフォームの基盤を提供しているのは,現在のクラスタマネージャやスケジューラである,とPayne氏は言う。Apache MesosMesosphere MarathonCoreOSのコンテナプラットフォーム,Kubernetes,Dockerテクノロジスイートといった技術はすべて,正しく利用さえすれば,アプリケーションの迅速なデプロイを支援してくれる。

Jez Humble氏やDave Farley氏の古典的な書籍である ‘Continuous Delivery’を引き合いに出しながら,Payne氏は,ブルーグリーンデプロイやカナリアデプロイ,ローリングデプロイといったデプロイメントアプローチを紹介した。HashicorpのVagrantの管理とfleetctlのコントロールの下でローカル実行されるCoreOSクライアントを使った,ゼロダウンタイムのアプリケーションデプロイメントのライブデモも行われた。デモでは,Vulcandで実装されたパブリック/プライベートのプロキシゲートウェイ,etcdで動作するプログラマティックなロードバランサ,Goベースのアプリケーションサービスを,Dockerイメージ内にパッケージしていた。

Payne氏は,継続的デリバリの実現する速度と柔軟性に関連した,組織文化の潜在的問題を管理する必要性について警告して,講演の結論とした (“ちょっと待て,運用環境にデプロイするのは早くないか?”)。その上で氏は,Terraformのように,マイクロサービスプラットフォームの迅速なプロビジョニングとコンフィギュレーションを可能にするための強固な基礎を提供する,‘インフラストラクチャ・アズ・コード’ ツーリングを提案した。さらに氏は,腐敗防止層(anti-corruption layer)に基づいたドメイン駆動設計(DDD)が,アプリケーションシステム内の高い凝縮度と低い結合度を維持する上で不可欠であることについても,例を挙げて説明している。

氏が最後に提案したのは‘構築して学ぶ’ことだ。HashicorpのVagrantのようなツーリングを利用すれば,ローカルマシン上に小さなVMクラスタを構築することができる。クラスタ管理ソフトウェアやマイクロサービスのツーリングを使って,低費用かつ低リスクな実験が可能だ。