=========================
swarm 拡張機能
=========================
ここでは、hive のコンテナ収容サーバにインストールされる swarm 拡張機能について
説明します。swarm 拡張機能では、ノードでサービスのコンテナがデプロイされるのを観測することによって
以下の2つの機能を提供します。

- 仮想IP付与機能
- ラベル付与機能

仮想IP付与機能
===============================
仮想IP付与機能では、サービスのコンテナがノードにデプロイされると、そのラベルにしたがって
ノードに仮想IPを付与する機能を提供します。この機能を利用する場合にはサービスの
複製数は1に設定してください。これにより、複数のコンテナ収容サーバのうち当該
サービスのコンテナがデプロイされた1台だけに仮想IPを付与することができます。
また、障害が発生してコンテナが別のサーバに移動した場合に仮想IPも同じサーバに
移動するため、仮想IPのフェイルオーバが実現され、高可用性を確保することができます。

この機能を利用するたには、サービス定義の labels 属性に以下のラベルを設定する必要があります。

..  list-table::
    :widths: 18 8 50
    :header-rows: 1

    * - ラベル名
      - 値の例
      - 説明
    * - HIVE_VIP
      - 192.168.0.101
      - 仮想IPアドレス
    * - HIVE_ROUTER
      - 192.168.0.1
      - 仮想IPアドレスを付与するインタフェースのルータのアドレス（省略可能）

仮想IP付与機能では、 HIVE_VIP ラベルが付いたサービスのコンテナがノードに
デプロイされると、そのサーバが持っているインタフェースを調べ、
指定された仮想IPアドレスが付与可能なのインタフェースを探します。
インタフェースが見つかった場合、そこに仮想IPアドレスを付与します。
仮想IPアドレスが付与可能かどうかはそのインタフェースが持っているIPアドレスの
ネットワークアドレスに仮想IPが含まれるかどうかで判断します。
付与しようとする仮想IPアドレスを含むネットワークのIPアドレスが事前にサーバに付与されていなければ、
仮想IPアドレスを付与することはできませんので、注意してください。
仮想IP付与後に Gratuitous ARP を送信して、隣接するデバイスのARPテーブルを
更新します。
HIVE_ROUTERが指定されている場合は、ARPテーブルの更新を確認するために
HIVE_ROUTERで指定されたアドレスにping を送ります。ping に失敗した場合は
Gratuitous ARP を送信を再実行します。5回以上失敗すると処理を中止します。

ラベル付与機能
===============================
ラベル付与機能では、サービスのコンテナがノードにデプロイされると、そのラベルにしたがって
ノードにラベルを付与する機能を提供します。この機能を利用することで特定のサービス
（以降、リーダサービスと呼ぶ）に依存するサービス（以降、メンバサービスと呼ぶ）の
グループを構成することができます。
リーダサービスの複製数は1に設定してください。これにより、複数のコンテナ収容サーバのうち当該
サービスのコンテナがデプロイされた1台のノードのみにラベルを付与することができます。
また、障害が発生してリーダサービスのコンテナが別のサーバに移動した場合にメンバサービスも
同じノードに移動するため、フェイルオーバが実現され、高可用性を確保することができます。

この機能を利用するたには、サービス定義の labels 属性に以下のラベルを設定する必要があります。

..  list-table::
    :widths: 18 8 50
    :header-rows: 1

    * - ラベル名
      - 値の例
      - 説明
    * - HIVE_MARK
      - zabbix
      - ノードに付与するラベル名でラベルの値は "true" になります（例えば、zabbix を指定すると zabbix=true というラベルが付与されます）

リーダサービスのサービス定義で zabbix のラベル付与を行う場合、以下のように定義します。
::

    labels:
      HIVE_MARK: zabbix


メンバサービス側にはラベルが付与されているノードにだけデプロイされるように
placement.constraints 属性を指定します。例えば、 zabbix のラベルが付与されている
ノードにのみデプロイされるようにする場合は、以下のようにサービス定義に指定します。

::

    placement:
      constraints:
      - node.labels.zabbix == true


follow-swarm-service デーモン
=============================
swarm 拡張機能はfollow-swarm-service デーモンにより実装されています。
コンテナ収容サーバで journalctl コマンドを利用することでそのログを見ることが
できます。たとえば、ページャを使用して直近のログを見る場合は、以下のコマンドを
実行します。

::

    journalctl -e -u follow-swarm-service


