↓ のニュースを見て面白そうだったので遊んでみました。
GoogleがロードバランサーSeesawをオープンソース化(Go言語で書かれている)
まだドキュメントが心もとないので、ソースを斜め読みしながら設定しました。
https://github.com/google/seesaw
試した環境は CentOS 7.2 on vSphere ESXi です。せっかくなのでメモとして残しておきます。
構成
既存のテスト環境に入れているので、アドレスは適当です。
構成
* Seesaw は node01 にインストール
* node01 のインタフェースは IPアドレスを振った方が Node用で、無い方が LB の VIP用
* Requirement には Node のインタフェースは2つで、いずれも同じ L2 セグメントにするように書かれている
* VIP は 192.168.37.200
* client, server ともに同じセグメントで DSR 構成
+--------------+
| |
| node01 |
192.168.37.0/24 | |
+--------------+
.76| | <== (プロセスが起動するとここに .200 が来る)
eno16777728 eno33554960
| |
+--------------------------------------------------+
| | |
.172| .71| |.72
+--------+ +-----------+ +-----------+
| client | | backend01 | | backend02 |
+--------+ +-----------+ +-----------+
ソースの最新コミットは df04a7468ba6a2cacdcc771c05833b18cf3b07ff でした。
ここではエニーキャストには触れません。
インストール
README は Debian/Ubuntu での例でしたが、個人的に慣れている CentOS でいきます。
seesawのビルドからインストールまで
## テストなので・・・
# setenforce 0
## 必要なものを準備
# yum install -y git golang protobuf-compiler libnl3-devel
## パスは適当、root で作業しても気にしない
# mkdir go
# export GOPATH=/root/go
# go get -u golang.org/x/crypto/ssh
# go get -u github.com/dlintw/goconf
# go get -u github.com/golang/glog
# go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
# go get -u github.com/miekg/dns
## ビルドしてみる
# export PATH=$PATH:${GOPATH}/bin
# go get -u github.com/google/seesaw
# cd /root/go/src/github.com/google/seesaw/
# make test
# make install
执行 go get -u github.com/google/seesaw
可能会有错误提示 package github.com/google/seesaw: no buildable Go source files in /root/go/src/github.com/google/seesaw
进入 root/go/src/github.com/google 下 看是否已经下载好 seesaw 如果有忽略
如果没有,手动在该目录下 git clone github.com/google/seesaw
执行 make test
出错 找不到 kylelemons/godebug
具体错误没法贴出来了,根据错误提示,到那个目录下新建 kylelemons 然后进入手动git clone https://github.com/kylelemons/godebug.git
将源码中的etc
目录复制到${GOPATH}/bin
目录下,编写${GOPATH}/bin/install.sh
:
## README のやり方だと Upstart 用の設定があるのでそこだけ飛ばす
# SEESAW_BIN="/usr/local/seesaw"
# SEESAW_ETC="/etc/seesaw"
# SEESAW_LOG="/var/log/seesaw"
# install -d "${SEESAW_BIN}" "${SEESAW_ETC}" "${SEESAW_LOG}"
# install "${GOPATH}/bin/seesaw_cli" /usr/bin/seesaw
# for component in {ecu,engine,ha,healthcheck,ncc,watchdog}; do
install "${GOPATH}/bin/seesaw_${component}" "${SEESAW_BIN}"
done
# install "etc/seesaw/watchdog.cfg" "${SEESAW_ETC}"
# /sbin/setcap cap_net_raw+ep "${SEESAW_BIN}/seesaw_ha"
# /sbin/setcap cap_net_raw+ep "${SEESAW_BIN}/seesaw_healthcheck"
設定ファイル
よく分かっていないながらも、それっぽい設定ファイルを書きます。
config_server に何も無いと seesaw-config.example.com を参照してしまうようなので、別の設定を書いて hosts で解決できるようにして止めておきます。
/etc/seesaw/seesaw.cfg
[cluster]
anycast_enabled = false
name = test
node_ipv4 = 192.168.37.76
## peer_ipv4 は、ここでは存在しない 2台めの Seesaw ノード用
#peer_ipv4 = 192.168.37.77
## vip_ipv4 はここの構成だと意味がなさそうだが、入れておかないと動かない
vip_ipv4 = 192.168.37.80
[config_server]
## example では URL になっているけど、違うかも
## とりあえず仮で埋めておく
primary = https://seesaw-config.localdomain/
[interface]
node = eno16777728
lb = eno33554960
/etc/hosts
127.0.0.1 seesaw-config.localdomain
セグメントを分けるのが面倒だったので DSR 構成で試します。
バックエンドは適切に設定してあるものとします。
/etc/seesaw/cluster.pb
seesaw_vip: <
fqdn: "seesaw-vip.localdomain."
ipv4: "192.168.37.80/24"
status: TESTING
>
node: <
fqdn: "node01.localdomain."
ipv4: "192.168.37.76/24"
status: TESTING
>
#node: <
# fqdn: "node02.localdomain."
# ipv4: "192.168.37.77/24"
# status: TESTING
#>
vserver: <
name: "test-vserver"
entry_address: <
fqdn: "lb-test.localdomain."
ipv4: "192.168.37.200/24"
status: TESTING
>
rp: "admin@localdomain"
vserver_entry: <
protocol: TCP
port: 80
scheduler: RR
healthcheck: <
type: HTTP
port: 80
mode: DSR
proxy: false
tls_verify: false
>
>
backend: <
host: <
fqdn: "backend01.localdomain."
ipv4: "192.168.37.71/24"
status: TESTING
>
weight: 1
>
backend: <
host: <
fqdn: "backend02.localdomain."
ipv4: "192.168.37.72/24"
status: TESTING
>
weight: 1
>
>
Seesaw を実行
/usr/local/seesaw/seesaw_watchdog
を実行して、動かしてみましょう。
フォアグラウンドでプロセスが残ります。ログを確認してみます。
/var/log/seesaw/seesaw_ncc.log
F0131 18:57:34.972241 5389 ipvs.go:40] IPVS initialisation failed: failed to resolve family name
どうやら正しく動いていません。
自分で ip_vs モジュールをロードしておく必要があるようです。
ip_vsモジュール設定
# echo ip_vs > /etc/modules-load.d/ipvs.conf
# systemctl restart systemd-modules-load.service
あらためて起動。
/var/log/seesaw/seesaw_engine.log
F0131 19:38:11.393617 20543 core.go:274] Failed to initialise LB interface: Failed to initialise sysctls: open /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established: no such file or directory
別のログファイルにエラーが出ています。
さらにモジュールをロードします。
nf_conntrack_ipv4モジュール設定
# echo nf_conntrack_ipv4 > /etc/modules-load.d/nf_conntrack.conf
# systemctl restart systemd-modules-load.service
3度目のトライ。
/var/log/seesaw/seesaw_engine.log
F0131 20:03:08.723735 1775 core.go:274] Failed to initialise LB interface: Failed to get dummy interface: no such network interface
まだ怒られますね。
どうやら DummyInterface が無いのが問題なようです。ソース中のデフォルトインタフェース名は dummy0 のようで、設定ファイルから変更できるか分からないので、名前を合わせて作ってみます。
dummyインタフェース作成
# ip link add dummy0 type dummy
ip link add ip+net type dummy
## seesaw の cli から状態を確認できます
# seesaw -c "show nodes"
Nodes
[1] node01.localdomain. enabled
# seesaw -c "show backends"
Backends
[ 1] backend01.localdomain.
[ 2] backend02.localdomain.
# seesaw -c "show vservers"
Vserver
Name: test-vserver
Hostname: lb-test.localdomain.
Status: enabled (override state default; config state enabled)
IPv4 Address: 192.168.37.200/24
IPv6 Address: <not configured>
Services:
IPv4 TCP/80 (DSR, rr scheduler)
State: enabled, healthy, active
Watermarks: Low 0.00, High 0.00, Currently 1.00
## LVS なので、ipvsadm コマンドでも状態を見ることもできます
# yum install -y ipvsadm
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.37.200:80 rr
-> 192.168.37.71:80 Route 1 0 0
-> 192.168.37.72:80 Route 1 0 0
FWM 65536 rr
-> 192.168.37.71:0 Route 1 0 6
FWM 65537 rr
-> 192.168.37.72:0 Route 1 0 10
ただ、まだ設定は改善が必要そうです。
lb=
に設定したインタフェースは MAC アドレスが変更されており、仮想MACアドレスを意識したものと思われますが今回の構成では node=
に設定した NIC の MAC アドレスで ARP 応答されています。
遊び時間が足りませんでしたが、いずれ調べたいです。
## Seesaw ノード
# ip a show dev eno33554960
3: eno33554960: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:00:5e:00:01:3c brd ff:ff:ff:ff:ff:ff
inet 192.168.37.80/24 brd 192.168.37.255 scope global eno33554960
valid_lft forever preferred_lft forever
inet 192.168.37.200/24 brd 192.168.37.255 scope global secondary eno33554960
valid_lft forever preferred_lft forever
inet6 fe80::200:5eff:fe00:13c/64 scope link
valid_lft forever preferred_lft forever
## client からの見え方
# ip n show to 192.168.37.200
192.168.37.200 dev enp3s0.37 lladdr 00:0c:29:94:66:fc STALE
真面目に使うときにはユニットファイルを書くことになると思います。
Upstart 向け設定では limit nofile 8192 8192
が書かれているので、ユニットファイルを作る際は LimitNOFILE
を入れておくと良さそうです。
Config Server も試したかったのですが、理解が足りていないのでいつか・・・