2017年2月16日

ブロードバンドタワー國武です。

オープンソースベースのロードバランサーとしては

  • Keepalived + LVS
  • Keepalived + HAProxy

などが有名だと思いますが、今回取り上げるのは Google の Seesaw v2 についてです。Seesaw v2 は、LVS(Linux Virtual Server)ベースのロードバランサーです。

Seesaw: scalable and robust load balancing

この Seesaw の面白いところは、ロードバランサーそのものの機能としては、お馴染みのLVS をそのまま利用し、管理性や安定性にフォーカスして開発されている点にあります。Go言語で実装されていたり、BGPと連携して動作する(必須ではありませんが)ところも特徴的でしょうか。コードは、Apache Licenseでgithubに公開されています。

https://github.com/google/seesaw

インストール方法は上記URLの README.md にも書いてありますが、Debian系のディストリビューションを前提としている箇所もありますので、若干補足しながら CentOS7 への導入方法を記載していきたいと思います。

CentOS7 へのパッケージインストール(準備段階)

コンパイルで必要な CentOS7 のパッケージをインストールします。

# yum update && yum upgrade
# yum install git
# yum install libnl3-devel
# yum install golang

Seesaw v2 のコンパイルには、Go1.5 以降である必要があるので、念のためバージョンを確認します(例えば 1.4.2 などの古いバージョンが表示されるようなら、そもそも yum repolist の出力結果に “CentOS-7 – Updates” が含まれているかを確認してください)

$ go version
go version go1.6.3 linux/amd64

また必要な環境変数をセットします。

$ mkdir go
$ export GOPATH=~/go
$ export PATH=$PATH:$GOPATH/bin

依存する 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/miekg/dns
$ go get -u github.com/kylelemons/godebug/pretty
$ go get -u github.com/golang/protobuf/{proto,protoc-gen-go}

Seesaw v2 のインストール

ワーキングスペースに移動します。

$ cd $GOPATH/src

次に Seesaw のソースコードを持ってきます

$ mkdir -p github.com/google
$ cd github.com/google
$ git clone https://github.com/google/seesaw
$ cd seesaw

ここまで来たらあとは

$ make test
$ make install

で $GOPAHT/bin に

  • seesaw_cli
  • seesaw_ecu
  • seesaw_engine
  • seesaw_ha
  • seesaw_healthcheck
  • seesaw_ncc
  • seesaw_watchdog

がインストールされます。

このままだと、インストールユーザのディレクトリにインストールされるだけなので下記スクリプトを実行しておきます。

SEESAW_BIN="/usr/local/seesaw"
SEESAW_ETC="/etc/seesaw"
SEESAW_LOG="/var/log/seesaw"

INIT=`ps -p 1 -o comm=`

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

if [ $INIT = "init" ]; then
  install "etc/init/seesaw_watchdog.conf" "/etc/init"
elif [ $INIT = "systemd" ]; then
  install "etc/systemd/system/seesaw_watchdog.service" "/etc/systemd/system"
  systemctl --system daemon-reload
fi
install "etc/seesaw/watchdog.cfg" "${SEESAW_ETC}"

# Enable CAP_NET_RAW for seesaw binaries that require raw sockets.
/sbin/setcap cap_net_raw+ep "${SEESAW_BIN}/seesaw_ha"
/sbin/setcap cap_net_raw+ep "${SEESAW_BIN}/seesaw_healthcheck"

こんな内容のスクリプトを sudo 付で実行しておきます。

$ vi seesaw-install.sh
$ chmod a+x seesaw-install.sh
$ sudo ./seesaw-install.sh

あと、モジュールを適切に呼んでおきます。

$ echo ip_vs > /etc/modules-load.d/ipvs.conf
$ echo nf_conntrack_ipv4 > /etc/modules-load.d/nf_conntrack_ipv4.conf
$ echo dummy > /etc/modules-load.d/dummy.conf

実際の利用には /etc/seesaw/seesaw.cfg が必要です。

https://github.com/google/seesaw/blob/master/etc/seesaw/seesaw.cfg.example

に設定ファイルのサンプルがあります。

次回は、具体的に使い方について進めていきます。

付録

ちなみに Ansible で設定すると、こんな感じになるでしょうか?

- name: 必要なパッケージのインストール
  become: yes
  yum: name={{item}} enablerepo=epel state=installed
  with_items:
    - git
    - libnl3-devel
    - golang

- name: seesawのインストールチェック
  stat: path=/usr/bin/seesaw
  register: seesaw

- name: Go関連ソースコード用のディレクトリ作成
  file: path={{ ansible_user_dir }}/go/src/github.com/google state=directory mode=0755 recurse=yes

- name: 関連ライブラリの取得
  shell: go get -u {{item}}
  when: not seesaw.stat.exists
  with_items:
    - golang.org/x/crypto/ssh
    - github.com/dlintw/goconf
    - github.com/golang/glog
    - github.com/miekg/dns
    - github.com/golang/protobuf/{proto,protoc-gen-go}
  environment:
    GOPATH: "{{ ansible_user_dir }}/go"
    PATH: "{{ ansible_env.PATH }}:{{ ansible_user_dir }}/go/bin"

- name: seesaw を clone
  git: repo=https://github.com/google/seesaw dest={{ ansible_user_dir }}/go/src/github.com/google/seesaw clone=yes
  when: not seesaw.stat.exists

- name: ユーザディレクトリへのインストール
  shell: make install chdir={{ ansible_user_dir }}/go/src/github.com/google/seesaw
  when: not seesaw.stat.exists
  environment:
    GOPATH: "{{ ansible_user_dir }}/go"
    PATH: "{{ ansible_env.PATH }}:{{ ansible_user_dir }}/go/bin"

- name: システム側にインストールするためのディレクトリ作成
  become: yes
  shell: install -d "{{ SEESAW_BIN }}" "{{ SEESAW_ETC }}" "{{ SEESAW_LOG }}"
  when: not seesaw.stat.exists

- name: seesawのインストール
  become: yes
  shell: install {{ ansible_user_dir }}/go/bin/seesaw_cli /usr/bin/seesaw
  when: not seesaw.stat.exists

- name: seesawの各コンポーネントのインストール
  become: yes
  shell: install {{ ansible_user_dir }}/go/bin/seesaw_{{ item }} "{{ SEESAW_BIN }}"
  with_items:
    - ecu
    - engine
    - ha
    - healthcheck
    - ncc
    - watchdog
  when: not seesaw.stat.exists

- name: setcapを実行
  become: yes
  shell: /sbin/setcap cap_net_raw+ep "{{ SEESAW_BIN }}/{{ item }}"
  with_items:
    - seesaw_ha
    - seesaw_healthcheck
  when: not seesaw.stat.exists

- name: systemd sevice ファイルをコピー
  become: yes
  shell: install "etc/systemd/system/seesaw_watchdog.service" dest=/etc/systemd/system
  when: ansible_service_mgr == "systemd"

- name: watchdog.cfgをインストール
  become: yes
  shell: install "etc/seesaw/watchdog.cfg" "{{ SEESAW_ETC }}" chdir={{ ansible_user_dir }}/go/src/github.com/google/seesaw
  when: not seesaw.stat.exists

- name: 必要なkernel moduleを自動的にロードするように設定
  become: yes
  lineinfile: dest=/etc/modules-load.d/{{ item }}.conf line="{{ item }}" create=yes
  with_items:
  - ip_vs
  - nf_conntrack_ipv4
  - dummy

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

投稿者: Koichi KUNITAKE

XenServerやLinux周りを触ってます。IPv6はボチボチ……