マイクロサービス(アーキテクチャ)への移行や、クラウド環境に合わせたカスタマイズが進むにつれ、複数のサービスが複雑に連携するようになりました。サービスメッシュ技術は、こうしたサービス間のつながりを整理し、通信を一元的に制御して、効率的かつ信頼性の高い仕組みを支えます。
サービスメッシュをもう少し深く見る
サービスメッシュは、アプリに組み込む通信のための枠組みです。複数のサービス同士のやり取りを整理し、サービスの検知や負荷分散、障害時の復旧、各種メトリクスの取得と継続的な監視までをカバーします。さらに、A/Bテストや段階的なデプロイ、リクエストのレート制御やアクセス制御、包括的な検証など、サービスメッシュならではの高度な機能を一括管理できます。
サービスメッシュが必要とされる理由
従来のモノリシックなアーキテクチャでは、アプリの機能はひとかたまりでした。マイクロサービスはそれを役割ごとに分割し、多くの課題を解決しましたが、新たな問題としてサービス間通信の同期が複雑になりました。
その代表的な問題としては、以下が挙げられます。
サービスメッシュは、これらの課題を直接カバーし、マイクロサービス同士を効率よく管理するための基盤を提供します。
サービスメッシュの進化の流れ
サービスメッシュの考え方自体は以前から存在していましたが、Kubernetesなどの分割・オーケストレーションソリューションが台頭したことで重要性が増しました。初期にはNetflixのPranaのように、アプリ側にライブラリを組み込む手法もありましたが、アプリがサービスメッシュを意識する必要がありました。
近年主流のIstioやLinkerdなどのサービスメッシュは、プラットフォームやプログラミング言語から独立して動作し、ネットワーク層で動くように設計されています。つまりアプリのコードに手を入れなくても、主要な機能を利用できます。
続いて、IstioとLinkerdという代表的なサービスメッシュについて、それぞれの思想や機能、比較点を中心に解説します。
Istio:マイクロサービスを巧みにオーケストレーション
Google、IBM、Lyftといった大手企業が共同開発したオープンソースのサービスメッシュがIstioです。特徴は、アプリのコードを変更せずにマイクロサービス同士を連携させることができる点です。
Istioはサイドカー方式を採用しており、Envoyというプロキシを各サービスに付与します。Envoyがサービス間の通信を制御し、トラフィックを適切に振り分けます。Istioの中枢となるPilot、Mixer、Citadelがコントロールプレーンとして全プロキシを管理し、正確なトラフィック制御を実現します。
Istioの主な特徴は以下のとおりです。
Linkerd:軽量さを追求した革新的サービスメッシュ
Buoyant社が開発し、Cloud Native Computing Foundation(CNCF)の支援を受けるLinkerdもまた、オープンソースのサービスメッシュとして注目されています。ネットワークの安全性、耐障害性、可視化などを実現しつつ、アプリ側のコードを変更しないシンプルな設計がポイントです。
Linkerdもサイドカー方式を用いており、Envoyの代わりにRustで書かれたLinkerd2-proxyを使用することで、高いセキュリティと低メモリ消費を両立しています。コントロールプレーンはGoで書かれ、サービスの検知、ルーティング、データ収集などを行います。
Linkerdの主な特長は以下のとおりです。
このように、IstioとLinkerdはマイクロサービス管理という同じ課題を解決する一方で、方針や特徴が異なります。幅広い機能をもつIstioは柔軟性や堅牢性に強みを持ち、Linkerdはシンプルで軽快な導入や運用を得意としています。実際にどちらを選ぶかは、プロジェクトのニーズや要件に左右されます。
技術の世界において、サービスメッシュは多機能で賢いデジタルの司令塔のような役割を担っています。これはマイクロサービスという小さな要素の集合を束ね、あたかも一つの仕組みのように動かす指揮者ともいえます。各マイクロサービスは自分の担当機能を持ち、サービスメッシュが通信ノードとして全体をつないでいます。
サービスメッシュの仕組み | どう動く?
端的に言えば、サービスメッシュは多数のマイクロサービスをつなぎ合わせるためのインフラ基盤であり、この複雑なやり取りをまとめて管理します。最終的に実現するのは、システムの耐久性やセキュリティ、信頼性の向上です。多くのアプリはこの基盤を利用してサービス間のやり取りを整理し、アクセス性や可視性を高めています。
一般的なサービスメッシュでは、データプレーンとコントロールプレーンという2つのレイヤーが主要な役割を持ちます。データプレーンは実際のサービス間通信を中継し、コントロールプレーンはそれを設定・管理する役割を担います。
サービスメッシュ界の主なプレイヤー
この分野には、Istio、Linkerd、Consul、Kuma、Envoyなど複数の主要ツールが存在します。
サービスメッシュを取り巻く最新の動向
この領域は技術進歩に伴い絶えず変化しています。マイクロサービスと分散化が進むほど、その管理や安全性、効率性を確保できるサービスメッシュへのニーズが高まります。
IstioやLinkerdなどの第一世代ともいえるサービスメッシュは、サービス間通信をシンプルに扱うところから始まりましたが、今ではセキュリティ面や可視化、トラフィック制御などを強化する方向へと発展しています。
クラウドの普及やセキュリティ、コンプライアンスの重要性、スケールと効率を求められるマイクロサービスが増加する中、サービスメッシュ技術はさらに広がる可能性を秘めています。
企業がサービスメッシュ領域の進化に追随し、適切なツールを取り入れれば、マイクロサービス運用における管理や安全性、使いやすさを大きく高められるでしょう。
Istioは、オープンソースのネットワーク管理において有力な選択肢として位置づけられ、マイクロサービス間の接続、安全対策、一元的管理に関して優れた働きをします。トラフィック制御を柔軟に行い、アクセスルールを詳細に設定し、データを分析しながら既存のコードを変更しないメリットは大きいです。
Istioの際立つ特徴
Istioが持つ重要な機能は、トラフィック制御、セキュリティ機能、可視化、柔軟性の4つに集約されます。
トラフィック制御
Istioによるトラフィック管理機能により、開発者は設定ファイルを用いてサーキットブレーカーの設定やタイムアウト、リトライなどを簡単に適用できます。A/Bテストや段階的ロールアウトといった高度なルールも容易に実装できます。
トラフィックを均等に分散させたり、制御したり、障害を切り離すといったポリシーを柔軟に適用することで、通信面を最適化します。
セキュリティ機能
Istioを利用することで、開発者はネットワークやポリシーの適用に煩わされることなく、ビジネスロジックに集中できます。代表的なセキュリティ対策は以下のとおりです。
可視化
Istioは各サービスの動作状況を明確に把握できるよう、大量のテレメトリを自動収集します。コードを変更することなく、サービスの状況を把握し、問題発生時の原因究明を容易にします。
柔軟性
Istioは既存のAPMやNPMツール、ログプラットフォームなどと容易に連携し、任意のポリシーや独自のテレメトリを自由に収集・適用できるアーキテクチャです。これにより、アプリ部分を直接いじらずに運用ルールや監視設定を拡張できます。
Istioのアーキテクチャ
Istioは、大きく分けてコントロールプレーンとデータプレーンで構成されます。データプレーンにはEnvoyプロキシがサイドカーとして稼働し、サービス間通信を管理します。コントロールプレーンは、これらのプロキシに対してトラフィック制御やポリシーの指示をして高速に運用を反映します。
Istioの主要コンポーネント
Istioのコントロールプレーンは次の要素で構成されています。
Istioの設定方法
Istioでは、トラフィックルーティングやポリシー関連をシンプルな統一モデルで設定できます。KubernetesやConsul、Nomadなど、複数の環境で運用可能で、同じ管理体験を提供します。
このように、Istioは充実した機能と柔軟な設計が特長で、複雑なマイクロサービスを管理するのに非常に有用です。トラフィック制御、セキュリティ機能、可視化、拡張性のすべてをカバーすることで、開発チームはビジネスロジックにより集中できます。
Linkerdは、サービス間の通信を監視・制御するレイヤーを提供するサービスメッシュソフトウェアとして存在感を放っています。CNCFのサポートを受けつつも、シンプルさ、高速性、リソース効率性を重視して開発されている点が特徴です。ここでは、Linkerdの特長や機能を掘り下げて紹介します。
シンプルな運用
Linkerdの大きな魅力は、その扱いやすさです。ネットワーク運用の深い知識を持たない方でも理解しやすい設計になっており、必要最低限の機能を中心にまとめています。
アプリのコードに手を加えずに導入できるので、既存の環境への影響を最小限に抑えつつ導入が可能です。各サービスと一緒にデプロイされるサイドカーがネットワーク通信を自動的に扱い、運用者がネットワーク管理の複雑さに煩わされることを減らします。
高速性とリソース効率
Linkerdは、RustとGoで開発され、軽快かつ低リソースな動作を目指しています。データプレーンで稼働するLinkerd2-proxyはRust製のため、レイテンシが少なく、メモリやCPUの使用量も抑えられています。
大規模なトラフィック負荷がかかったときでもシステムパフォーマンスが落ちにくく、高い効率性を持続できます。
信頼性と安定性
Linkerdでは、通信経路の暗号化を自動で行うTransport Layer Security (TLS)を標準で導入し、データを安全に守ります。また、ネットワークトラブルが発生した場合の自動リトライやタイムアウト、故障したサービスを切り離す「サーキットブレーカー」などの仕組みにより、システム全体の安定性を維持しやすいです。
可観測性とトラブルシューティング
Linkerdはリクエスト数やレイテンシ、成功率などの豊富なメトリクス情報を正確に収集し、トラブルシューティングを効率化します。これらのメトリクスはWebダッシュボードやPrometheusと連携することで閲覧可能です。
さらに「tap」機能によるリアルタイム通信の確認や、「top」が示す主要なトラフィック元の把握など、デバッグを支援するツールも備わっています。
柔軟性と他ツールとの連携
LinkerdはgRPCのAPIにも対応しており、任意のスクリプトやプログラムからメッシュの動きを制御できます。また、Prometheus、Grafana、Jaegerなど数多くのツールとシームレスに連携できる点も大きな魅力です。
すなわち、Linkerdは強力さとシンプルさ、そして運用者にやさしい設計が特徴で、マイクロサービスの信頼性や可視化を高めるための幅広い機能を持ちます。ネットワーク技術に詳しいエキスパートから初心者まで、多くの方にメリットがあるサービスメッシュと言えるでしょう。
クラウド時代のインフラでは、サービスメッシュの設計がシステム性能や拡張性、安定性を左右する重要な要素となっています。IstioとLinkerdはその代表例であり、それぞれが異なる設計のアプローチで多様な要件に応えています。
Istioは、拡張性や柔軟性を意識した分割構造をとっており、大きくデータプレーンとコントロールプレーンに分かれます。
一方、Linkerdはミニマムかつシンプルな設計を目指し、同じくデータプレーンとコントロールプレーンに分かれていますが、その内部コンポーネントはIstioと比べてコンパクトです。
IstioとLinkerdの比較
IstioとLinkerdを比較すると、以下のような差分が見られます。
結局は、扱うプロジェクトの要件や規模によって、柔軟かつ機能性に富むIstioを選ぶか、シンプルで高パフォーマンスなLinkerdを選ぶかが変わります。
Kubernetes環境でネットワーク管理を高度化するには、Istioを導入するのが一つの有力な方法です。ここでは儀式的になりやすい導入手順を、なるべくシンプルにまとめます。
前提条件
Istioの導入前に、以下のことを満たしているかを確認してください。
kubectl
でクラスタにアクセスできることステップ1:Istioのダウンロード
まずはIstio公式のGitHubリポジトリから最新バージョンを取得します。必要に応じて適切なバージョンを選び、展開したフォルダを使用します。
以下のコマンドでIstioを素早くダウンロード・展開できます。
curl -L https://istio.io/downloadIstio | sh -
ステップ2:Istioをインストール
ダウンロードしたら、解凍されたIstioディレクトリへ移動し、istioctl
というコマンドラインツールを使ってインストールを行います。
cd istio-*
export PATH=$PWD/bin:$PATH
以下のコマンドでIstioの主要コンポーネントを起動します。
istioctl install --set profile=demo -y
上記ではdemoプロファイルが適用され、Istioの基本機能一式がインストールされます。
ステップ3:Istioの動作確認
Istioをインストールしたら、istio-system
という名前空間にあるサービスやPodの状態を確認し、正常に稼働しているかチェックします。
kubectl get svc -n istio-system
kubectl get pods -n istio-system
関連する各コンポーネントが起動していることを確認しましょう。
ステップ4:サイドカー自動注入を有効化
Istioはサイドカー方式を用いるため、Podごとにネットワークプロキシを挿入します。これを自動で行うには、ターゲットの名前空間にistio-injection=enabled
というラベルを付与します。
kubectl label namespace default istio-injection=enabled
ステップ5:サンプルアプリをデプロイ
Istioの稼働をテストするために、Bookinfoアプリなどのサンプルを導入してみます。以下のコマンド例では、Bookinfoアプリをデプロイします。
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
これにより、Kubernetesクラスタ上にBookinfoアプリがデプロイされます。
ステップ6:アプリの状態を確認
デプロイ完了後、kubectl get services
やkubectl get pods
でサービスやPodの状態が正しく動いているか確認します。
kubectl get services
kubectl get pods
Bookinfoに関連するサービスやPodの有無をチェックします。
ステップ7:アプリにアクセス
Istio Gatewayを利用して、Kubernetesクラスタ外からアプリにアクセスできるようにします。
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
最後に、KubernetesプラットフォームのIPアドレス情報を使い、ブラウザからBookinfoアプリにアクセスします。
以上がIstio導入の概要ステップです。Istioは多機能ゆえに学習コストがかかりますが、公式ドキュメントには詳細な手順や実例が載っています。うまく活用すれば、マイクロサービス環境での強力な基盤として役立ちます。
それでは、Linkerdを実際に取り入れるための手順を見ていきましょう。必要な環境準備から試験的なデプロイまでを順を追って紹介します。
Linkerd構成の流れ
Linkerdをネットワークに導入する全体的なイメージとしては、以下のステップで進みます。
環境を整える
LinkerdはKubernetesとの相性が良いため、まずはKubernetesクラスタが整っていることが前提です。まだクラスタがない場合は、GKEやEKSなどでクラスタを作成すると良いでしょう。また、kubectl
の準備とLinkerd CLIのダウンロードを行います。
ステップ1:Linkerd CLIの準備
Linkerd CLIを取得し、動作環境に組み込みます。たとえば、curl -sL https://run.linkerd.io/install | sh
というコマンドで、最新バージョンのLinkerd CLIをダウンロードし、パスに追加することができます。
ステップ2:Kubernetesクラスタの検証
linkerd check --pre
コマンドを実行し、Linkerdの導入要件がKubernetesクラスタで満たされているかを確認します。
ステップ3:Linkerdのクラスタ反映
linkerd install | kubectl apply -f -
と入力するだけで、Linkerdの必要リソースを自動生成し、一括でクラスタに反映できます。
ステップ4:インストール確認
linkerd check
コマンドを利用すれば、Linkerd本体が正常に動いているかどうかを一通りチェックできます。
ステップ5:テストアプリをデプロイ
実際にLinkerdが機能しているか試験するため、emojivoto
というサンプルアプリをデプロイします。curl -sL https://run.linkerd.io/emojivoto.yml | linkerd inject - | kubectl apply -f -
のような手順で簡単に導入できます。
ステップ6:アプリの状態を可視化
linkerd dashboard
コマンドでLinkerdのダッシュボードを起動し、emojivoto
がどのように動作しているかを確認します。各種メトリクスを一目で把握できるので便利です。
以上のステップを踏めば、Linkerdの基本的な導入から動作確認、テストまで一通り体験できます。Linkerdの公式ドキュメントには、さらに詳細な設定例が掲載されているので、必要に応じて参照してください。
サービスメッシュ技術を評価するうえで、パフォーマンスメトリクスは重要です。IstioとLinkerdはどちらも監視機能を備えていますが、それぞれ特徴があります。ここでは、IstioとLinkerdが提供するパフォーマンスメトリクスを比較し、その長所と短所を確認します。
Istioのパフォーマンスメトリクス
Istioは総合的かつ細やかなメトリクス収集を行い、システムの内部動作を深く把握できるように設計されています。
これらを可視化・保存するために主にPrometheusが使われ、即時の観測や分析を可能にします。
Linkerdのパフォーマンスメトリクス
Linkerdはシンプルかつ使いやすさを重視した設計で、主要なメトリクスを自動収集します。
LinkerdもPrometheusとの連携を標準で用意しており、さらにGrafanaとの連動で視覚的なダッシュボードを構築できます。
パフォーマンスメトリクスの比較
両者とも強力な監視機能を持ちますが、細かさや拡張性に違いがあります。
メトリクス | Istio | Linkerd |
---|---|---|
リクエスト数 | ○ | ○ |
エラー数 | ○ | × |
レスポンスタイム | ○ | ○ |
カスタムメトリクス | ○ | × |
Prometheus連携 | ○ | ○ |
Grafana連携 | × | ○ |
Istioはカスタマイズ性が高く、大規模・複雑なシステムに向いています。一方、Linkerdは仕様がコンパクトで、迅速に可視化を始めたい場合に魅力があります。どちらを選ぶかは、メトリクスに対する要件やシステムの規模に依存すると言えます。
まとめると、大規模で詳細な監視が必要ならIstio、必要十分なモニタリングをシンプルに導入したいならLinkerd、といった選択基準が考えられます。
ここでは、あるグローバルEC企業がモノリシックなシステムからマイクロサービスへ移行し、Istioを本番運用した事例を取り上げます。柔軟性や信頼性を高めるため、サービスメッシュの導入を決断した流れを見てみましょう。
課題
この企業は、在庫管理や決済処理、カスタマーサービスなど多岐にわたる機能をモノリシックに統合していました。業務拡大に伴いシステムが肥大化し、度重なる障害やパフォーマンス低下が顕在化しました。
そこで、機能単位で分割したマイクロサービス化を進めた結果、今度はそれぞれのマイクロサービス間の通信やセキュリティ管理が複雑化し、新たな課題となりました。そこでIstioが選択肢となったのです。
採用した技術:Istio
Istioは、トラフィック制御やセキュリティ、監視といった機能が充実している点が評価されました。特に、各マイクロサービス間の通信管理やポリシーの集約、運用データの一元管理が大きな決め手になりました。
企業が活用した具体的な機能は以下のとおりです。
導入ステップ
最初にステージング環境でIstioを検証し、問題なく動作することを確認したあと、本番システムへ段階的に適用しました。主な流れは下記の通りです。
VirtualService
やDestinationRule
を調整し、必要なルーティングポリシーを定義しました。成果
Istioの導入により、分割された多数のサービスを一元管理しやすくなり、システム全体の可用性とパフォーマンスが向上しました。また、段階的なリリースが容易になり、障害リスクを抑えながら新機能を速やかに展開できるようになりました。
このように、Istioの本番導入事例は、複雑化するマイクロサービス環境を整理し、安定した運用につなげる有効なアプローチとして注目されています。
次に、Linkerdを使った導入事例を見てみましょう。ここでは、Linkerdの開発元であるBuoyant社が、同社のマイクロサービス構成を管理するためにLinkerdをどう活用しているかを取り上げます。
Buoyant社のマイクロサービス構成
Buoyant社の内部システムでは、JavaやGo、Rubyなど、複数の言語で書かれたサービスが同時稼働しています。これらのサービス同士のやり取りを統一的に管理し、可視化し、安定性を保つのは容易ではありませんでした。
Linkerdの役割
Buoyant社は、この複雑なマイクロサービス連携をLinkerdに委ねました。各サービスと連携するサイドカーにLinkerdのプロキシを組み込み、InboundとOutbound双方の通信を管理します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: buoyant-core
spec:
replicas: 3
selector:
matchLabels:
app: buoyant-core
template:
metadata:
labels:
app: buoyant-core
spec:
containers:
- name: buoyant-core
image: buoyantio/buoyant-core:v1
ports:
- containerPort: 8080
- name: linkerd-sidecar
image: buoyantio/linkerd-sidecar:v1
ports:
- containerPort: 4140
たとえば上記のように、buoyant-core
というサービスにlinkerd-sidecar
コンテナを追加し、すべての通信をサイドカー経由とすることでトラフィックが一元管理されます。
Linkerdによる可視化
Linkerdのテレメトリ機能によって、各サービスのリクエスト数や成功率、レイテンシなどをリアルタイムで把握できます。Buoyant社の場合、linkerd viz observe
コマンドなどを使用し、主要デプロイメントごとのパフォーマンス指標を一目で確認する運用を行っています。
linkerd viz observe deployments
これにより問題が発生した際の迅速な障害切り分けが可能になりました。
耐障害性の強化
自動リトライやタイムアウト設定は、障害が疑われるサービスへの負荷を和らげ、システム全体の安定性を高めます。以下の例のようにServiceProfileを使い、特定のエンドポイントに対してリトライやタイムアウトを定義できます。
apiVersion: linkerd.io/v1alpha1
kind: ServiceProfile
metadata:
name: buoyant-core.default.svc.cluster.local
spec:
routes:
- name: GET /buoyant
condition:
method: GET
pathRegex: /buoyant
retryable: true
timeout: 1s
このように特定リクエストが失敗した場合の再試行や時間制限をリンクさせ、サービスダウン時もシステム全体を守ります。
総括
Buoyant社の実例では、Linkerdを用いてマイクロサービス間通信をコントロールし、可視化や信頼性向上につなげています。Linkerdの導入によりネットワーク周りの複雑性を吸収し、開発者は各サービスの機能拡充に注力できるようになりました。
サービスメッシュは、安全性を確保する役割でも重要視されています。IstioとLinkerdはいずれも強固なセキュリティ対策を有しますが、アプローチには違いがあります。それぞれの特徴と比較点を見てみましょう。
Istioのセキュリティは「多層防御」、「ゼロトラストネットワークの徹底」、「ID・証明書管理」の3点が軸です。
多層防御
ネットワークだけでなく、アプリや基盤自体も含めた多層的な防御を行い、万が一1つの層が破られても他の層で守る構造をとっています。
ゼロトラストネットワーク
Istioでは、通信元がどこであろうと必ず認証と認可を行い、信頼できるリクエストだけを許可するゼロトラストの考え方を貫いています。
ID・証明書管理
Istioはサービス間通信で証明書を使い、相互認証します。証明書管理の自動化によりヒューマンエラーが減り、安全性が高まります。
Linkerdもまた、mTLSのデフォルト実装やデータプレーンを堅牢化する設計、ロールベースのアクセス制御に力を入れています。
相互TLSに注力
Linkerdでは、すべてのサービス間通信をmTLSで暗号化し、やり取りする双方がお互いを信頼できる相手か検証します。
データプレーンの強化
Linkerdはプロキシ自体を簡素化し、外部への攻撃ポイントを減らすことで安全性を確保します。こうした設計により、アプリとネットワークを分離して守ります。
ロールベースのアクセス制御
Linkerdでは、特定のユーザーやサービスのみが許可されたリソースにアクセスできるよう、ロールと紐づけた権限管理を行います。
IstioとLinkerdのセキュリティ比較
セキュリティ機能 | Istio | Linkerd |
---|---|---|
多層防御 | ○ | × |
ゼロトラスト | ○ | × |
ID・証明書管理 | ○ | × |
相互TLS | ○ | ○ |
データプレーン防御 | × | ○ |
ロールベース制御 | × | ○ |
上表から分かるように、Istioは多層防御やゼロトラストを含む総合的なガードを特徴とし、Linkerdは軽量なデータプレーンとロール管理を重視しています。プロジェクトのセキュリティ要件によって、どちらを選ぶかを検討するとよいでしょう。
サービスメッシュとしてのIstioは、プロジェクトに合わせて多彩な面で調整することができます。たとえばトラフィック管理の方法やセキュリティポリシー、可観測性のレベル、拡張性などを細かく設定できます。ここでは、Istioの主なカスタマイズ例を紹介します。
トラフィック管理をカスタマイズ
Istioは標準でラウンドロビン型のロードバランシングを採用していますが、destinationRule
で設定を変えれば、ランダム方式や最小リクエスト方式なども使えます。以下はランダム方式への切り替え例です。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-destination-rule
spec:
host: my-service
trafficPolicy:
loadBalancer:
simple: RANDOM
セキュリティを強化
Istioのセキュリティは用途に応じて柔軟に設定できます。デフォルトのmTLSは「PERMISSIVE」ですが、PeerAuthentication
をSTRICT
に切り替えることで全通信を暗号化することができます。以下にその例を示します。
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
spec:
mtls:
mode: STRICT
可観測性を高める
IstioではEnvoyFilterを用いて取得するデータをコントロールできます。下記の例はリクエスト数を記録するためのEnvoyFilter設定を示しています。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: my-envoy-filter
spec:
workloadSelector:
labels:
app: my-app
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
filterChain:
filter:
name: "envoy.http_connection_manager"
patch:
operation: INSERT_BEFORE
value:
name: "envoy.filters.http.wasm"
typed_config:
"@type": "type.googleapis.com/udpa.type.v1.TypedStruct"
type_url: "type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm"
value:
config:
config:
root_id: "stats_outbound"
configuration: '{ "metrics": ["request_count"] }'
vm_config:
vm_id: "my-vm"
runtime: "envoy.wasm.runtime.v8"
code:
local:
filename: "/etc/istio/extensions/stats-filter.wasm"
拡張性を向上
WebAssembly(Wasm)を利用すれば、IstioのEnvoyプロキシに独自のフィルタを挿入可能です。たとえば次のようなEnvoyFilter設定でWasmフィルタを組み込めます。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: my-wasm-filter
spec:
workloadSelector:
labels:
app: my-app
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
filterChain:
filter:
name: "envoy.http_connection_manager"
patch:
operation: INSERT_BEFORE
value:
name: "envoy.filters.http.wasm"
typed_config:
"@type": "type.googleapis.com/udpa.type.v1.TypedStruct"
type_url: "type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm"
value:
config:
config:
root_id: "my_root_id"
vm_config:
vm_id: "my_vm"
runtime: "envoy.wasm.runtime.v8"
code:
local:
filename: "/etc/istio/extensions/my-wasm-filter.wasm"
このように、Istioはプロジェクトの個別ニーズに応じて、トラフィック制御やセキュリティ、可観測性、拡張性などを自在にカスタマイズできる柔軟なサービスメッシュです。
Linkerdもまた、必要に応じて複数の観点からカスタマイズが可能です。ここでは、Linkerdの主なカスタマイズ領域について説明します。
Linkerdコンポーネントの基本を把握する
カスタマイズを始める前に、まずLinkerdが提供する主な構成要素を理解しましょう。
コントロールプレーンの設定
Linkerdのコントロールプレーンは、設定ファイルを編集して振る舞いを調整できます。以下はその一例です。
apiVersion: install.linkerd.io/v1alpha2
kind: Linkerd
metadata:
namespace: linkerd
spec:
controllerReplicas: 1
controllerLogLevel: info
proxy:
logLevel: warn
image:
version: stable-2.11.0
ここでは、controllerReplicas
でコントロールプレーンのレプリカ数、controllerLogLevel
でログレベルを指定しています。proxy
以下ではプロキシのログレベルや使用するイメージなどを管理できます。
データプレーンの設定
データプレーンにあたるプロキシは、Kubernetes上のオブジェクトにアノテーションを付与することで挙動を変えられます。下記の例では、プロキシのログレベルをdebug
に設定しています。
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
config.linkerd.io/proxy-log-level: debug
spec:
template:
metadata:
annotations:
config.linkerd.io/proxy-log-level: debug
インバウンド・アウトバウンド設定
Linkerdではトラフィックの入り口・出口を自由に設定可能です。ServiceProfile
リソースを活用することで、ルート単位で細かい挙動やメトリクス収集、リトライ設定を調整できます。
サービスプロファイルの活用
linkerd profile
コマンドを使うと、サービス単位のルートメトリクスやリトライなどを定義する雛形を生成できます。下記例のように実行します。
linkerd profile --template web-svc > web-svc-profile.yaml
これによりweb-svc
サービスのServiceProfileのテンプレートが作成され、必要に応じて微調整できます。
トラフィックスプリットによる負荷調整
TrafficSplit
というリソースを作成し、サービスごとのトラフィック分配を制御できます。たとえば以下の例では、web-svc
に対し90%をweb-svc-v1
、10%をweb-svc-v2
に振り分けています。
apiVersion: split.smi-spec.io/v1alpha1
kind: TrafficSplit
metadata:
name: traffic-split
spec:
service: web-svc
backends:
- service: web-svc-v1
weight: 90
- service: web-svc-v2
weight: 10
この設定により、新しいバージョンの機能テストや段階的リリースなどが実現できます。
このように、Linkerdは各コンポーネントの設定やアノテーション、独自リソースを通じて微調整し、自分のプロジェクトに合わせたメッシュを設計できます。
マイクロサービスが広がるにつれ、IstioやLinkerdのようなサービスメッシュソリューションは大企業からスタートアップまで幅広く取り入れられています。ここでは、それぞれを採用している代表企業を見ていきます。
Istio:導入実績のある主要企業
Google、IBM、Lyftなどの大手企業が支援するIstioは、多様な分野で活用されています。具体的には:
Linkerd:導入実績のある主要企業
一方、Cloud Native Computing Foundation(CNCF)のLinkerdには、次のような大手企業事例があります。
Istio vs Linkerdの採用動向
CNCFの調査(2020年)ではIstioが約27%の導入率、Linkerdが約12%とIstioの方が優勢とされています。しかし、この分野は急速に変化しており、どちらにも大手ユーザーが多い点は共通しています。
総合的に見ると、Istioは多機能性を求める企業が好み、Linkerdはシンプルさとパフォーマンスを重視する企業に支持されていると言えます。
テクノロジーの将来像を知るには、それぞれのロードマップが参考になります。IstioとLinkerdの開発チームが公開している今後の方針や改良予定から、サービスメッシュがどの方向に進むのかを探ってみましょう。
Istioのロードマップ
Istioは以下に示すような分野に力を入れ、より包括的なサービスメッシュを目指しています。
Linkerdのロードマップ
Linkerdはシンプルさを保ちつつ、性能と機能を磨く姿勢を取り続けています。
IstioとLinkerdのロードマップ比較
Istio | Linkerd |
---|---|
パフォーマンス & 拡張性 | 使いやすさ |
使いやすさ | 性能 |
セキュリティ | セキュリティ |
他クラウドとの連携 | 可観測性 |
両メッシュとも性能やセキュリティの向上を共通テーマに据えていますが、Istioはクラウドネイティブとの統合性、Linkerdはシンプルさと可観測性をより強化する方向に注力していると言えます。
IstioとLinkerdの力をどちらに借りるべきか迷う場合、チェックすべきポイントは多岐にわたります。ここでは、選定における主な判断基準を示します。
まずは要件を整理する
最初に自社のマイクロサービス規模や複雑度、パフォーマンス要件、セキュリティ要件を整理しましょう。高機能かつ高度なトラフィック管理が必要ならIstioが有力ですし、導入や運用のシンプルさを最優先したいならLinkerdに軍配が上がります。
巨大なマイクロサービス群を扱う場合、Istioはさまざまな機能を備えておりスケールにも強いです。Linkerdは軽快なのでパフォーマンス面を重視する場合に向いています。
セキュリティも重要な観点です。どちらも相互TLSなどの基本はカバーしていますが、より高度な管理が必要ならIstioのほうが細かい設定まで行いやすいでしょう。
IstioとLinkerdの持ち味を比較
主要機能を表に簡単にまとめました。
項目 | Istio | Linkerd |
---|---|---|
トラフィック制御 | 高度 | 基本 |
セキュリティ | 高度 | 基本 |
可観測性 | 高度 | 基本 |
パフォーマンス | 優秀 | さらに優秀 |
複雑さ | 高い | 低い |
スケーラビリティ | 優秀 | 良好 |
Istioは高機能で拡張性がある一方、使いこなすには学習コストがかかります。Linkerdは実装が簡潔で、性能面でも利点が大きいです。
学習コストにも注目
Istioは機能が豊富な反面、ドキュメントや設定項目が多いため学習に時間がかかりがちです。Linkerdは設計思想がシンプルで始めやすいという利点があります。
コミュニティサポートの差
コミュニティ規模はIstioのほうが大きいとされています。困ったときに情報を得やすい点ではIstioが有利ですが、Linkerdも活発なコミュニティを持っており、今後の伸びが期待されます。
つまり最終的にはプロジェクトの優先度やチームのスキルレベル、求める機能を総合的に考慮して決める必要があります。機能やセキュリティを最重視するならIstio、軽量かつ高速で使いやすさを重視するならLinkerdを選ぶとよいでしょう。
サービスメッシュとして人気を集めるIstioとLinkerdですが、それぞれに特有の課題やつまずきやすいポイントがあります。ここでは代表的な問題点と、それに対する対処法をまとめます。
Istioの課題と解決策
1. 設定の複雑さ:高度な機能が多いため、初心者には設定内容が煩雑に感じられます。
対策:公式ドキュメントを段階的に読み進めるほか、各機能を小分けに学習するのが効果的です。コミュニティフォーラムも活用しましょう。
2. パフォーマンス低下:豊富な機能をフルに使うと、潜在的にレイテンシ増加のリスクが生じます。
対策:負荷テストを継続的に行い、必要な機能のみを有効化します。ポリシーや計測項目を取捨選択すると効果的です。
3. デバッグの難しさ:分散システムを制御するという性質上、障害発生時の原因追跡が複雑になりやすいです。
対策:Istioのログやトレーシング機能を適切に設定し、問題発生時にすばやくデータを取得できるように準備しておきましょう。
Linkerdの課題と解決策
1. ポリシー機能の限定:Istioほど豊富なポリシー制御がないため、細かい条件分岐が必要な場面をカバーしにくいです。
対策:周辺ツールと連携して補う、もしくはLinkerdが許容する範囲でポリシーをシンプル化します。
2. ドキュメントの情報不足:Istioと比べると資料量が少なく、詳細な設定例を探すのが難しい場合があります。
対策:SlackやDiscourseなどのコミュニティで質問し、実際に試したユーザーの事例を参考にするのが近道です。
3. 対応言語の制約:Rust製プロキシを活かすための言語的な制約があり、Istioに比べると適用範囲がやや狭いと感じることもあります。
対策:必要な言語がLinkerdで十分にサポートされているか事前に要確認し、難しい場合は別のサービスメッシュを検討します。
Istio vs Linkerd:課題対策まとめ
課題点 | Istio | Linkerd |
---|---|---|
設定の複雑さ | 高 | 低 |
パフォーマンス低下 | 可能性大 | 可能性小 |
デバッグの難易度 | 中 | 低 |
ポリシーサポート | 豊富 | やや限定 |
ドキュメント量 | 多い | やや少ない |
言語サポート | 広い | 限定 |
こうした特性を踏まえたうえで、自社の要件や技術スタックに合うかを見極めると、将来のトラブルを回避しやすくなります。
技術選定の際、コミュニティの充実度も大事なポイントです。IstioとLinkerdはどちらもオープンソースプロジェクトであり、世界中のユーザーが貢献しています。以下では両者のコミュニティ活動を比較します。
Istioのコミュニティは非常に活発で、開発者や運用担当者、愛好家が多様な形で参加しているのが特徴です。
ディスカッションの場
GoogleグループのIstio DiscussやSlackチャンネルを中心に、技術的な質問や情報交換が行われています。
ドキュメント情報
公式サイトのドキュメントやチュートリアルが充実しており、英語リソースも多いです。定期的に更新されるため、最新機能を追いやすくなっています。
コードへの貢献
オープンソースとして自分でコードを修正したり、新機能を提案することが可能です。ガイドラインもしっかり整備されています。
Linkerdのコミュニティも、ユーザーフレンドリーでコンパクトながら熱量の高いメンバーが多いです。
ディスカッションの場
SlackのLinkerdチャンネルやDiscourseフォーラムで、導入相談や技術的な質問が気軽に行われています。
ドキュメント情報
Istioほどの分量はないものの、Linkerd公式ドキュメントには導入方法やサンプルが分かりやすく掲載されています。
コードへの貢献
こちらもオープンソースで、コードの修正やドキュメント改善に貢献できます。開発チームとの距離も近く、意見を反映しやすいです。
コミュニティ比較
コミュニティ要素 | Istio | Linkerd |
---|---|---|
ディスカッション | 盛ん | 盛ん |
ドキュメント量 | 充実 | 充実 |
オープンソース貢献 | 可能 | 可能 |
Istioは大規模プロジェクトゆえにユーザーが多く、情報が探しやすい反面、Linkerdもコンパクトながら活発な開発が進んでおり、どちらも魅力的なコミュニティを形成しています。
結局のところ、IstioとLinkerdはどちらも優秀なサービスメッシュ技術ですが、どちらが合うかはプロジェクトの要件やチームのスキル、企業の優先項目次第です。
プロジェクトの要件を洗い出す
大規模かつ複雑な環境で高度なトラフィック制御やセキュリティ、詳細なテレメトリを必要とするなら、Istioが強力な選択肢になります。一方、軽量かつ管理しやすいアプローチを探していて、リソース効率や導入の手軽さを重視する場合はLinkerdが向いています。
チームの習熟度も考慮する
Istioを使いこなすには学習コストが高い一方、幅広い機能を活かせるメリットがあります。Linkerdはシンプルさが魅力で、学習のハードルが低めです。
ビジネス戦略との整合性
厳格なコントロールと高度な機能拡張を重視する企業はIstioを選ぶ傾向があり、煩雑さを避け、運用を軽くしたい企業はLinkerdを好むケースが多いでしょう。
このように、どちらかが絶対に正解というわけではなく、あくまでプロジェクトと照合したうえでベストマッチを探すことが肝心です。要件やチーム体制、戦略目標に照らし合わせ、IstioとLinkerdそれぞれの特長を活かせる選択をするのが理想です。
最新情報を購読