サーバーレス & コンテナエンジン

サーバーレス & コンテナエンジン

はじめに

サーバーレスについて語る際、Kubernetesは避けて通れない話題です。

今回のレッスンでは、前回のローカルK8sデプロイメントをベースに、プライベートなサーバーレス環境のセットアップ方法を学びます。具体的には、前回のレッスンで構築したローカルK8s環境に基づいてサーバーレスインフラを構築し、さらに追加コンポーネントをインストールしてK8sクラスタの機能を拡張し、最終的にローカルK8sクラスタがサーバーレスをサポートできるようにします。

サーバーレス構築の前提条件

始める前に、サーバーレスコンピューティング(特にFaaS)の基礎的なコースで出た疑問を明確にしておきましょう。ある学生が「マイクロサービス、サービスメッシュ、サーバーレスの関係は何ですか?」と質問しました。

これらの概念は議論の中で頻繁に登場しますが、あまりプレッシャーを感じる必要はありません。私自身もサーバーレスを学び始めた当初はこれらの概念に混乱していました。まずマイクロサービスを振り返ってみましょう。マイクロサービスを使ってBaaSを作成する際、マイクロサービスの多くの概念がサーバーレスと非常に似ていることに気づくかもしれません。

簡単に言えば、サービスメッシュはマイクロサービス自身が気づかないうちに動作するマイクロサービスのネットワーク通信ソリューションです。サーバーレスアーキテクチャにおけるネットワーク通信もサービスメッシュに委任できます。サービスメッシュを通じて、サーバーレスコンポーネントはK8sクラスタと緊密に連携し、最終的にデプロイされたアプリケーションをサーバーレス方式でサポートできるようになります。以下のアーキテクチャ図をご覧ください:

この図から、サーバーレスの基盤インフラはサービスメッシュ上に構築できることが明確にわかります。ただし、サービスメッシュはサーバーレスネットワーク通信を実現するためのソリューションの1つに過ぎません。他にもRSocket、gRPC、Dubboなどの選択肢があります。私がサービスメッシュを選んだのは、このソリューションがK8sコンポーネントをベースにでき、可視化ツールを提供してサーバーレスの動作メカニズム(例えば、起動時間ゼロの実現方法や段階リリースのトラフィック制御など)を理解するのに役立つからです。実践したいなら、サービスメッシュは間違いなく第一の選択肢です。

サーバーレスインフラ:サービスメッシュ

Kubernetes、サービスメッシュ、サーバーレス技術は、クラウドネイティブアプリケーション開発の「三本柱」と呼ばれることがあります。ここまでで、その理由をご理解いただけたと思います。ただし、以下のレッスンでは多くの新しい用語を紹介しますので、あらかじめご了承ください。これらの用語については概要を説明しますので、時間があればさらに深く掘り下げてください。

では、本題に戻り、サービスメッシュの原理を詳しく見ていきましょう。

マイクロサービスについて議論した際、分解と統合に関する理論的なガイダンスのみを扱い、具体的な実装には触れませんでした。実装に切り替えると、業界には多くのマイクロサービフレームワークがありますが、そのほとんどは特定の言語のSDKに限定されており、特にJavaのマイクロサービスフレームワークが多いです。

SDK形式のマイクロサービスフレームワークは通常、マイクロサービス間のネットワーク通信の実装に重点を置いています。例えば、失敗したサービスリクエストの再試行、複数のサービスインスタンス間の負荷分散、高サービスリクエスト時におけるトラフィック制限などです。これらのロジックは、マイクロサービス開発者の注意を必要とし、各SDK言語で繰り返し実装する必要があります。では、マイクロサービスのネットワーク通信ロジックをSDKから抽出し、マイクロサービスをより軽量にし、ネットワーク通信を気にする必要をなくすことは可能でしょうか?

その答えがサービスメッシュです。

分解されたアプリケーションをK8sクラスタのPodにデプロイする場合、以下の図のようなプロセスになります。MyAppアプリケーションは、クラスタ内のユーザーマイクロサービスやタスクマイクロサービスをHTTP経由で直接呼び出します。

しかし、直接HTTPアクセスによるセキュリティ問題はどうでしょうか?誰かがクラスタ内でBusyBoxコンテナを起動したら、ユーザーマイクロサービスやタスクマイクロサービスを直接攻撃できてしまうのではないでしょうか?また、ユーザーマイクロサービスに複数のインスタンスがある場合、どのようにトラフィックを配分するのでしょうか?

従来は、マイクロサービスアーキテクチャSDKを使用していました。このSDKには多くのロジックと、SDKを呼び出す際にいつアクティブにするかを決定する多数の戦略が含まれています。そのため、コードはマイクロサービスアーキテクチャSDKと強く結合してしまいます。

サービスメッシュは、マイクロサービスからネットワーク通信ロジックを抽出し、非侵襲的な方法でネットワークトラフィックを管理することで、重いマイクロサービスSDKを気にする必要をなくします。サービスメッシュがこの問題をどのように解決するかを見てみましょう。

サービスメッシュはデータプレーンとコントロールプレーンに分けられます。データプレーンはネットワーク通信を管理し、コントロールプレーンはネットワーク通信の状態を制御・監視します。サービスメッシュは、サイドカーを注入することで全てのネットワークトラフィックをインターセプトします。

データプレーンでは、アプリケーションとマイクロサービスはサイドカーと直接通信しているように見えますが、実際にはサイドカーはトラフィックハイジャックを通じてこれを実現できます。そのため、アプリケーションとマイクロサービスは通常これに気づかず、変更も不要で、単にHTTPリクエストを使用してデータを転送するだけです。

コントロールプレーンはより複雑で、サービスメッシュ運用の中核です。Pilotはコントロールプレーン全体のドライバーであり、サービスディスカバリ、トラフィック管理、スケーリングを担当します。Citadelはコントロールプレーンの守護要塞であり、セキュリティ証明書と認証を担当します。Mixerは通信責任者であり、コントロールプレーンのポリシーを配布し、各サービスの動作状況を収集します。

これで、サービスメッシュとは何か、どのようにマイクロサービスのネットワーク通信ロジックをSDKから抽出するのか、そしてなぜサービスメッシュがサーバーレスのネットワーク通信基盤と言えるのかが明確になったはずです。

サーバーレスとコンテナエンジンの関係

サーバーレスの核心的な価値は、サーバーを管理する必要がなく、ビジネスロジックに集中できることです。コンテナ技術は、サーバーレスに必要な強力なインフラと柔軟なスケジューリング機能を提供し、特にKubernetesのようなオーケストレーションツールと組み合わせることで効果を発揮します。

コンテナは、軽量なパッケージング、リソース分離、高速起動といった利点を提供します。コンテナはアプリケーションとその依存関係をパッケージ化し、実行環境の一貫性を確保することで、サーバーレスプラットフォーム上でのアプリケーションインスタンスの迅速なデプロイと起動を容易にします。また、コンテナは分離された実行環境を提供し、異なるアプリケーションが互いに干渉しないようにすることで、プラットフォーム全体の安定性を向上させます。さらに、コンテナの起動は仮想マシンよりも高速で、サーバーレスアプリケーションの弾性スケーリングに対する高い要件を満たします。

サーバーレススケジューリングの中核として、Kubernetesは自動デプロイ、弾性スケーリング、サービスディスカバリなどの機能を持っています。事前設定されたルールに基づいてコンテナ化されたアプリケーションを自動的にデプロイし、手動介入なしで動作します。リアルタイムの負荷に応じてアプリケーションインスタンス数を調整し、パフォーマンスを確保しながらリソース使用率を最適化し、サーバーレスプラットフォーム内のコンポーネント間の通信を容易にするサービスディスカバリメカニズムを提供します。

コンテナベースのサーバーレスプラットフォームを構築するには、まずアプリケーションとその依存関係をコンテナイメージにパッケージ化し、アプリケーションがプラットフォーム上で迅速にデプロイ・実行できるようにします。次に、適切なクラウドプラットフォームを選択するか、セルフホストのKubernetesクラスタをサーバーレスプラットフォームのインフラとしてセットアップします。その後、外部リクエストを受信・ルーティングするAPIゲートウェイ、関数コードをロード・実行し関数ライフサイクルを管理する関数ランタイム、さまざまなイベントソースをリッスンしてイベントを関数呼び出しに変換するイベントトリガーなど、サーバーレスプラットフォームのコンポーネントを開発します。最後に、KubernetesのDeploymentを使用してアプリケーションインスタンスのデプロイと更新を管理し、Serviceを使用してサービスディスカバリと負荷分散を行い、HPA(Horizontal Pod Autoscaler)を使用して自動弾性スケーリングを実現します。

コンテナベースのサーバーレスプラットフォームは、高い柔軟性、強力なカスタマイズ性、コスト効率を提供します。開発者は基盤となるコンテナ技術とKubernetesプラットフォームを自由に選択し、必要に応じてサーバーレスプラットフォームの機能や特性をカスタマイズできます。また、Kubernetesのリソーススケジューリング機能を活用してリソース使用率を最適化し、コストを削減できます。

コンテナ技術とKubernetesの組み合わせは、効率的で柔軟かつスケーラブルなサーバーレスプラットフォームを構築するための強力なツールと手法を提供し、開発者が簡単に独自のサーバーレスプラットフォームを構築し、ビジネスロジックの開発に集中して開発効率を向上させることを可能にします。

Novita AI Serverless

Novita AIでは、独自のコンテナエンジンNexusを開発しました。Nexusの強力な分散コンピューティングとリソーススケジューリング機能を活用して、Novita AIは次世代生成AI向けのサーバーレスサービスを構築しました。ユーザーは基盤となるコンピューティングリソースを気にすることなく、ビジネスイノベーションに集中できます。現在予約受付中です。ウェイティングリストに参加して、Novita AI Serverlessをいち早く体験してください。

Novita AIは、お客様のAIへの野心を実現するオールインワンのクラウドプラットフォームです。統合API、サーバーレス、GPUインスタンス — コスト効率の高いツールを提供します。インフラを排除し、無料で始めて、AIのビジョンを現実にしましょう。

おすすめの記事

需要に応じたスケーリング:サーバーレスがトラフィック急増を簡単に処理する方法

サーバーレス分析、データモデルから始める

革命の解明:サーバーレスコンピューティングの世界を探る