09_use swarm mode routing mesh
docker engine swarm modeは、クラスタの外部にアクセスできるように、サービスのポートを簡単にパブリッシュできます.すべてのノードは同じルーティンググリッドにあります.ルーティング・グリッドは、各ノードがクラスタ上の任意のサービスのポートを受信できるようにする.このノードにタスクがなくても走っています.ルーティング・グリッドは、使用可能なすべてのノードの上で、パブリッシュされたポートの使用可能なコンテナにすべてのアクセス要求をルーティングします.
ルーティング・グリッドの機能を使用するには、ノード間で次のプロトコルとポートを開く必要があります.
ポート7946 TCP/UDPコンテナネットワーク発見
ポート4789 UDPコンテナ内部ネットワーク
1つのサービスでポートをパブリッシュ
--publish
例:内部コンテナnginxの80ポートを外部の8080ポートにパブリッシュする
swarmクラスタの8080ポートにアクセスすると、swarmは要求負荷を使用可能なすべてのコンテナに等化します.
ルーティング・グリッドは、ノードに割り当てられた任意のIPのパブリケーション・ポートをリスニングします.外部のルーティングIPアドレスであれば、ポートは外部にもアクセスできます.他のIPアドレスへのアクセスは、ホストに対してのみ使用可能です.
存在するサービスでポートをパブリッシュできます
個別のTCPポートまたはUDPポートを発行
デフォルトで公開されているポートはTCPポートです.UDPポートを定義する場合は、次の構成で使用できます.
TCPポートのみ定義
TCPとUDPポートの同時定義
UDPポートのみ定義
外部の負荷イコライザの構成
外部の負荷イコライザを構成して、すべてのリクエストをswarmサービスにルーティングできます.
たとえば、HAproxyを構成して、nginxの外部ポート8080にすべての要求を均等にすることができます.
この場合、8080ポートは、負荷イコライザとswarmクラスタの間でオープンである必要があります.
swarmノードにはプライベートなネットワークが存在し、エージェントサーバのみでアクセスでき、直接外部にアクセスすることはできません.
このノードにタスクがなくても、負荷イコライザを構成してすべてのリクエストを各ノードに等化できます.
たとえば、HAproxyの構成は次のようになります.
HAproxy負荷イコライザの80ポートにアクセスすると、swarmクラスタのノードにリクエストが転送されます.swarmルーティングメッシュは、使用可能なノードにルーティング要求されます.swarm schedulerスケジューリングタスクが異なるノードに要求された場合、負荷イコライザを再構成する必要はありません.
swarmノードのリクエストをルーティングするために、任意のタイプの負荷イコライザを構成できます.
ルーティング・グリッドの機能を使用するには、ノード間で次のプロトコルとポートを開く必要があります.
ポート7946 TCP/UDPコンテナネットワーク発見
ポート4789 UDPコンテナ内部ネットワーク
1つのサービスでポートをパブリッシュ
--publish
$ docker service create \
--name \
--publish : \
例:内部コンテナnginxの80ポートを外部の8080ポートにパブリッシュする
$ docker service create \
--name my-web \
--publish 8080:80 \
--replicas 2 \
nginx
swarmクラスタの8080ポートにアクセスすると、swarmは要求負荷を使用可能なすべてのコンテナに等化します.
ルーティング・グリッドは、ノードに割り当てられた任意のIPのパブリケーション・ポートをリスニングします.外部のルーティングIPアドレスであれば、ポートは外部にもアクセスできます.他のIPアドレスへのアクセスは、ホストに対してのみ使用可能です.
存在するサービスでポートをパブリッシュできます
$ docker service update \
--publish-add : \
$ docker service inspect --format="{{json .Endpoint.Spec.Ports}}" my-web
[{"Protocol":"tcp","TargetPort":80,"PublishedPort":8080}]
個別のTCPポートまたはUDPポートを発行
デフォルトで公開されているポートはTCPポートです.UDPポートを定義する場合は、次の構成で使用できます.
TCPポートのみ定義
$ docker service create --name dns-cache -p 53:53 dns-cache
$ docker service create --name dns-cache -p 53:53/tcp dns-cache
TCPとUDPポートの同時定義
$ docker service create --name dns-cache -p 53:53/tcp -p 53:53/udp dns-cache
UDPポートのみ定義
$ docker service create --name dns-cache -p 53:53/udp dns-cache
外部の負荷イコライザの構成
外部の負荷イコライザを構成して、すべてのリクエストをswarmサービスにルーティングできます.
たとえば、HAproxyを構成して、nginxの外部ポート8080にすべての要求を均等にすることができます.
この場合、8080ポートは、負荷イコライザとswarmクラスタの間でオープンである必要があります.
swarmノードにはプライベートなネットワークが存在し、エージェントサーバのみでアクセスでき、直接外部にアクセスすることはできません.
このノードにタスクがなくても、負荷イコライザを構成してすべてのリクエストを各ノードに等化できます.
たとえば、HAproxyの構成は次のようになります.
/etc/haproxy/haproxy.cfg:
global
log /dev/log local0
log /dev/log local1 notice
...snip...
# Configure HAProxy to listen on port 80
frontend http_front
bind *:80
stats uri /haproxy?stats
default_backend http_back
# Configure HAProxy to route requests to swarm nodes on port 8080
backend http_back
balance roundrobin
server node1 192.168.99.100:8080 check
server node2 192.168.99.101:8080 check
server node3 192.168.99.102:8080 check
HAproxy負荷イコライザの80ポートにアクセスすると、swarmクラスタのノードにリクエストが転送されます.swarmルーティングメッシュは、使用可能なノードにルーティング要求されます.swarm schedulerスケジューリングタスクが異なるノードに要求された場合、負荷イコライザを再構成する必要はありません.
swarmノードのリクエストをルーティングするために、任意のタイプの負荷イコライザを構成できます.