BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Linkerdに見る、クラウドネイティブインフラストラクチャにおけるRustの採用

Linkerdに見る、クラウドネイティブインフラストラクチャにおけるRustの採用

原文(投稿日:2021/08/08)へのリンク

Linkerdプロジェクトは先頃、CNCFの卒業プロジェクト(graduated project)となり、KubernetescontainerdetcdEnvoyPrometheusなどと並んで、完成したクラウドネイティブプロジェクトの仲間入りを果たした。Linkerdは、Kubernetes上の分散コンテナ化アプリケーションを構築し、デプロイし、管理する開発者の作業を容易にする、ハイパフォーマンスなサービスメッシュである。また、セキュリティとパフォーマンスを向上させるために、プログラミング言語としてRustを採用した、最初のサービスメッシュプロジェクトであり、CNCFプロジェクトでもある

Linkerdはマイクロサービスアプリケーションに干渉することなく、外部から管理し、監視する。アプリケーション開発者は、Linkerdのために、特別なインターフェースをするようなコードを記述する必要はない。ポータブルなサービスメッシュにおいて、"任意の言語、任意のフレームワーク"というアプローチは非常に重要なものだ。Linkerdには3つのコンポーネントがある。

  • UIは、開発者やITオペレータがサービスメッシュを監視し、操作するために使用する。
  • コントロールプレーンは、アプリケーションのセキュリティ、監視、レポートなどの提供サービスを統合する。
  • データプレーンは、マイクロサービスアプリケーションを実行するためのサイドカーフレームワークを定義する。データプレーンの中心的なコンポーネントは、マイクロサービスアプリケーションへのトラフィックを管理するLinkerd2-proxyである。

他のサービスメッシュプロダクトと異なる、Linkerdの最もユニークな面が、このRustで記述されたLinkerd2-proxyにある。Rustを採用したことによって、Linkerdは、他のサービスメッシュソリューションに比較して、極めて高速かつ軽量なものになっている。

"LinkerdのプロキシでRustを採用したのは、パフォーマンスやセキュリティの面でユーザに妥協を強いたくなかったからです"と、Linkerdの作者のひとりであるWilliam Morgan氏は述べている。"現在において、新たにCやC++のコードを導入する理由は何もありません。極めてセンシティブなカスタマデータを扱わなければならない、サービスメッシュのデータプレーンレイヤにおいてはなおさらです。Rustを使うことでLinkerdは、他のサービスメッシュよりも高速かつ軽量に仕上がっただけでなく、基本的構造から、よりセキュアなものにすることができました。"

クラウドネイティブなソフトウェアインフラストラクチャでは従来、Golangプログラミング言語が主流となっていた。DockerやKubernetesなど、大規模なクラウドネイティブプロジェクトの大部分は、Golangで記述されている。事実、LinkerdのコントロールプレーンもGolangで書かれている。しかしながら、近年、ソフトウエアインフラストラクチャ用のプログラミング言語として、Rustの人気が高まっている。Rustの最もユニークな機能のひとつは、実行時に潜在的問題に対応しようとするのではなく、開発者に"正しい"コードを書くように仕向ける点を重視していることだ。例えばRustでは、ライフタイムなどの言語構造によって、メモリ安全性を確保している。コードの正確性はRustコンパイラによってチェックされ、保証される。これにより、Rustからコンパイルされたネイティブクライアント(NaCl)やWebAssembly(Wasm)バイナリアプリケーションは、メモリ安全性の問題から解放され、オペレーティングシステム上で直接実行することが可能になる。対照的に、GolangやJavaで開発されたアプリケーションは、メモリアロケーション(ガベージコレクションなど)を管理するランタイム内で動作する必要があるため、非常に大きく、遅いものになる。結果としてRustは、現代的かつ高度に抽象化された言語構文をサポートする一方で、極めて高速かつ軽量な実行アプリケーションを生成することができるのだ。

Rustは開発者に愛されている。Stackoverflowユーザによる投票では、"The most beloved programming language"を5年連続で獲得した。現在はTIOBE surveyの"最も広く使用されているプログラミング言語"でもトップ20にあり、Linuxカーネルを含む多くの大規模プロジェクトで使用されている。

クラウドネイティブの領域においても、Rustは重要なインフラストラクチャで採用を伸ばしている。例えば、AWSがRustで開発したFirecrackerは、マイクロVMとしてAWS Lambdaサーバレスプラットフォームを支えている。TiKVはRustベースのデータベースで、CNCFの卒業プロジェクトである。今回のLinkerd2-proxyは、CNCF発の新たなRustサクセスストーリ、ということになる。

ユーザの立場から見て、Rustベースのプロダクトを使用する最も具体的なメリットは、その高速かつ低メモリフットプリントのポテンシャルに加えて、CやC++のコード特有のメモリに関連する脆弱性をクラス全体で回避できる点にある。Linkerd自身が実施したベンチマーク調査によると、GolangベースのIstio(サービスメッシュ)やC++ベースのEnvoy(サイドカープロキシ)に比較して、Linkerdは、データプレーンにおけるメモリとCPUの消費量がそれぞれ1/9、1/8でありながら、テストしたアプリケーションではそれらを上回るパフォーマンスを提供することができた。

Rustの人気が高まったことで、当然ながら、サービスアプリケーションの記述にも使用されるようになっている。TokioHyperといったWebフレームワークを使用してRustでサービスアプリケーションを記述し、NaClあるいは(WasmEdgeなどを使って)WebAssemblyにコンパイルして、Linkerdなどサービスメッシュ内にサイドカーアプリケーションとしてデプロイすることが可能だ。

LinkerdのCNCFからの卒業は、クラウドネイティブインフラストラクチャにおけるRustのマイルストンである。Apache 2.0のオープンソースプロジェクトであるLinkerdには、そのGitHubSlack、あるいはEメールリストを通じて参加やコントリビューションが可能だ。

この記事に星をつける

おすすめ度
スタイル

BT