使用 Seesaw 进行负载均衡

本页介绍如何为 GKE On-Prem 集群配置 Seesaw 负载均衡器

GKE On-Prem 集群可以通过两种负载均衡模式之一运行:集成或手动。如需使用 Seesaw 负载均衡器,请使用 手动负载均衡模式

所有手动负载均衡通用步骤

在配置 Seesaw 负载均衡器之前,请先执行以下步骤,这些步骤对于任何手动负载均衡配置都是通用的:

预留 IP 地址和用于 Seesaw 虚拟机的 VIP

为一对 Seesaw 虚拟机预留两个 IP 地址。同时为这对 Seesaw 虚拟机预留一个 VIP。这三个地址必须与集群节点位于同一 VLAN。

创建 Seesaw 虚拟机

在您的 vSphere 环境中创建两个干净的虚拟机,用于运行 Seesaw 主动-被动对。Seesaw 虚拟机可以使用多种操作系统版本,但建议使用 Ubuntu 18.04 + Linux kernel 4.15。

这两个虚拟机的要求如下:

  • 每个虚拟机都有一个名为 ens192 的 NIC。使用虚拟机的 IP 地址配置此 NIC。

  • 每个虚拟机都有一个名为 ens224 的 NIC。此 NIC 不需要 IP 地址。

  • 虚拟机必须与集群节点位于同一 VLAN。

  • ens224 的端口组必须允许 MAC 地址更改伪传输。这是因为 Seesaw 虚拟机使用虚拟路由器冗余协议 (VRRP),这意味着 Seesaw 必须能够配置网络接口的 MAC 地址。具体而言,Seesaw 必须能够将 MAC 地址设置为 00-00-5E-00-01-[VRID] 形式的 VRRP MAC 地址,其中 [VRID] 是 Seesaw 对的虚拟路由器标识符。

    您可以在端口组政策设置中的 vSphere 界面进行配置。

    允许 MAC 地址更改和伪提交的屏幕截图
    允许 MAC 地址更改和伪提交(点击可放大)

编译 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_files 目录,用于保存 Seesaw 二进制文件和配置文件。如需查看这些文件,请运行 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 虚拟机之前,您需要导出几个环境变量。

在每个 Seesaw 虚拟机上,导出以下环境变量:

  • NODE_IP:Seesaw 虚拟机的 IP 地址。

  • PEER_IP:另一个 Seesaw 虚拟机的 IP 地址。

  • NODE_NETMASK:集群节点的 CIDR 范围的前缀长度。

  • VIP:您为 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 虚拟机

seesaw_files 目录复制到两个 Seesaw 虚拟机。

在每个 Seesaw 虚拟机的 seesaw_files 目录中,运行以下脚本:

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

DIR=./seesaw_files

# 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 options ip_vs > /etc/modprobe.d/ip_vs.conf
echo options nf_conntrack_ipv4 > /etc/modprobe.d/nf_conntrack_ipv4.conf
echo options dummy numdummies=1 > /etc/modprobe.d/dummy.conf

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 虚拟机上,将配置附加到 /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 虚拟机上运行以下命令:

systemctl --now enable seesaw_watchdog.service

Seesaw 现在同时在两个 Seesaw 虚拟机上运行。您可以在 /var/log/seesaw/ 下查看日志。

修改集群配置文件

在创建集群前,您需要生成集群配置文件。请按照修改配置文件中的说明填写集群配置文件。

特别是,将 lbmode 设置为“Manual”。此外,还要填写 adminclusterusercluster 下的 manuallbspecvips 字段。示例如下:

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"