コンテンツに移動
アプリケーション モダナイゼーション

Ninja Van: クラウド コンテナ プラットフォームでコア アプリケーションに柔軟性、安定性、スケーラビリティを提供

2024年5月1日
Google Cloud Japan Team

※この投稿は米国時間 2024 年 4 月 23 日に、Google Cloud blog に投稿されたものの抄訳です。

Ninja Van のビジネスにとって、安定したスケーラブルな環境でアプリケーションを実行できることは不可欠です。当社は、テクノロジーを活用して東南アジア全域で速達サービスを展開する、急成長中の物流企業です。過去 12 か月間に、200 万近くの企業と提携して 1 日あたり約 200 万個の小包をお客様に配達しており、配達に携わる作業員や従業員は 40,000 人を超えています。

当社は Google Cloud を以前から利用しており、今後も Google Cloud と緊密に連携して、サプライ チェーン管理やラスト ワンマイル宅配サービスなど、新しいサービスや新市場へと事業を拡大していきます。

安全かつ安定したコンテナ プラットフォームの導入

当社は、コアビジネスを可能にするアプリケーションとマイクロサービス アーキテクチャを実行するために、安全かつ安定したコンテナ プラットフォームをデプロイすることを選択しました。当社はコンテナ化をいち早く取り入れており、最初はカスタム スケジューラであるフリートを使用して CoreOS でコンテナ ワークロードを実行していました。オープンソース コミュニティの活動を観察していると、Kubernetes が勢いを増し続け、ますます人気が高まっていることがはっきりと見て取れました。当社は、独自の Kubernetes クラスタと API サーバーを実行することにし、その後、コントロール プレーンとワーカーノードの両方で構成された、多数の Compute Engine 仮想マシンをデプロイしました。

Kubernetes について詳しく調べているうちに、当社が行っていた多くのことが、Kubernetes のコア機能にすでに組み込まれていることがわかりました。サービス ディスカバリはその一例です。この機能を利用すれば、アプリケーションとマイクロサービスは、コンテナがワーカーノードのどこにデプロイされているかを知らなくても、相互に通信できます。独自のディスカバリ システムを維持し続けても、まったく無駄であろうと判断しました。そこで、従来のシステムの使用をやめ、この Kubernetes コア機能を採用することにしました。

また、Kubernetes に取り組むオープンソース コミュニティに参加して貢献する機会も、とても有意義なものとなりました。Kubernetes はオープン標準ベースであるため、当社の技術スタックをニーズに合わせて自由かつ柔軟に適応させることができました。   

しかし、初期段階では、セルフマネージド Kubernetes のアップグレードは困難だったため、フルマネージド Kubernetes サービスに移行することにしました。このサービスの特に大きなメリットは、Google Kubernetes EngineGKE)ユーザー インターフェースや Google Cloud コマンドライン ツールから Kubernetes を簡単にアップグレードできることです。適切なリリース チャンネルを指定するだけで自動アップグレードを有効にすることもできます。  

複数の GKE クラスタの運用を簡素化

オープンソース テクノロジーをベースにした技術スタックにより、複数の GKE クラスタの運用を簡素化することができました。モニタリングとロギングの運用については、技術スタックを単一の管理 GKE クラスタ上にコロケーションする一元化されたアーキテクチャに移行しました。ロギングには ElasticsearchFluentbitKibana を使用し、モニタリングには ThanosPrometheusGrafana を使用しています。当初はロギングとモニタリングを個々のクラスタに分散していましたが、管理者がそれぞれのクラスタにアクセスする必要があるため、運用が非効率になっていました。また、Kibana インスタンスと Grafana インスタンスの間で同じチャートを重複して保持することにもなりました。

https://storage.googleapis.com/gweb-cloudblog-publish/images/1_VKuJoWR.max-2000x2000.png

CI / CD については、デベロッパー ツールセットのホスティングとパイプラインの実行用に、専用の DevOps GKE クラスタを実行しています。当社は、JIRAConfluenceBitbucketBamboo などの Atlassian サービス スイートを採用しています。これらのアプリケーションは、同じ DevOps GKE クラスタでホストされます。

当社の CI / CD を一元化していますが、カスタム ステップを入れることができるので、チームにある程度の自主性を与えています。チームが新しいバージョンのコードを実装すると、CI パイプラインがテストとビルドプロセスを実施します。これにより、バックエンド サービス用のコンテナ イメージ アーティファクトと、フロントエンド ウェブサイト用の圧縮アーティファクトが生成されます。パイプラインは通常、開発環境とテスト環境でコードを実装してテストし、その後サンドボックスと本番環境にデプロイするようにパラメータ化されています。アプリケーション チームは、要件に応じて、完全に自動化されたパイプラインにするか、本番環境へのデプロイに手動での承認が必要な半自動化されたパイプラインにするかを柔軟に選択できます。

自動スケーリングは実行時にも機能します。リクエスト数が増えると、より多くのコンテナにスケールアップする必要がありますが、リクエスト数が減ると自動的に縮小されます。指標に基づいた自動スケーリングをサポートするために、当社では技術スタックに KEDA を統合しています。

シームレスな開発エクスペリエンスを提供

当社の開発チームは、ある意味でお客様でもあり同僚でもあります。当社は、アプリケーション サービスとインフラストラクチャのテスト、デプロイ、管理、運用を自動化することで、開発者にスムーズなエクスペリエンスを提供することを目指しています。こうすることで、開発者は任されたアプリケーションの構築に集中して取り組みことができます。

これを実現するために、当社は DevOps パイプラインを使用して、インフラストラクチャのプロビジョニング、ソフトウェアのテスト、リリース サイクルを自動化し、簡素化しています。チームは、本番環境をミラーリングする最新の環境ビルドに、本番環境以外のサンプルデータをプリロードして、GKE クラスタをセルフサービスでスピンアップすることもできます。これにより、最新の修正とリリースをテストするための現実的な環境が得られます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/2_iYb7faz.max-2000x2000.png

ビルドをデプロイする段階では、Bamboo CI / CD コンソールにアクセスして進行状況を追跡できます。   

コード品質は当社の開発プロセスにとって非常に重要です。社内の優れたエンジニアリング部門が、オープンソース コードの検査ツールである SonarQube を使用して、CI / CD の一部からコード品質をモニタリングしています。当社では、単体テストのカバレッジ割合に関して厳格な要件を設定しており、単体テストや統合テストに合格しないものを環境内に入れることを許可していません。

リリースについては、ブラック フライデーやサイバー マンデーなどのコードフリーズ期間を除き、ほぼ 1 1 回行っています。コードフリーズ期間には、需要のピーク時に緊急でデプロイする必要があるバグ修正や機能のみをリリースしています。GKE のリリース スケジュールは変更していませんが、並列環境で同時ビルドを実施できるようになり、200 のマイクロサービス アーキテクチャ全体でリリースを効果的に管理できるようになりました。

Google Cloud GKE の選択の鍵となるレイテンシ

他のクラウド プロバイダから Google Cloud GKE に移行した際に、Google Cloud データセンター間のレイテンシが極めて低いうえに、信頼性、スケーラビリティが高く、競争力のある価格設定であることから、Google Cloud が正しい選択であったという確信を得ることができました。多くの人がウェブサイトを利用する状況においては、低レイテンシであれば迅速な応答時間でカスタマー エクスペリエンスを向上できます。

さらに、Google Cloud ではアップグレード プロセスが自動化されており、それらのアップグレードまたは変更によっていずれかの API が機能しなくなる可能性がある場合には事前に通知されるため、複数の GKE クラスタのパッチ適用やアップグレードが容易になります。

また、Google Cloud GKE は当社のビジネスにさまざまな技術的な機会をもたらし、簡素化もそこに含まれています。当社のサービスの多くは永続ストレージを使用しており、GKE によって、Container Storage InterfaceCSI)ドライバを通じて、簡単に永続ストレージを自動的にデプロイして管理できます。CSI ドライバにより、ネイティブのボリューム スナップショットが有効になり、Kubernetes CronJob と連携して、TiDBMySQLElasticsearchKafka などのサービスを実行しているディスクの自動バックアップを簡単に作成できます。開発面では、Skaffold の検討も行っています。これにより、開発チームが内部開発ループのサイクルを改善し、ローカルの実行インスタンスが Kubernetes クラスタ内にデプロイされているかのように、より効率的に開発できる可能性が広がります。

まとめると、管理のしやすい GKE のおかげで、当社はビジネスが成長し続けているにもかかわらず、200 のマイクロサービス アーキテクチャをわずか 10 人のエンジニアと 15 のクラスタで管理できています。

ご自身でお試しになりたい方は、実践的なチュートリアルをご覧ください。このチュートリアルでは、GKE で継続的デリバリー パイプラインを設定し、変更を自動的に再ビルド、再テストして、サンプル アプリケーションに再デプロイします。

ー Ninja Van、シニア スタッフ ソフトウェア エンジニア Ivan Kenneth Wang 氏

ー Google Cloud、カスタマー エンジニア Woh Shon Phoon

投稿先