Linkerd 2.10(ステップバイステップ)—デバッグサイドカーを使用してネットワークパケットをキャプチャする

Linkerd 2.10 チュートリアルシリーズ

  • Linkerd v2.10 Service Mesh の基礎から始める
  • 腾訊クラウド Kubernetes クラスターでの Service Mesh 実装例(Linkerd2 & Traefik2)
  • Linkerd 2.10 の基本機能を深く理解する
  • サービスを Linkerd に登録する方法
  • 自動化されたカナリヤリリースの実装
  • コントロールプレーンのTLS証明書自動更新とWebhook設定
  • 外部Prometheusインスタンスの設定方法
  • 代理サーバーの並列処理設定
  • リトライポリシーの構成
  • タイムアウト設定の最適化
  • コントロールプレーンのデバッグエンドポイント
  • KustomizeでLinkerd設定をカスタマイズする
  • Linkerdによる分散トレーサビリティの実装
  • 502エラーのデバッグ手順
  • HTTPアプリケーションのルートごとのメトリクス分析
  • gRPCアプリケーションのリクエストトレースによるデバッグ
  • メトリクスデータのエクスポート
  • ダッシュボードの公開方法
  • 自作のmTLSルート証明書生成
  • ルートごとのメトリクス取得
  • チャオスエンジニアリングによる障害注入
  • ポッドのスムーズな終了処理
  • イングラストラフィックの管理
  • マルチクラスター構成の導入
  • Linkerdのインストール手順
  • HelmによるLinkerdのインストール方法
  • LinkerdとPodセキュリティポリシー(PSP)の連携
  • コントロールプレーンTLS証明書の手動更新
  • 代理サーバーのログレベル変更
  • マルチクラスター間通信の構築
  • GitOpsとLinkerd/Argo CDの統合

Linkerd 2.10 中文マニュアルは以下より入手可能です:

サービスメッシュのデバッグは複雑なプロセスです。何かが動作しない場合、問題はプロキシ、アプリケーション、クライアント、またはネットワーク側にある可能性があります。このような状況では、原始的なネットワークデータの確認が有効です。

アプリケーションの入出力パケットに対するネットワークレベルの可視性が必要な場合は、Linkerdはdebug sidecarというユーティリティを提供しています。proxy sidecar injectionと同様の仕組みで、podの作成時にconfig.linkerd.io/enable-debug-sidecar: "true"というアノテーションを設定することで、debug sidecarを注入できます。linkerd injectコマンドには--enable-debug-sidecarオプションがあり、このアノテーションを自動で付与できます。

(注意:KubernetesのPod内のコンテナは変更不可能なため、既存のPodにこのアノテーションを追加しても効果はありません。Pod作成時にアノテーションを含める必要があります。)

debug sidecarイメージにはtsharktcpdumplsofiproute2などのツールが含まれています。起動後、自動的にtsharkを使用してすべての入出力トラフィックを記録し、kubectl logsで確認できます。またはkubectl execでコンテナに接続し、直接コマンドを実行することも可能です。

例えば、Linkerdの入門ガイドを参照し、emojivotoアプリケーションをインストールした後、votingサービスのトラフィックをデバッグしたい場合、以下のコマンドを実行します:

kubectl -n emojivoto get deploy/voting -o yaml \
  | linkerd inject --enable-debug-sidecar - \
  | kubectl apply -f -

このコマンドにより、votingサービスのすべてのPodにdebug sidecarコンテナがデプロイされます。(注意:このデプロイでは1つのPodしか存在しないため、再作成される点にご注意ください。)

voting-svcタグを持つPodにデバッグコンテナが正常に動作しているかは、以下のコマンドで確認できます:

kubectl get pods -n emojivoto -l app=voting-svc \
  -o jsonpath='{.items[*].spec.containers[*].name}'

リアルタイムでtsharkの出力を確認するには以下を実行します:

kubectl -n emojivoto logs deploy/voting linkerd-debug -f

さらに、execコマンドでコンテナに接続し、独自のネットワークコマンドを実行することも可能です。例えば、HTTPリクエストヘッダーを確認するには:

kubectl -n emojivoto exec -it \
  $(kubectl -n emojivoto get pod -l app=voting-svc \
    -o jsonpath='{.items[0].metadata.name}') \
  -c linkerd-debug -- tshark -i any -f "tcp" -V -Y "http.request"

プロキシによって生成されるdebug sidecarは、トラブルシューティングにおいて実際的なエラーメッセージとしてConnection Refusedが発生することがあります。以下のようなエラーメッセージが表示された場合:

ERR! [<time>] proxy={server=in listen=0.0.0.0:4143 remote=some.svc:50416}
linkerd2_proxy::app::errors unexpected error: error trying to connect:
Connection refused (os error 111) (address: 127.0.0.1:8080)

この場合、特定のポート間のトラフィックを監視するようにtsharkコマンドを変更します:

kubectl -n emojivoto exec -it \
 $(kubectl -n emojivoto get pod -l app=voting-svc \
  -o jsonpath='{.items[0].metadata.name}') \
  -c linkerd-debug -- tshark -i any -f "tcp" -V \
  -Y "(tcp.srcport == 4143 and tcp.dstport == 50416) or tcp.port == 8080"

また、Connection reset by peerというエラーも同様のパターンです。アプリケーションログに該当するエラーメッセージが見られない場合は、このエラーは通常無害です。そのような場合、デバッグコンテナはエラーメッセージの解消には役立たない可能性があります。

ERR! [<time>] proxy={server=in listen=0.0.0.0:4143 remote=some.svc:35314}
linkerd2_proxy::app::errors unexpected error: connection error:
Connection reset by peer (os error 104)

当然ながら、これらの例はKubernetesクラスター内の任意のコンテナにexecできる環境でのみ有効です。この方法の代替としてlinkerd tapコマンドも利用可能です。

タグ: Linkerd Kubernetes Service Mesh Debug Sidecar tshark

7月18日 17:07 投稿