从Traefik到APISIX,地平线机器人在Ingress Controller中的探索

Xin Zhang

October 10, 2022

Ecosystem

自動車業界では、ほとんどの企業が自動運転と新エネルギーへの移行を進めています。特に自動運転に関しては、各社が多くのリソースを投入して自動運転モデルの開発とトレーニングを完了させています。

このプロセスにおいて、製品が急速にイテレーションを繰り返す中で、ビジネスの安定性と効率をどのように確保するかが課題となります。

本記事では、Horizon RoboticsのAI開発プラットフォームを例に、APIゲートウェイであるApache APISIXとIngress Controllerが、Horizon RoboticsのR&Dチームがこの課題を解決するのにどのように役立ったかを紹介します。

ゲートウェイの比較

Traefikの制限

APISIX Ingress Controllerを使用する前、ビジネスシステムで使用されていたIngress ControllerはTraefik1.xでしたが、いくつかの問題がありました。

  • Traefik 1.xはIngressを通じてルーティングルールを設定し、一部のプラグインはAnnotationを追加して設定する必要があります。これにより、現在のIngressの下にあるすべてのルールに対してプラグインを追加することしかできず、より細かい設定を実現できません。
  • Traefik 1.xは特定のルールの視覚的な設定をサポートしておらず、ブラウザを通じてリクエストURLにアクセスして特定のサービスを直接特定することはできません。
  • Traefikのデフォルト設定ファイル(ConfigMap)には属性が少なく、多くのデフォルト設定は公式ドキュメントを参照する必要があり、一部のパラメータはNGINXのデフォルト設定と一致しないため、メンテナンスが面倒です。

上記の問題に対応するため、Horizon Roboticsの技術チームはIngress Controllerの置き換えを決定しました。選定プロセスの初期段階では、Traefikを2.0にアップグレードして上記の問題を解決することを検討しましたが、新しいCRDを使用する必要があり、移行コストが高かったため、他のIngress Controllerソリューションも試すことにしました。

APISIX Ingress Controllerの利点

選定の初期段階では、主にApache APISIX、Kong、Envoyを比較しました。しかし、他のソリューションは機能や性能の面で既存のシナリオのニーズを満たせない部分がありましたが、APISIX Ingressはそれらのニーズを満たすことができました。そのため、最終的にAPISIX Ingressを選択しました。一般的な機能に加えて、以下の点に特に興味を持ちました。

  • 豊富なプラグイン: プラグインのエコシステムが充実しており、APISIXがサポートするすべてのプラグインをapisix-ingress-controllerを使用して宣言的に設定でき、ApisixRouteの下で単一のバックエンドに対してプラグインをカスタマイズできます。
  • 視覚的な設定: APISIX Dashboardを使用すると、各apisix routeを確認できます。また、同じドメインが複数のnamespacesやYAMLファイルで設定されている場合、APISIX Dashboardと連携してパスプレフィックスを検索し、競合が発生した場合に迅速に特定できます。
  • 細かい検証: APISIX Ingress Controllerは、管理するCRDで宣言されたリソースを検証します。CRDに存在しないサービスが宣言されている場合、エラーメッセージはApisixRouteeventに保存され、変更は有効になりません。これにより、誤用による問題をある程度軽減できます。
  • 豊富な機能: APISIXはホットアップデートやホットプラグイン、プロキシリクエストの書き換え、複数の認証、多言語プラグイン開発など多くの機能をサポートしています。詳細はAPISIX featuresを参照してください。
  • 活発なコミュニティ: 他のオープンソースソリューションのコミュニティと比較して、APISIXはSlack、GitHub、メーリングリストで多くのアクティブなメンテナーやコントリビューターがいます。
  • 高性能: 以下のチャートからわかるように、APISIXの性能はEnvoyの圧力テストと比較して約120%であり、コア数が増えるほどQPSの差が大きくなります。

QPS

全体アーキテクチャ

以下のアーキテクチャ図からわかるように、APISIX Ingressはすべてのトラフィックのエントリーポイントとして機能します。コマンドラインツール、Web、SaaSプラットフォーム、またはOpenAPIからのすべてのアクセスされたトラフィックは、APISIX Ingressを介してアップストリーム(ビジネスサービス)に入ります。認証に関しては、会社自体が専用の認証サービスを持っているため、APISIXのforward-authプラグインを使用して外部認証を実現しています。

Architecture

ゲートウェイ層では、すべてのトラフィックがドメイン名を介して入り、トラフィックはまずLVSを通過し、その後バックエンドのAPISIXノードに転送され、APISIXがルーティングルールに従ってトラフィックを対応するPodに分散します。LVSでは、APISIX Ingressのデフォルトポートを9180から80に変更し、LVSが直接APISIX Ingressを指すようにして、トラフィックの転送を容易にしました。

Flow Chart

シナリオ

全体アーキテクチャを理解した後、現在当社がAPISIX Ingressで実現しているいくつかのシナリオを共有します。

超大容量ファイルのアップロード

まず、大容量ファイルのアップロードシナリオです。これは一般的な企業ではあまり見られないかもしれませんが、AIモデルトレーニングを行う企業ではより一般的です。このシナリオは主にHorizon Roboticsのモデルトレーニングシステムで、R&Dが収集したデータがネットワークを介してシステムにアップロードされます。データのサイズは通常数百GBを超え、APISIXのパラメータを調整せずにアップロードデータ量が多すぎるとOOMが発生します。

iTerm

デフォルトのclient_body_buffer_sizeは1MBであり、バッファが満杯になると一時ファイルがディスクに書き込まれ、高いディスクIOを引き起こします。

一時ファイルが書き込まれるディレクトリを共有メモリ(/dev/shm)に指定すると、再びAPISIX(キャッシュ)が高くなります。

Monitor

継続的なデバッグの結果、APISIXがストリーミングアップロードを有効にしていないことが原因であることがわかりました。このシナリオに対応するため、APISIXのバージョンを2.11から2.13にアップグレードし、APISIXのパラメータを調整しました。まず、APISIX ConfigMapからproxy_request_bufferingパラメータをoffに変更してストリーミングアップロードを有効にしました。次に、APISIX Ingress Controllerが提供するCRD ApisixPluginConfigから再利用可能な設定を抽出し、このシナリオが必要なルートに対してclient_max_body_sizenamespaceレベルの設定として動的に設定しました。

Debug

マルチクラウド環境でのサービス呼び出し

マルチクラウド環境でのサービス呼び出しでは、一部のビジネストラフィックはまずローカルのIDCに到達し、その後APISIX Ingressを介してPodに到達します。Pod内の一部のサービスは、ドメイン名を介してAliCloudのサービスにアクセスします。また、サービスが他のサービスを呼び出すシナリオも存在し、主にマルチクラウドトレーニングのために使用されます。ユーザーはIDCをエントリーポイントとして選択し、対応するクラウドクラスタにタスクを送信します。

Multi-cloud Architecture

forward-authを使用した外部認証

APISIX Ingressの使用を開始した当初、APISIXはforward-authプラグインをサポートしていなかったため、apisix-go-plugin-runnerに基づいてカスタムプラグインを定義しましたが、これにより追加のgRPC呼び出しが発生し、デバッグが難しく、ログが見えなくなりました。今年初めにAPISIXがforward-authプラグインをサポートしたため、カスタムプラグインを公式のものに置き換え、gRPC呼び出しを1層減らし、監視をより便利にしました。

Authentication Architecture

アプリケーションモニタリング

アプリケーションモニタリングでは、APISIXのPrometheusプラグインをグローバルに有効にし、自社のビジネスに対してリアルタイムの同時実行数、QPS、APISIXのリアルタイムAPI成功率、APISIXのリアルタイム帯域幅を追加するなど、APISIXをより細かく監視するためのデバッグと最適化を行いました。

Monitoring

まとめ

現在、Apache APISIX Ingress Controllerを一部のビジネスラインのトラフィックゲートウェイとして使用しており、他のビジネスも順次リリースしてコミュニティにさらに豊富なアプリケーションシナリオを提供する予定です。もしIngress Controllerソリューションを比較している場合、この記事がいくつかのヒントを提供できれば幸いです。ますます多くのユーザーがApache APISIX Ingressを本番環境で使用しており、もしあなたもAPISIX Ingressを使用している場合は、コミュニティで使用例を共有してください。

Tags: