LinkerdのプロダクトリーダでBuoyant CTOのOliver Gould氏が、先週{のQCon New York 2019 Conferenceで、Linkerdサービスメッシュについて、トラフィック管理機能を中心に講演した。
Gould氏の講演は、バックグラウンドとしてTwitterのFinagleライブラリに関する解説から始まった。Finagleはコントロールプレーンを備えた初期のサービスメッシュの一種で、ZooKeeperやデータプレーンと合わせて運用される。多数のサービスを抱えているサイトでは、ライブラリベースのソリューション採用は適切なアプローチではない、と氏は言った。
サービスメッシュのコンセプトの背景にある発想は、OSIの7層アーキテクチャモデルのアプリケーション層から機能を取り出すことだ。Linkerdフレームワークのバージョン0.1は2016年にリリースされ、2017年にCloud Native Computing Foundation(CNCF)によって採用されている。昨年9月にはバージョン2.0がリリースされた。
Linkerdチームは、JVMベースのサイドカーソリューションが一部のユーザにとって重すぎるため、構成が難しくなっていることを突き止めた。サイドカーは軽量であることが必要なので、データプレーンにRust言語を使用することにした。Rustはパフォーマンスに優れると同時に、強い型付けを提供することから、コンパイル時に可能な限り多くのバグをキャッチすることが可能になる。また、RAII(Resource Acquisition Is Initialization)を採用して、リソースの初期化がオブジェクトのコンストラクタで実行されるため、GCに関連する制約がない。オブジェクトがスコープ外になると、そのデストラクタが呼び出され、所有されているリソースが解放される仕組みだ。
次にGould氏は、Rustベースのデータプレーン(linkerd2-proxyと呼ばれる)を含むLinkerd 2.xアーキテクチャについて論じた。アクティビティの大半が発生する場所であるコントロールプレーン(linkerd2)は、Go言語で開発されている。監視と視覚化の目的で、PrometheusやGrafanaといった他のフレームワークも含まれている。機能しているKubernetes(K8s)アプリケーションのある場合は、Linkerdにドロップするだけで、設定不要でアプリケーションに統合することができる。
Gould氏はもう一度、可視性、信頼性、セキュリティ機能をアプリケーション層からインフラストラクチャ層に移すという、Linkerdの目標を紹介した。Linkerdは、これら3つの機能それぞれの下で、次のような機能をサポートする。
- 可視性: 自動ゴールデンメトリック(成功率、レイテンシ、スループット)
- 信頼性: 負荷分散、再試行、タイムアウト、回線切断、期限
- セキュリティ: 透過的mTLS、証明書の検証、ポリシ施行
可観測性(observability)にはGrafanaツールが使用されている。特定の条件に基づいた要求検査に使用可能なTapという機能もある。機密性の高いヘッダ(認証データ)など、リクエストで公開できるものには注意が必要だ、と氏は指摘した。
信頼性としては、構成可能なサービスの再試行とタイムアウトを備えた、遅延対応のロードバランシングが含まれている。
セキュリティ機能には、双方向の暗号化IDと、入力および出力ステップのTLSが含まれる。セキュリティは透過的で、デフォルトでオンになっており、Kubernetes ServiceAccountsを使用してブートストラップする。
続いて氏は、サービスメッシュテクノロジの"幻滅の谷(Trough of Disillusionment)"について話した。サービスメッシュが普及すると、開発者が適切に運用できない、あまりに多くのことを一度に実行しようとする、システム障害時にサービスメッシュが最初に疑われる、などの問題に突き当たる可能性がある。これらの問題のいくつかに対処するために、Linkerdでは、セットアップが正しく行われていることを確認する、一連のチェックコマンドを追加する必要があった。
さらにGould氏は、サービスメッシュを使用する際のトラフィック管理の重要性について説明した。新たなService Mesh Interface仕様(SMI)は、サービスメッシュの共通的な標準APIとなっており、トラフィック管理、トラフィックポリシ、トラフィックテレメトリなど、最も一般的なサービスメッシュ機能をカバーしている。SMIは、サービスメッシュの世界におけるインテグレーションへの参加者にとって、共通層となるものだ。
講演の最後に氏は、Linkerdロードマップの詳細を紹介した。バージョン2.3では、デフォルトでテレメトリ、再試行、タイムアウト、自動挿入、mTLSをサポートする。2.4では、トラフィックのシフト(青緑、カナリア)とインストールスプリットが提供される。マルチクラスタ内でサービスメッシュを使用するためのメッシュ拡張などの機能や、分散トレースなども、将来のリリースで提供される予定である。
SMIとLinkerdについて詳しく知りたい場合は、こちらの新仕様に関するQ&A記事や、Linkerd v2に関するこの記事を参照してほしい。