haproxy ピアを Swarm 展開として

haproxy ピアを Swarm 展開として

私は、swarm と haproxy を使用してアクティブ/アクティブ クラスターを設定しようとしています。ホスト名と IP アドレスを考慮するピア定義に苦労しています。swarm では、これは少し難しい場合があります。

プロキシのポートにモード ホストを使用して、DNS と TCP ラウンドロビンを使用してトラフィックをプロキシ ノードにルーティングできるようにします。

 proxy:
    image: "saps-proxy:5"
    hostname: '{{.Node.Hostname}}'
    dns: 127.0.0.11
    ports:
      - target: 80
        published: 80
        protocol: tcp
        mode: host
      - target: 443
        published: 443
        protocol: tcp
        mode: host
      - target: 1024
        mode: host
        protocol: tcp
    deploy:
      mode: global
      placement: { constraints: ["node.labels.type == proxy"] }
      resources: { limits: { memory: 2G } }

haproxy.cfg で peers セクションを定義しています。

peers layer7-loadbalancer
    bind *:1024
    server hostname1.bloom.com
    server hostname2.bloom.com 10.128.0.2:1024  # (ip of real host)

これはローカル ピアでは機能するようです。ただし、実際にはコンテナー IP を使用していると思います。また、これからレプリカを生成することもできません。

そこで別の構文を試してみます。このように記述すると、HAProxy はホスト名と一致するピア名から IP:ポートをバインドします。

peers layer7-loadbalancer
    peer hostname1.bloom.com 10.128.0.1:1024  # (ip of real host)
    peer hostname2.bloom.com 10.128.0.2:1024  # (ip of real host)

ただし、エラーが発生します。

Starting proxy hostname1.bloom.com: 
cannot bind socket (Cannot assign requested address) [10.128.0.1:1024]

コンテナ IP は実際にはホスト IP ではないため、これは理にかなっています。そのため、このアドレスはコンテナ内からバインドできません。

現時点では、これをどう解決すればよいのかよく分かりません。

答え1

DNS が有効になっている (DNS: 127.0.0.11) ため、ピア行では IP アドレスの代わりにサービス名を使用します。

関連情報