当前位置: 首页 > 工具软件 > Seesaw > 使用案例 >

seesaw v2简单部署

羊舌胡非
2023-12-01

↓ のニュースを見て面白そうだったので遊んでみました。
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 も試したかったのですが、理解が足りていないのでいつか・・・

 类似资料: