私の要件は、内部ネットワークの任意の場所に動的に(私の関与なしに)追加および削除される、最大50のhaproxy httpバックエンドを持つことです。各HTTPバックエンドがそのIPアドレスを知っていて、haproxyのIPアドレスを知っていると思います。各httpバックエンドに少しコードを追加して、スピンアップする前にhaproxyに登録し、スピンダウンする前に登録を解除できると想定できます。
私はポート80でhaproxyをリッスンしています:
frontend main *:80
さらに、statソケットを公開します。
stats socket 0.0.0.0:8080
私のセットアップは機能し、特にsocat readline TCP4:<haproxyIP>:8080
を使用して統計ソケットに接続できます
10.0.0.1:4040
と10.0.0.2:4040
でサービスを提供する2つのhttpバックエンドがあり、haproxyが両方のアドレスに到達できると仮定します。
<haproxyIP>:8080/backend1/status
へのリクエストが10.0.0.1:4040/status
にルーティングされ、<haproxyIP>:8080/backend2/version
へのリクエストが10.0.0.2:4040/version
にルーティングされるように、どのstat socketコマンドをstatソケットに対して発行する必要がありますか?
一般に、[GET|POST] <haproxyIP>:<haproxyPort>/<backendID>/<remainingPath>
からのマップを知っている場合、[GET|POST] <backendIP>:<backendPort>/<remainingPath>
からbackendID -> backendIP, backendPort
へのhttpリクエストを動的にプロキシする方法を教えてください。
このフロントエンドに到着するすべてのリクエストがそのような形式の場合:
frontend main
bind *:80 # Use separate bind directives as they are supported by new HAProxy versions
use_backend %[path,fields(2,/)]
backend backend1
reqrep ^([^\ :]*)\ /backend1/(.*) \1\ /\2
server foo ...
backend backend2
reqrep ^([^\ :]*)\ /backend2/(.*) \1\ /\2
server bar ...
この形式ではないリクエストがある場合は、use_backend-sまたはdefault_backendをさらに追加できます。また、構成を生成するオーケストレーションツールですべてのバックエンド名を含むフラットファイルを生成し、それをさらに多くのロジックに使用することもできます。
acl existing_backends path -f all_backends.txt -m beg
all_backends.txtは次のようになります。
/backend1/
/backend2/
...
使用しているHAProxyの正確なバージョンによっては、これはいくらか最適化されている可能性があります(引用符や変数などを使用)。これにより、1.5以上で機能するはずです。
uNIXソケットコマンドを使用してそれを実現できます。 management.txt docファイルのポイント9.2を見てください。
haproxyctl のように、この「api」を使用するサードパーティのツールがありますが、私はそれらの経験はありません。