使用Litmus Chaos构建更强大的Apache APISIX Ingress Controller
May 4, 2023
概要
カオスエンジニアリングは、ソフトウェアシステムの回復力と信頼性を評価し、向上させる上で重要な役割を果たします。破壊的なイベントをシミュレートすることで、組織は脆弱性を特定し、システムの設計とアーキテクチャを改善できます。この記事では、カオスエンジニアリングの重要性と、Ingressコントローラーの設計における具体的な応用について説明します。
なぜカオスエンジニアリングが必要なのか?
カオスエンジニアリングは、サーバーネットワークの停止やAPIのスロットリングなどの破壊的なイベントをシミュレートして、ソフトウェアシステムを評価するプロセスです。システム内にカオスや障害を導入することで、不安定で予期しない条件下でのシステムの回復力と信頼性をテストできます。
カオスエンジニアリングは、安全な制御環境で現実世界のシナリオをシミュレートすることで、分散システムにおける隠れたリスクを特定し、脆弱性を監視し、パフォーマンスのボトルネックを特定するのに役立ちます。このアプローチは、システムのダウンタイムや生産中断を効果的に防ぎます。
Netflixのシステム対応方法は、より科学的なアプローチを採用することを私たちにインスピレーションを与え、カオスエンジニアリングの誕生と発展を促しました。
1. 破壊的なイベントの導入
カオスエンジニアリングでは、ネットワークの分断、サービスの劣化、リソースの制約などの破壊的なイベントを導入し、現実世界のシナリオをシミュレートして、システムが予期しない条件に対処する能力をテストします。その目的は、脆弱性や弱点を特定し、システムの設計とアーキテクチャを改善して、より堅牢で回復力のあるものにすることです。
2. システムの回復力のテスト
今日の絶えず進化し、急速に変化する技術環境において、システムの回復力をテストすることは、システムが堅牢でスケーラブルであり、予期しない課題や条件に対処できることを保証するために重要です。カオスエンジニアリングは、破壊的なイベントを導入してシステムの応答を観察し、予期しない条件に対処する能力を測定する効果的な方法です。
組織は、システムログ、パフォーマンスメトリクス、ユーザーエクスペリエンスを監視して、破壊的なイベントがシステムの回復力に与える影響を測定できます。これらのメトリクスを追跡することで、システムの動作をよりよく理解し、改善すべき領域を特定できます。
3. 隠れた問題の発見
分散システムは、データ損失、パフォーマンスのボトルネック、通信エラーなどの隠れた問題が発生しやすく、これらはシステムが圧力下にあるときにのみ明らかになることがあるため、検出が難しい場合があります。カオスエンジニアリングは、破壊的なイベントを導入することでこれらの隠れた問題を明らかにするのに役立ちます。この情報を使用して、システムの設計とアーキテクチャを改善し、より回復力があり信頼性の高いものにすることができます。
これらの問題を積極的に特定し解決することで、システムの信頼性とパフォーマンスが向上し、ダウンタイムを防ぎ、データ損失のリスクを減らし、システムがスムーズに動作することを保証できます。
4. その価値と必要性
分散システムは複雑で、本質的にカオスが発生しやすく、それが失敗につながることがあります。クラウドとマイクロサービスアーキテクチャの使用は多くの利点を提供しますが、複雑さとカオスも伴います。エンジニアは、システムを可能な限り信頼性の高いものにする責任があります。
テストを行わなければ、プロジェクトを本番環境で使用する自信がありません。従来のユニットテストやエンドツーエンドテストに加えて、カオステストを導入することで、システムをより堅牢にすることができます。
エラーが発生した場合、修復には時間がかかり、計り知れない損失を引き起こす可能性があり、将来的に長期的な影響を及ぼすことがあります。修復プロセスでは、システムの複雑さ、エラーの種類、および可能な新しい問題など、さまざまな要素を考慮して、最終的な修復が効果的であることを確認する必要があります。
さらに、オープンソースプロジェクトが本番環境でユーザーに重大な障害をもたらす場合、多くのユーザーが他の製品に切り替える可能性があります。
Ingressコントローラーのカオス実験を設計する方法
1. Ingressとは何か?
Ingressは、外部クライアントがクラスター内のサービスにアクセスする方法に関するルールを含むKubernetesリソースオブジェクトです。これらのルールは、どのクライアントがどのサービスにアクセスできるか、クライアントのリクエストが適切なサービスにどのようにルーティングされるか、およびクライアントのリクエストがどのように処理されるかを決定します。
2. Ingressコントローラーとは何か?
Ingressリソースを処理するには、Ingressコントローラーが必要です。コントローラーは、Ingressルールをプロキシ上の設定に変換し、外部クライアントがクラスター内のサービスにアクセスできるようにします。本番環境では、Ingressコントローラーは、アクセス元やリクエスト方法の制限、認証、認可などの複雑な機能を持つ必要があります。ほとんどのIngressコントローラーは、Ingressリソースの注釈を通じてIngressのセマンティクスを拡張します。
3. Apache APISIX Ingressコントローラーとは何か?
Apache APISIX Ingressコントローラーは、管理者がIngressトラフィックを管理および制御するのに役立つ特殊なタイプのロードバランサーです。APISIXをデータプレーンとして使用し、ユーザーに動的ルーティング、ロードバランシング、弾力的なスケーリング、セキュリティポリシーなどの機能を提供し、ネットワーク制御を改善し、ビジネスの可用性とセキュリティを高めます。APISIX Ingressコントローラーは、Kubernetes Ingress、カスタムリソース、およびGateway APIの3つの設定モードをサポートします。
4. Litmus Chaosとは何か?
Litmus Chaosは、オープンソースのカオスエンジニアリングフレームワークで、コントローラーやマイクロサービスアーキテクチャの安定性を検証するためのインフラストラクチャ実験フレームワークを提供します。コンテナレベルやアプリケーションレベルの環境、自然災害、障害、アップグレードなど、さまざまな環境をシミュレートして、システムがこれらの変化にどのように応答するかを理解できます。このフレームワークは、コントローラーとアプリケーション間の動作の変化や、特定の状態でのコントローラーの応答を探ることもできます。Litmus Chaosは、便利な可観測性統合機能を提供し、非常に拡張性が高いです。
5. カオス実験を設計する方法
以下は、どのシナリオでもカオス実験を設計するための一般的な手順です:
- テスト対象のシステムを定義する: 実験したいシステムの特定のコンポーネントを特定し、実験の明確で測定可能な目標を設定します。これには、ハードウェアやソフトウェアなどのテスト対象のコンポーネントの包括的なリストを作成し、実験の範囲と期待される結果を定義することが含まれます。
kube-apiserver: 例外が発生した場合、Ingressリソースの書き込みに失敗します。 Ingress-controller: ネットワーク中断、クラッシュ、Pod障害、I/O data-plane: ネットワーク中断、クラッシュ、Pod障害、I/O
- 適切な実験を選択する: 設定した目標に合致し、現実世界のシナリオに近い実験を選択します。これにより、実験が意味のある結果を生み出し、システムの動作を正確に反映することが保証されます。
- 仮説を立てる: 実験中にシステムがどのように動作し、どのような結果が予想されるかについての仮説を立てます。これは経験や研究に基づいており、合理的でテスト可能である必要があります。
- 実験を実行する: 本番システムへの潜在的な損害を制限するために、ステージング環境などの制御された環境で実験を実行します。実験中にすべての関連データを収集し、安全に保存します。実験を直接本番環境で行うべきかどうかについては異なる意見があるかもしれません。しかし、ほとんどのシナリオでは、システムのサービスレベル目標(SLO)が満たされていることを確認する必要があります。
- 結果を評価する: 実験の結果を評価し、仮説と比較します。収集したデータを分析し、観察や発見を文書化します。これには、予期しない結果や不一致を特定し、それらがシステムにどのように影響するかを判断することが含まれます。さらに、実験の結果をシステムの改善にどのように活用できるかを検討します。
Ingressコントローラーの主な使用シナリオ
Ingressコントローラーの最も重要な機能は、トラフィックをプロキシすることであり、他のすべての機能はこのコア機能に基づいています。したがって、カオスエンジニアリングを行う際には、通常のトラフィックプロキシが重要な指標です。
APISIX Ingressコントローラーのテスト対象システムを定義するために、ユーザーはIngress、Gateway API、またはCRDなどのルート設定を作成し、Kubectlを介してKubernetesクラスターに適用する必要があります。このプロセスは、kube-apiserverを経由して認証、認可、アドミッションなどの関連手順を経て、etcdに保存されます。
APISIX Ingressコントローラーは、Kubernetesリソースの変更を継続的に監視します。これらの設定は、データプレーン上の設定に変換されます。クライアントがデータプレーンにリクエストを送ると、ルーティングルールに従ってアップストリームサービスにアクセスします。
kube-apiserverに例外が発生した場合、設定が作成されないか、Ingressコントローラーが正しい設定を取得できない可能性があります。同様に、データプレーンに例外が発生した場合、ネットワーク中断やPodの強制終了など、通常のトラフィックプロキシができなくなります。
私たちの実験の範囲は、主にIngressコントローラーに例外が発生した場合のシステムの可用性への影響です。
1. 詳細な操作手順
- 適切な実験を選択する: エンドツーエンドテストを通じて、多くの誤った設定のシナリオをカバーできます。主にカオスエンジニアリングを通じて、IngressコントローラーがDNSエラー、ネットワーク中断、Podの強制終了などの例外に遭遇した場合に、データプレーンが通常のトラフィックプロキシを続けられるかどうかを検証できます。
- 仮説を立てる: 各シナリオに対して、「Ingress-controller Podが
X?
になった場合、クライアントのリクエストが正常な応答を得られる」などの仮説を立てることができます。 - 実験を実行する: 実験と変数が決定されたので、あとは実験を実行するだけです。
Litmus Chaosは、実験を行うためのさまざまな方法を提供します。Litmus Portalを通じてこれを行うことができます。これを行うには、カオスシナリオを作成し、実験対象のアプリケーションを選択する必要があります。これらの手順は比較的簡単ですが、Litmus ChaosにはProbesリソースが含まれていることに注意する必要があります。
Probesは、ChaosExperiment内で定義可能なプラグ可能なチェックで、実験ポッドは定義されたモードに基づいてこれらのチェックを実行し、実験の判定に必要な条件としてその成功を考慮します。標準の組み込みチェックに加えて、これらのチェックも考慮されます。 同時に、実験をスケジュールすることもでき、これは非常に貴重な機能です。
さらに、Litmus Chaosは、YAMLマニフェストを提出して実験を実行することもサポートしています。
- 結果を評価する: Litmus Chaosには組み込みの統計レポートがあり、PrometheusとGrafanaと統合して、統合されたダッシュボードを提供できます。
2. 利点と将来
厳格なエンドツーエンドテストとカオスエンジニアリングの力を通じて、提供されるAPISIX Ingressコントローラーの安定性と信頼性に自信を持っています。カオスエンジニアリングは、バグを特定して修正するのにも役立ちました。私たちは、この素晴らしいプロジェクトを改善し、進化させるために常に取り組んでおり、コミュニティに参加することをお勧めします。