Carpe Diem

備忘録

Envoy

IstioやEnvoyで発生するネットワーク系エラー

背景 マイクロサービス環境でIstio(Envoy sidecar)を使っていると、いくつかのエラーに遭遇します。 それぞれどういった状況で発生しているエラーなのかを区別できないと、適切な対応にならないため各種エラーをまとめます。 環境 Envoy 1.22.0 Go 1.21 構成…

IstioのDestination RuleでCircuit Breakerを適用する

概要 christina04.hatenablog.com ではEnvoyでのCircuit Breakerの設定や挙動について説明しました。 IstioではDataPlaneにEnvoyを使っているので同じ様にCircuit Breakerを使えますが、設定するコンポーネントとしてはDestination Ruleになります。 Istio /…

KubernetesのPodを安全に終了する(istio-proxy編)

概要 前回KubernetesのPodの安全な終了方法について図を交えて解説しました。 christina04.hatenablog.com 今回はistio-proxy(envoy sidecar)がある場合の安全な終了方法について説明します。 環境 Kubernetes v1.21.14 Istio 1.16.0 Envoy 1.24.1

Envoyで重み付き負荷分散を試してみる

概要 christina04.hatenablog.com の中でconfig.route.v3.RouteActionに重み付き負荷分散(weighted load balancing)の設定がありました。 これを利用することで カナリアリリース リクエストのサンプリング 一部だけ詳細なログやstatsを出す Mountebankのよ…

EnvoyのVirtual hostを読み解く

概要 EnvoyのルーティングはListener > Network filter chain > HCM(HTTP connection manager)のVirtual Hostで適用されます。 設定の一部は配列で複数設定することができますが、ものによっては 一致率が高いものから順に適用する(完全一致→部分一致→ワイ…

Envoyで自動リトライ

概要 ネットワーク越しの通信は基本的に不安定であるため、外部APIとの通信で発生したエラーを都度クライアントに返すとエラー率が上がってしまいユーザ体験が悪くなってしまします。 そこでクライアントに返す前に何度かリトライすることで、エラー率を下げ…

Envoy の Adaptive Concurrency で動的に流量制限をする

概要 christina04.hatenablog.com で説明したように、Circuit Breakerのパラメータ調整は大変です。 実際のキャパシティよりパラメータを小さくしてしまうと、リソースはまだ余裕があるのにOpenしていまいます。 逆にパラメータが大きすぎると、Openが遅れサ…

EnvoyのYAMLの読み方

概要 Envoyのyamlは非常に長大で初めて読む人からするととても分かりにくいです。 しかし実際は各要素の役割を理解するととてもシンプルに構成されていることが分かります。 そのための手助けとしてこちらで図を交えながら説明します。 環境 Envoy 1.22.0 要…

外部サービスへのリクエストにEnvoyのCircuit Breakerを設定する

概要 サービスの信頼性を高めるため、依存するマイクロサービスが落ちても障害範囲をそこだけに留め、それ以外のマイクロサービスは稼働し続けるのが理想です。 自分たちのサービスであれば各マイクロサービスにCircuit Breakerを設定することで、スローダウ…

Envoy Circuit Breakerの挙動を確認する

背景 EnvoyにはCircuit Breakerがあり、依存するサービスがスローダウンした際にそれ以上リクエスト送らず即座に503を返すことでサービスが死なないようにする仕組みがあります。 しかしパラメータの調節が難しく、期待した挙動にならないことが多いため1つ…

KubernetesでEnvoyを使ったSidecarパターンを実装

概要 前回書いた構成をKubernetesで実装してみます。 christina04.hatenablog.com 環境 minikube v0.26.1 kubernetes v1.10.0 成果物 今回のソースです。 github.com

マイクロサービスでのSidecarパターンとは何か

概要 マイクロサービス化したシステムを運用する上で出てくる課題を解決するパターンとしてService Meshというものがあります。 このService Meshというものは以下の2つのコンポーネントで構成されます。 Data plane アプリケーションの代わりにネットワー…

EnvoyのFrontProxyを用意してgRPCの負荷分散をする

概要 gRPCはHTTP/2プロトコルをベースとしたRPCです。 なのでコネクションが永続化され、その中で複数のストリームがリクエスト・レスポンスを取り扱うため負荷分散に注意する必要があります。 今回はEnvoyというgRPCに向いたproxyを使うことでそれを実現し…