web-dev-qa-db-ja.com

特定のIPアドレスでDockerSwarmサービスを公開する

Centos 7.4では、ポート80/443ですべて到達可能な複数のルーターを実行するスウォームを設定しています。
目的は、単一の群れで複数の環境(テスト/ステージング...)をすべて対称的にホストすることです。

Docker17.12.0-ceとTraefikv1.4.6をルーターとして使用しています。

基本的な考え方は、環境ごとに仮想IPアドレスを持ち、そのアドレスでのみTraefikポートを公開することです。これはDocker群では不可能なので、Traefikインスタンスにポート81/82などでリッスンさせ、どういうわけかトラフィックをVIP:80から:81 /:82に移動させる必要があります。

スウォームマネージャー全体のすべての環境の仮想IPアドレスは、Keepalivedによって処理されます。

Traefikに関連するDockerサービス構成:

"Ports": [
          {
           "Protocol": "tcp",
           "TargetPort": 80,
           "PublishedPort": 81,
           "PublishMode": "ingress"
          },

# netstat -anp|grep 81
tcp6       7      0 :::81                   :::*                    LISTEN      4578/dockerd        

firewalldは、ポート80、81、82などへのトラフィックを許可するように設定されています

VIPは機能します。のポート81でTraefikによって公開されたバックエンドサービスに直接アクセスする

VIP何も設定されていないときにポート80にアクセスすると、接続が拒否されます

Traefik dockerインスタンスは、次のテストに使用しているのと同じホストで実行されています。

私は最初に基本的なDNATを試しました。

firewall-cmd --add-forward-port=port=80:proto=tcp:toport=81:toaddr=127.0.0.1

これによりタイムアウトが発生し、サーバーに接続が確立されていないように見え、tcpdumpはSYNが無視されると通知しました

次に、もう少し具体的なDNATを試してみました。

firewall-cmd --add-rich-rule='rule family=ipv4 forward-port port=80 protocol=tcp to-port=81 to-addr=127.0.0.1'

同じ結果になります。

私は [〜#〜] gorb [〜#〜] を発見しました。これは私のユースケースに合わせて調整されているようで、

サービス:

{
  "Host": "<VIP>",
  "port": 80,
  "protocol": "tcp",
  "method": "rr",
  "persistent": true,
  "flags": "sh-port"
}

上記のサービスのバックエンド:

{
  "Host": "<VIP>",
  "port": 81,
  "method": "nat",
  "weight": 100,
  "Pulse": {
     "type": "tcp",
     "interval": "30s",
     "args": null
  }
}

Ipvsadmを使用してセットアップを確認しましたが、正しいようです。

# ipvsadm -l -n 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP         <VIP>:80 rr (flag-2)
  ->        <VIP>:81              Masq    100    0          0     

この場合、サーバーに接続が表示されていない間、tcpdumpはSYN、SYNACK、およびACKが交換されていることを示し、続いてHTTP要求とそのACKが示されました。
他のトラフィックは渡されず、リクエストは最終的にクライアント側でタイムアウトになりました。
ipvsadmは接続をアクティブとして登録しました。

VIP:80でリッスンし、HTTP経由でリクエストを127.0.0.1:81にプロキシするようにHAProxyを設定した場合、すべてが機能しますが、すべてのデータがHAProxyを通過する必要があり、リソースを無駄にするため、回避したいと思います。ローカル構成が必要です。

私はアイデアがなく、さらにトラブルシューティングする方法がわかりません。

明確にするために編集します。私の質問は:
HAProxyや、実際のルーター(Traefik)にデータを送信するだけの別のプロセスを使用せずに、VIP:80から:81 /:82などにトラフィックをルーティングすることはできますか?

1
Seemone

まず、実際のネットワークにIPを追加できる場合は、ホストで複数のIPを使用できます。このはLinuxのSwarmで機能しますmacvlan docs を参照し、「macvlanswarm」についてグーグルで検索してください。

第二に、オーバーレイとスウォームの入力ネットワークを使用していますか?

3番目に、ほとんどの人はTraefik(または私のお気に入り http://proxy.dockerflow.com )を80/443でリッスンするように配置し、ホストヘッダーに基づいてSwarmの適切なサービス/スタックにルーティングします。フローリンが尋ねたように、なぜあなたはそれを試みないのですか?

2
Bret Fisher