マイクロサービス・ネットワーキングに潜む複雑さ
Kubernetesでのマイクロサービス管理は、本番環境に投入するまでは「ハネムーン期間」のように順調に感じられるものです。しかし、あるサービスが突然503エラーを吐き出したり、セキュリティ監査人から内部ポッド間の通信をどう暗号化しているか説明を求められたりした途端、状況は一変します。標準的なKubernetesネットワーキングが、完全にブラックボックスであることに気づかされるのです。
私は、多くのチームが次のような基本的な問いに答えられず苦労する姿を見てきました。「なぜサービスAが失敗しているのか?」「なぜサービス間のレイテンシが突然200msも急上昇したのか?」「内部通信で本当にTLSが使われているのか?」 従来、開発者はコードにロギングやリトライ処理を組み込むことでこれを解決しようとしてきました。しかし、これはメンテナンスの悪夢を招きます。言語スタックごとに独自のカスタム実装が必要になり、クラスター全体で一貫性のない挙動につながるからです。
Kubernetesはコンテナのオーケストレーションを見事にこなしますが、L7(アプリケーション層)のネットワーキングとセキュリティは完全にユーザー任せです。Istioが最も一般的な推奨策として挙げられますが、その複雑さは多くの場合オーバースペックです。ほとんどのチームは、サービスメッシュを管理するためだけに専任のエンジニアを必要とはしていません。彼らが求めているのは、設定不要ですぐに機能するセキュリティと可視性です。
ここでLinkerdが真価を発揮します。Linkerdは、スピードとシンプルさを追求して設計された「超軽量」サービスメッシュです。私の経験上、Linkerdは急な学習曲線を必要とせず、クラスターの安定性を保ちながらトラフィックに関する深い洞察を即座に提供してくれます。
なぜLinkerdなのか? 10MBという選択肢
Linkerdは「万能ナイフ」になろうとはしません。その代わりに、シンプルさ、パフォーマンス、セキュリティの3点に集中しています。多くのサービスメッシュはEnvoyプロキシを採用していますが、Envoyは強力な反面、リソース消費が激しいのが難点です。一方、LinkerdはRustで書かれた専用のマイクロプロキシを使用しています。これによりメモリ安全性が確保され、フットプリントを極めて小さく抑えることができます。Envoyベースのメッシュでは50MB以上のRSSを消費することも珍しくありませんが、Linkerdのプロキシは通常10MB程度です。
真の魔法は、自動化された相互TLS(mTLS)にあります。Linkerdは、メッシュ化されたポッド間のすべてのTCPトラフィックに対して、デフォルトでmTLSを提供します。証明書を触ったり、シークレットを管理したりする必要は一切ありません。LinkerdがバックグラウンドでIDの発行と更新のプロセスをすべて処理し、リクエストへのp99レイテンシの影響を1ms未満に抑えます。
ステップ1:環境の準備
まず、ローカルマシンにLinkerd CLIをインストールする必要があります。このツールは、クラスターの検証、コントロールプレーンのインストール、メッシュとの対話を担当します。
# macOS/Linuxにインストール
curl -sL https://run.linkerd.io/install | sh
# PATHに追加
export PATH=$PATH:$HOME/.linkerd2/bin
# 動作確認
linkerd version
クラスターに何かをインストールする前に、プリチェックコマンドを実行してください。これにより、権限やクラスターの機能が検証され、後でインストールの失敗に悩まされるのを防ぐことができます。
linkerd check --pre
ステップ2:コントロールプレーンのインストール
Linkerdのインストールは、カスタムリソース定義(CRD)とコア・コントロールプレーンの2つのフェーズに分かれています。この分離により、Kubernetesリソースのライフサイクル管理が非常に容易になります。
まず、CRDをインストールします:
linkerd install --crds | kubectl apply -f -
次に、コアコンポーネントをデプロイします:
linkerd install | kubectl apply -f -
コマンドが完了したら、コンポーネントが安定するまで待ちます。初期セットアップでは、HelmよりもCLIを使用することをお勧めします。特定の環境で問題が発生した場合、CLIの方がより詳細なフィードバックを得られるからです。
linkerd check
ステップ3:Linkerd-Vizによる即時のオブザーバビリティ
基本的なリクエストレートを確認するためだけにPrometheusやGrafanaをセットアップするのは大変な手間です。Linkerdはviz拡張機能でこの問題を解決します。これには、事前設定済みのPrometheusインスタンスと、「ゴールデンメトリクス」(成功率、リクエストレート、レイテンシ)を追跡するダッシュボードが含まれています。
# Viz拡張機能をインストール
linkerd viz install | kubectl apply -f -
# インストールの検証
linkerd viz check
これで、コマンド1つでクラスター全体のリアルタイムなヘルスダッシュボードを開くことができます:
linkerd viz dashboard &
ステップ4:アプリケーションのメッシュ化とmTLSの自動化
Linkerdは「サイドカー」パターンを使用し、アプリケーションと並行して小さなプロキシを実行します。自動的にポッドを乗っ取ることはありません。サービスをメッシュに追加するには、名前空間または特定のデプロイメントにアノテーションを追加するだけです。これはリスクの低いオプトイン方式です。
既存のアプリケーションにLinkerdを注入するには、次のパイプを使用します:
kubectl get -n your-namespace deploy -o yaml | \
linkerd inject - | \
kubectl apply -f -
linkerd injectコマンドは、単純なアノテーション linkerd.io/inject: enabled を追加します。Kubernetesがポッドを作成するとき、Linkerdのアドミッションコントローラーがこれを検知し、自動的にプロキシをアタッチします。その瞬間から、そのサービスへのすべてのトラフィックはmTLSを介して暗号化されます。コードの変更は一切不要です。
ステップ5:セキュリティとトラフィックの検証
mTLSが実際に機能しているかどうか、どうすれば確認できるでしょうか? Linkerdには、ライブトラフィックのヘッダーを検査できるtap機能が含まれています。これは、マイクロサービス用のtcpdumpを、煩わしさなしに利用できるようなものです。
# デプロイメントのライブトラフィックを監視
linkerd viz tap deployment/my-service
接続が安全であることを確認するには、edgesコマンドを使用します。これにより、名前空間内のすべてのサービス間のセキュリティステータスが表示されます。
linkerd viz -n your-namespace edges deployment
SERVER_ID列に注目してください。ターゲットサービスのIDが表示されていれば、トラフィックは暗号化されています。空白の場合、トラフィックはまだプレーンテキストのままです。通常、これは送信先がまだメッシュ化されていないことが原因です。
実践的なメンテナンスのヒント
Linkerdを本番環境で運用するのは簡単ですが、以下の3点に注意してください:
- リソース制限の設定: プロキシは軽量ですが、境界線は必要です。私は通常、ベースラインとして0.1 CPUと64MBのRAMを割り当てます。数千の同時接続を処理する場合は、より多くのメモリを消費する可能性があります。
- 証明書更新の自動化: Linkerdのデフォルトのトラストアンカーは1年で期限切れになります。クラスターを停止させないよう、
cert-managerを使用して、期限が切れる前にこれらの証明書を自動的に更新(ローテーション)するようにしてください。 - スモールスタート: まずは単一のステージング用名前空間をメッシュ化します。本番環境に展開する前に、レイテンシ(ミリ秒未満のはずです)を監視してください。
Linkerdは、サービスメッシュが負担である必要はないことを証明しています。セキュリティ、可視性、信頼性という本質に集中することで、いくつかのシンプルなコマンドで複雑なネットワーキングの問題を解決します。これにより、インフラの配管工事を修理するのではなく、機能の構築に専念できるようになります。

