本页介绍如何为 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 界面进行配置。
编译 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 VRID=128
配置 Seesaw 虚拟机
将 seesaw_files
目录复制到两个 Seesaw 虚拟机。
在每个 Seesaw 虚拟机的 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 虚拟机上,将配置附加到 /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”。此外,还要填写 admincluster
和 usercluster
下的 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
标志。
如需了解详情,请参阅问题排查。