web-dev-qa-db-ja.com

haproxyバックエンドを動的に再構成する

私の要件は、内部ネットワークの任意の場所に動的に(私の関与なしに)追加および削除される、最大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:404010.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リクエストを動的にプロキシする方法を教えてください。

4
Adam Kurkiewicz

このフロントエンドに到着するすべてのリクエストがそのような形式の場合:

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以上で機能するはずです。

2
nmerdan

uNIXソケットコマンドを使用してそれを実現できます。 management.txt docファイルのポイント9.2を見てください。

haproxyctl のように、この「api」を使用するサードパーティのツールがありますが、私はそれらの経験はありません。

1
natxo asenjo