Seesaw による負荷分散

このページでは、GKE On-Prem クラスタに Seesaw ロードバランサを構成する方法について説明します。

GKE On-Prem クラスタは、統合または手動のいずれかの負荷分散モードで実行できます。Seesaw ロードバランサを使用するには、手動負荷分散モードを使用します。

すべての手動負荷分散に共通の手順

Seesaw ロードバランサを構成する前に、手動の負荷分散設定に共通する次の手順を行います。

Seesaw VM の IP アドレスと VIP を予約する

Seesaw VM のペアに対して 2 つの IP アドレスを予約します。また、Seesaw VM のペアに対して 1 つの VIP を予約します。これら 3 つのアドレスはすべて、クラスタノードと同じ VLAN 上にある必要があります。

Seesaw VM を作成する

Seesaw のアクティブ / パッシブペアを実行するため、vSphere 環境に 2 つのクリーンな VM を作成します。Seesaw VM には、Ubuntu 18.04 および Linux カーネル 4.15 をおすすめしますが、他の OS バージョンも利用できます。

2 つの VM の要件は以下のとおりです。

  • 各 VM に、ens192 という NIC がある。この NIC は VM の IP アドレスで構成されています。

  • 各 VM に、ens224 という NIC がある。この NIC に IP アドレスは必要ありません。

  • VM はクラスタノードと同じ VLAN 上にある必要があります。

  • ens224 のポートグループは、MAC アドレスの変更偽装転送を許可する必要がある。これは、Seesaw VM が Virtual Router Redundancy Protocol(VRRP)を使用するためです。つまり、Seesaw はネットワーク インターフェースの MAC アドレスを構成できる必要があります。具体的には、Seesaw は MAC アドレスを 00-00-5E-00-01- [VRID] の形式の VRRP MAC アドレスに設定する必要があります。ここで、[VIRD] は Seesaw ペアの仮想ルーター識別子です。

    これは、ポートグループのポリシー設定にある vSphere ユーザー インターフェースで構成できます。

    MAC アドレスの変更と偽装 commit を許可するスクリーンショット
    MAC アドレスの変更と偽装 commit の許可(クリックして拡大)

Seesaw をコンパイルする

Seesaw バイナリをビルドするには、Golang がインストールされているマシンで次のスクリプトを実行します。

#!/bin/bash

set -e

DEST=$PWD/seesaw_files
export GOPATH=$DEST/seesaw
SEESAW=$GOPATH/src/github.com/google/seesaw

mkdir -p $GOPATH
cd $GOPATH
sudo apt -y install libnl-3-dev libnl-genl-3-dev

git clone https://github.com/google/seesaw.git $SEESAW

cd $SEESAW
GO111MODULE=on GOOS=linux GOARCH=amd64 make install

cp -r $GOPATH/bin $DEST/
mkdir -p $DEST/cfg
cp etc/seesaw/watchdog.cfg etc/systemd/system/seesaw_watchdog.service $DEST/cfg/

sudo rm -rf $GOPATH

これにより、Seesaw バイナリと構成ファイルを格納する seesaw_files ディレクトリが生成されます。このファイルを表示するには、tree コマンドを実行します。

tree seesaw_files

出力には生成されたディレクトリとファイルが表示されます。

seesaw_files/
├── bin
│   ├── seesaw_cli
│   ├── seesaw_ecu
│   ├── seesaw_engine
│   ├── seesaw_ha
│   ├── seesaw_healthcheck
│   ├── seesaw_ncc
│   └── seesaw_watchdog
└── cfg
    ├── seesaw_watchdog.service
    └── watchdog.cfg

2 directories, 9 files

環境変数をエクスポートする

Seesaw VM を構成する前に、いくつかの環境変数をエクスポートする必要があります。

各 Seesaw VM で、次の環境変数をエクスポートします。

  • NODE_IP: Seesaw VM の IP アドレス。

  • PEER_IP: 他方の Seesaw VM の IP アドレス。

  • NODE_NETMASK: クラスタノードの CIDR 範囲の接頭辞の長さ。

  • VIP: VM の Seesaw ペア用に予約した VIP。

  • VRID: Seesaw ペアに使用する仮想ルーター識別子。

以下に例を示します。

export NODE_IP=203.0.113.2
export PEER_IP=203.0.113.3
export NODE_NETMASK=25
export VIP=203.0.113.4
export VIRD=128

Seesaw VM を構成する

seesaw_files ディレクトリを 2 つの Seesaw VM にコピーします。

各 Seesaw VM 上の seesaw_files ディレクトリで、次のスクリプトを実行します。

# execute_seesaw.sh
#!/bin/bash
set -e

# Tools
apt -y install ipvsadm libnl-3-dev libnl-genl-3-dev

# Module
modprobe ip_vs
modprobe nf_conntrack_ipv4
modprobe dummy numdummies=1
echo "ip_vs" > /etc/modules-load.d/ip_vs.conf
echo "nf_conntrack_ipv4" > /etc/modules-load.d/nf_conntrack_ipv4.conf
echo "dummy" > /etc/modules-load.d/dummy.conf
echo "options dummy numdummies=1" > /etc/modprobe.d/dummy.conf

# dummy interface
ip link add dummy0 type dummy || true
cat > /etc/systemd/network/10-dummy0.netdev <<EOF
[NetDev]
Name=dummy0
Kind=dummy
EOF

DIR=./seesaw_files

mkdir -p /var/log/seesaw
mkdir -p /etc/seesaw
mkdir -p /usr/local/seesaw
cp $DIR/bin/* /usr/local/seesaw/
chmod a+x /usr/local/seesaw/*
cp $DIR/cfg/watchdog.cfg /etc/seesaw

cat > /etc/seesaw/seesaw.cfg <<EOF
[cluster]
anycast_enabled = false
name = bundled-seesaw-onprem
node_ipv4 = $NODE_IP
peer_ipv4 = $PEER_IP
vip_ipv4 = $VIP
vrid = $VRID

[config_server]
primary = 127.0.0.1

[interface]
node = ens192
lb = ens224
EOF

cat > /etc/seesaw/cluster.pb <<EOF
seesaw_vip: <
  fqdn: "seesaw-vip."
  ipv4: "$VIP/$NODE_NETMASK"
  status: PRODUCTION
>
node: <
  fqdn: "node.$NODE_IP."
  ipv4: "$NODE_IP/$NODE_NETMASK"
>
node: <
  fqdn: "node.$PEER_IP."
  ipv4: "$PEER_IP/$NODE_NETMASK"
>
EOF

cp $DIR/cfg/seesaw_watchdog.service /etc/systemd/system
systemctl --system daemon-reload

Seesaw を再構成する

以下の構成では、クラスタノードの IP アドレスを指定します。また、コントロール プレーンと Ingress コントローラの VIP も指定します。記載されているように、この構成では次のアドレスを指定します。

  • 100.115.222.143 は、管理コントロール プレーンの VIP です。

  • 100.115.222.144 は、管理クラスタ Ingress コントローラの VIP です。

  • 100.115.222.146 は、ユーザー コントロール プレーンの VIP です。

  • 100.115.222.145 は、ユーザー クラスタ Ingress コントローラの VIP です。

  • 管理クラスタノードのアドレスは、100.115.222.163、100.115.222.164、100.115.222.165、100.115.222.166 です。

  • ユーザー クラスタ ノードのアドレスは、100.115.222.167、100.115.222.168、100.115.222.169 です。

管理クラスタとユーザー クラスタに選択した VIP と IP アドレスを含むように構成を編集します。次に、各 Seesaw VM で構成を /etc/seesaw/cluster.pb に追加します。

ユーザー クラスタ コントロール プレーンは、管理クラスタの Service として実装されています。したがって、user-1-control-plane の下のノード IP アドレスは管理クラスタノードのアドレスです。

vserver: <
  name: "admin-control-plane"
  entry_address: <
    fqdn: "admin-control-plane"
    ipv4: "100.115.222.143/32"
  >
  rp: "cloudysanfrancisco@gmail.com"
  vserver_entry: <
    protocol: TCP
    port: 443
    scheduler: WLC
    mode: DSR
    healthcheck: <
      type: HTTP
      port: 10256
      mode: PLAIN
      proxy: false
      tls_verify: false
      send: "/healthz"
    >
  >
  backend: <
    host: <
      fqdn: "admin-1"
      ipv4: "100.115.222.163/32"
    >
  >
  backend: <
    host: <
      fqdn: "admin-2"
      ipv4: "100.115.222.164/32"
    >
  >
  backend: <
    host: <
      fqdn: "admin-3"
      ipv4: "100.115.222.165/32"
    >
  >
  backend: <
    host: <
      fqdn: "admin-4"
      ipv4: "100.115.222.166/32"
    >
  >
>
vserver: <
  name: "admin-ingress-controller"
  entry_address: <
    fqdn: "admin-ingress-controller"
    ipv4: "100.115.222.144/32"
  >
  rp: "cloudysanfrancisco@gmail.com"
  vserver_entry: <
    protocol: TCP
    port: 80
    scheduler: WLC
    mode: DSR
    healthcheck: <
      type: HTTP
      port: 10256
      mode: PLAIN
      proxy: false
      tls_verify: false
      send: "/healthz"
    >
  >
  vserver_entry: <
    protocol: TCP
    port: 443
    scheduler: WLC
    mode: DSR
    healthcheck: <
      type: HTTP
      port: 10256
      mode: PLAIN
      proxy: false
      tls_verify: false
      send: "/healthz"
    >
  >
  backend: <
    host: <
      fqdn: "admin-1"
      ipv4: "100.115.222.163/32"
    >
  >
  backend: <
    host: <
      fqdn: "admin-2"
      ipv4: "100.115.222.164/32"
    >
  >
  backend: <
    host: <
      fqdn: "admin-3"
      ipv4: "100.115.222.165/32"
    >
  >
  backend: <
    host: <
      fqdn: "admin-4"
      ipv4: "100.115.222.166/32"
    >
  >
>
vserver: <
  name: "user-1-control-plane"
  entry_address: <
    fqdn: "user-1-control-plane"
    ipv4: "100.115.222.146/32"
  >
  rp: "cloudysanfrancisco@gmail.com"
  vserver_entry: <
    protocol: TCP
    port: 443
    scheduler: WLC
    mode: DSR
    healthcheck: <
      type: HTTP
      port: 10256
      mode: PLAIN
      proxy: false
      tls_verify: false
      send: "/healthz"
    >
  >
  backend: <
    host: <
      fqdn: "admin-1"
      ipv4: "100.115.222.163/32"
    >
  >
  backend: <
    host: <
      fqdn: "admin-2"
      ipv4: "100.115.222.164/32"
    >
  >
  backend: <
    host: <
      fqdn: "admin-3"
      ipv4: "100.115.222.165/32"
    >
  >
  backend: <
    host: <
      fqdn: "admin-4"
      ipv4: "100.115.222.166/32"
    >
  >
>
vserver: <
  name: "user-1-ingress-controller"
  entry_address: <
    fqdn: "user-1-ingress-controller"
    ipv4: "100.115.222.145/32"
  >
  rp: "cloudysanfrancisco@gmail.com"
  vserver_entry: <
    protocol: TCP
    port: 80
    scheduler: WLC
    mode: DSR
    healthcheck: <
      type: HTTP
      port: 10256
      mode: PLAIN
      proxy: false
      tls_verify: false
      send: "/healthz"
    >
  >
  vserver_entry: <
    protocol: TCP
    port: 443
    scheduler: WLC
    mode: DSR
    healthcheck: <
      type: HTTP
      port: 10256
      mode: PLAIN
      proxy: false
      tls_verify: false
      send: "/healthz"
    >
  >
  backend: <
    host: <
      fqdn: "user-1"
      ipv4: "100.115.222.167/32"
    >
  >
  backend: <
    host: <
      fqdn: "user-2"
      ipv4: "100.115.222.168/32"
    >
  >
  backend: <
    host: <
      fqdn: "user-3"
      ipv4: "100.115.222.169/32"
    >
  >
>

Seesaw サービスを開始する

各 Seesaw VM で、次のコマンドを実行します。

systemctl --now enable seesaw_watchdog.service

これで、両方の Seesaw VM で Seesaw が稼働します。/var/log/seesaw/ でログを確認できます。

クラスタの構成ファイルを変更する

クラスタを作成する前に、クラスタ構成ファイルを生成します。構成ファイルの変更の説明に沿って、クラスタ構成ファイルに入力します。

特に、lbmode を「手動」に設定します。また、adminclusterusercluster の両方の下の manuallbspec フィールドと vips フィールドに入力します。次に例を示します。

admincluster:

  manuallbspec:
    ingresshttpnodeport: 32527
    ingresshttpsnodeport: 30139
    controlplanenodeport: 30968

  vips:
    controlplanevip: "100.115.222.143"
    ingressvip: "100.115.222.144"

usercluster:

  manuallbspec:
    ingresshttpnodeport: 30243
    ingresshttpsnodeport: 30879
    controlplanenodeport: 30562

  vips:
    controlplanevip: "100.115.222.146"
    ingressvip: "100.115.222.145"

lbmode: "Manual"

既知の問題

現在、gkectl のロードバランサ検証では Seesaw はサポートされておらず、エラーが返される可能性があります。Seesaw を使用するクラスタをインストールまたはアップグレードする場合は、--skip-validation-load-balancer フラグを渡します。

詳しくは、トラブルシューティングをご覧ください。