LoginSignup
8
8

More than 5 years have passed since last update.

GORB で Docker クラスタのロードバランシング

Last updated at Posted at 2015-12-20

GORB って?

GORB は,ほぼメンテナンスフリーでクラスタ上にある Docker コンテナのロードバランスをしてくれるツールです.
Go言語で記述されており,それ自身も Docker コンテナとして動作することが想定されています.

仕組み

GORB は,gorb と gorb-link という 2つのコマンド(を内在する2つのDockerコンテナ)から成り立っています.

gorb は,LVS を用いたロードバランシングを行います.
また,ロードバランス先を設定や死活状況の確認を行うための WebAPI を持っています.
gorbを含むコンテナが動作するホストのカーネルは,LVS が有効になっている必要があります.

gorb-link は,docker.sock を監視し,コンテナの状態変化がある都度 WebAPI 経由で gorb に通知します.
gorb-link を含むコンテナが動作するホストのカーネルは,LVS が有効になっていなくても構いません.

つまり,下記列挙するようなフローで,ロードバランシングの設定が自動的に行われます.

  1. LVS が有効になっているカーネルで,gorb を立ち上げる.
  2. ロードバランス先の各ノードで,gorb-link を立ち上げる.
    1. gorb-link は起動時に,自らのノードのコンテナ情報を取得し,gorb に通知する.
    2. gorb が LVS の設定を書き換える.
  3. 誰かがどこかのクラスタノードで Docker コンテナを操作する(立ち上げる or 終了する).
  4. gorb-link が,そのクラスタノードで,操作を検知し,gorb に通知する.
  5. gorb が LVS の設定を書き換える.

加えて,gorb は,ロードバランス先の死活監視も行います.

このような仕組みにより,管理者は,ロードバランサの設定から開放されるわけです.

CoreOS への導入

GORB 自身は,LVS さえ有効になっていれば,ホストのディストリビューションを選びません.
しかしここでは CoreOS に限定して解説します.
他のディストリビューションでも参考にはなると思います.

gorb と gorb-link は一台のホストに置いても動作しますが,クラスタを構成したほうがリアリティが出ると思いますので,IPアドレス 10.0.0.[1-4] の 4 台構成とします.

Docker イメージは,筆者の所属会社のDockerHubリポジトリに登録したものを用います.1

LVS を有効にする

CoreOS は,デフォルトの状態で LVS が有効になっていません.
この記事を参考にして有効にしてください.
ちなみに,他のディストリビューションでの LVS を有効にする記事には,ip_forwarding を 1 にすることが推奨されていますが,CoreOS の場合はデフォルトで 1 なので,気にしなくて構いません.

gorb コンテナをデプロイする

ここでは 10.0.0.1 をロードバランサとします.

10.0.0.1$ docker run -d --restart=always --name gorb --net=host --privileged monami0ya/gorb -f -i eth0
c1ab4376b2a35e2d8d39b23364ab02012a74f9ece00abe71d81e1aeac54bf3bd
$

gorb-link コンテナをデプロイする

10.0.0.2, 10.0.0.3, 10.0.0.4 に gorb-link コンテナをデプロイします.

ふつう,ロードバランサの上でアプリケーションを走らせないとは思いますが,
10.0.0.1 にも gorb-link コンテナをデプロイしても,問題はありません.

10.0.0.2$ docker run --restart=always -d --net=host -v /var/run/docker.sock:/var/run/docker.sock --name gorb-link monami0ya/gorb-docker-link -r 10.0.0.1:4672 -i eth0

10.0.0.1 は,先に gorb を動作させたコンテナが動作しているホストの IP アドレスです.
4672 は,GORB の WebAPI のデフォルトポートです.このポートをロードバランシングで使いたい場合は,gorb の起動時にオプション -l:{ポート番号} を加えることで変更できます.

試す

作業はここまでです.もうロードバランサが動作しています.
この記事に興味を持たれる方は,既にロードバランスが必要なコンテナ群をお持ちでしょうから,いろいろ試してみてください.

発展: 死活状況を確認する

死活状況の確認には,WebAPI を使います.

まず,ログから,vsID を確認します.

10.0.0.1$ docker logs gorb
(中略)
ime="2015-12-19T22:42:26Z" level=info msg="starting pulse for [deis-router-v1.12.2-2222-tcp/deis-router-2222-tcp]" 
time="2015-12-19T22:42:26Z" level=info msg="creating virtual service [deis-router-v1.12.2-443-tcp] on 10.0.0.1:443" 
time="2015-12-19T22:42:26Z" level=info msg="creating backend [deis-router-443-tcp] on 10.0.0.2:443 for virtual service [deis-router-v1.12.2-443-tcp]" 
time="2015-12-19T22:42:26Z" level=info msg="starting pulse for [deis-router-v1.12.2-443-tcp/deis-router-443-tcp]" 
time="2015-12-19T22:42:26Z" level=info msg="creating virtual service [deis-router-v1.12.2-80-tcp] on 10.0.0.1:80" 
time="2015-12-19T22:42:26Z" level=info msg="creating backend [deis-router-80-tcp] on 10.0.0.2:80 for virtual service [deis-router-v1.12.2-80-tcp]" 
time="2015-12-19T22:42:26Z" level=info msg="starting pulse for [deis-router-v1.12.2-80-tcp/deis-router-80-tcp]" 
time="2015-12-19T22:43:11Z" level=error msg="unable to connect to 10.0.0.2:443"
(後略)

deis-router-80-tcpdeis-router-443-tcp などが vsID です.

これを使って下記のようにします.

$ curl http://10.0.0.7:4672/service/deis-router-v1.12.2-80-tcp
{
        "options": {
                "host": "",
                "port": 80,
                "protocol": "tcp",
                "method": "wrr",
                "persistent": false
        },
        "health": 1,
        "backends": [
                "deis-router-80-tcp"
        ]
}

port 80 は "health": 1 なので,生きています.一方 443 は下記のように死んでいます.
上記ログにも unable to connect to 10.0.0.2:443 とあります.

$ curl http://10.0.0.7:4672/service/deis-router-v1.12.2-443-tcp
{
        "options": {
                "host": "",
                "port": 443,
                "protocol": "tcp",
                "method": "wrr",
                "persistent": false
        },
        "health": 0,
        "backends": [
                "deis-router-443-tcp"
        ]
}

情報の寿命と Consul との連携

gorb は gorb-link から得た情報を,オンメモリに保持するほかに,Consul が提供する KVS に保存できます.
オンメモリに保持した場合は,当然のことがら, gorb プロセスが落ちると消えます.
その際には gorb-link の再起動が必要になります.

GORBにできないこと

GORB は L4 バランサです.http(s) の場合,L7 バランサにしてアクセス制御したい要求があると思いますが,それはできません.

入ってきたのと別の番号のポートに転送することはできません.

その他,細かいところで足りないところはあります.しかし,それらの多くはメンテナンスフリーとのトレードオフなので悩ましいところではあります.

まとめ

  • GORB を用いると,クラスタ上にある Docker コンテナ群のロードバランシングを実現できます.
  • GORB は,Go言語で記述され,軽量です.
  • L4 バランサです.
  • 複雑なことはできませんし,こなれていない部分もありますが,メンテナンスフリーです.

  1. 原作者も DockerHub にイメージを登録しているのですが,なぜか gorb-link のイメージが落とせなかったので. 

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8