web-dev-qa-db-ja.com

Docker1.12スウォームモードを使用して領事をデプロイする方法

3台のサーバーからなる領事クラスターがあります。また、約6人のワーカーと3人のマスターのDockerスウォームがあります(マスターは領事サーバーと同じハードウェア上にありますが、作業を受け入れないように可用性==ドレインに設定されています)。

私は通常、領事K/Vを読むために領事テンプレートを使用します。私は一生の間、領事代理人サービスを賢明に展開する方法を理解することができません。グローバルサービスを使用する場合、ノードごとに1つのエージェントを取得しますが、クライアントエージェントがすべて同じIPアドレスを持っているように見えるため、サーバークラスターが文句を言います。

複製されたサービスが進むべき道のようですが、クライアントポート8301を公開する必要があると思います。これにより、サーバークラスター(スウォームマスターサーバーと領事サーバーの両方を実行している(dockerの下ではない))との衝突が発生するようです。

正しい方向への一般的な操縦をいただければ幸いです。これは1.12スウォームモードであるため、以前のバージョンとは大きく異なることに注意してください。

12
MarkH

多くの審議と多くの行き詰まりの後、私たちはついに私たちのために働く解決策を思いつきました。問題の一部は、執筆時点では、Docker 1.12はやや若く、すべてが理にかなっている前に理解する必要のあるいくつかの概念が導入されていることです。私たちの場合、Swarmの1.12より前のバリアントでの以前の経験は、助けになるのではなく、前向きな考え方を妨げてきました。

群れの領事K/Vサービスを展開するために利用したソリューションは次のとおりです。

  1. 'consul'というオーバーレイネットワークを作成します。これにより、サービスが動作するためのアドレス空間が作成されます。

    docker network create --driver overlay --subnet 10.10.10.0/24 consul

  2. 領事サーバークラスターを新しいオーバーレイにデプロイします。マネージャーノードとして使用する3つのホストがあり、領事サーバーコンテナーをアプリサーバーではなくこのクラスターで実行する必要があるため、「制約」フラグが設定されます。

    docker service create -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name consulserver --network consul --constraint 'node.role == manager' --replicas 3 consul agent server -bootstrap-expect=3 -bind=0.0.0.0 -retry-join="10.10.10.2" -data-dir=/tmp

    ここで重要なのは、swarmが3つの新しいインスタンスにマップする領事ネットワークの開始時に新しいVIP(10.10.10.2)を割り当てることです。

  3. 次に、エージェントサービスを展開しました

    docker service create \ -e 'CONSUL_BIND_INTERFACE=eth0' \ -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true, "retry_join":["10.10.10.2"]}' \ --publish "8500:8500" \ --replicas 1 \ --network consul \ --name consulagent \ --constraint 'node.role != manager' \ consul agent -data-dir=/tmp -client 0.0.0.0

ConsulserverサービスのVIPを指定します。(Consulはjoinの名前を解決しません。他のコンテナーの方がうまくいく可能性があり、VIPではなくサービス名 "consulserver"を指定できます)

これが完了すると、他のサービスは領事ネットワークに参加し、「領事」という名前を解決することで領事にアクセスできます。領事サービスは、必要に応じて拡張できます(またはグローバルサービスとして展開できます)。ポート8500を公開すると、スウォームのエッジでサービスが利用可能になり、スウォーム以外のサービスで利用可能にする必要がない場合は削除される可能性があります。

6
MarkH

紛らわしいですが、Dockerの「SwarmMode」は、DockerSwarmと呼ばれているものとはまったく異なる動物です。スウォームモードでは、領事は必要ありません。各ホストのDockerデーモンは、キー値ストアとして機能し、サービス検出を行います。これは、「古い」DockerSwarmで領事が必要とするすべてのことを実行します。

「スウォームモード」のみに固有のドキュメント/情報を探すように注意してください。実際に別の名前を使っていたらよかったのに。

6
Bernard

私の ブログ では、MarkHの回答と同様の方法を検討していますが、主な違いは、新しいサーバーのVIP)を指す代わりに、最初のサーバーを指していることです。ネットワークに参加する3つのノード。これは、VIPが、そのVIP上のすべてのノード間での負荷分散に対して、それ自体を指すという問題があるため、有益な場合があります。私の経験では、より優れていました。サービスを作成するためにこのようにします。

docker service create \
  --network=consul \
  --name=consul \
  -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \ 
  -e CONSUL_BIND_INTERFACE='eth0' \
  --mode global \
  -p 8500:8500 \ 
  consul agent -server -ui -client=0.0.0.0 \
  -bootstrap-expect 3 \
  -retry-join 172.20.0.3 \
  -retry-join 172.20.0.4 \
  -retry-join 172.20.0.5 \
  -retry-interval 5s

ここでは3ノードの群れでグローバルモードを使用しているので、それをレプリカと交換して制約を設定できます。

3
Jared Mackey

Docker-compose.ymlファイルからサービスを実行することを好む私のような人のために、私はなんとか「dockerstackdeploy」を実行しました

https://github.com/thechane/consul/blob/master/docker-compose.yml

... ConsulをDockerサービスとして実行します。

---編集、リンクで答えるだけの貧弱なフォームなので、ここにあります:

version: '3.1'
#customise this with options from
#https://www.consul.io/docs/agent/options.html

services:

seed:
  hostname: seed
  image: consul:0.8.0
  deploy:
    restart_policy:
      condition: none  #we do not want this to be restarted on timeout (see entrypoint options below)
    replicas: 1
    placement:
      constraints:
        - "engine.labels.access == temp"
        - "engine.labels.access != consul"
  environment:
    - "CONSUL_LOCAL_CONFIG={\"disable_update_check\": true}"
    - "CONSUL_BIND_INTERFACE=eth0"
  entrypoint:
    - timeout     #this seed fires up the cluster after which it is no longer needed
    - -sTERM      #this is the same signal as docker would send on a scale down / stop
    - -t300       #terminate after 5 mins
    - consul
    - agent
    - -server
    - -bootstrap-expect=5
    - -data-dir=/tmp/consuldata
    - -bind={{ GetInterfaceIP "eth0" }}
  networks:
    - "consul"

cluster:
  image: consul:0.8.0
  depends_on:
    - "seed"
  deploy:
    mode: global                                      ##this will deploy to all nodes that
    placement:
      constraints:
        - "engine.labels.access == consul"            ##have the consul label
        - "engine.labels.access != temp"
  environment:
    - "CONSUL_LOCAL_CONFIG={\"disable_update_check\": true}"
    - "CONSUL_BIND_INTERFACE=eth0"
    - "CONSUL_HTTP_ADDR=0.0.0.0"
  entrypoint:
    - consul
    - agent
    - -server
    - -data-dir=/tmp/consuldata
    - -bind={{ GetInterfaceIP "eth0" }}
    - -client=0.0.0.0
    - -retry-join=seed:8301
    - -ui                                              ##assuming you want the UI on
  networks:
    - "consul"
  ports:
    - "8500:8500"
    - "8600:8600"

networks:
  consul:
    driver: overlay

また、シードがないと、領事インスタンスを追加できないことを後で発見しました。したがって、スウォームノード数を拡張する場合は、オプションを含むtimeoutコマンドをシードエントリポイントから削除します。

3
thechane