Balanceamento de carga com Seesaw

Nesta página, mostramos como configurar o balanceador de carga do Seesaw para um cluster do GKE On-Prem.

Os clusters do GKE On-Prem podem ser executados com um dos dois modos de balanceamento de carga: integrado ou manual. Para usar o balanceador de carga do Seesaw, use o modo de balanceamento de carga manual.

Etapas comuns a todos os balanceamentos de carga manuais

Antes de configurar o balanceador de carga Seesaw, execute as etapas a seguir, que são comuns a qualquer configuração de balanceamento de carga manual:

Como reservar endereços IP e um VIP para VMs do Seesaw

Reserve dois endereços IP para um par de VMs do Seesaw. Também reserve um único VIP para o par de VMs do Seesaw. Todos esses três endereços precisam estar na mesma VLAN que os nós do cluster.

Como criar VMs do Seesaw

Criar duas VMs novas no ambiente do vSphere para executar um par ativo-passivo do Seesaw. O Ubuntu 18.04 + Linux kernel 4.15 é recomendado para as VMs do Seesaw. No entanto, há outras versões do SO que funcionam com o Seesaw.

Os requisitos para as duas VMs são os seguintes:

  • Cada VM tem uma placa de rede (NIC, na sigla em inglês) chamada ens192. Essa NIC é configurada com o endereço IP da VM.

  • Cada VM tem uma NIC chamada ens224. Essa NIC não precisa de um endereço IP.

  • As VMs precisam estar na mesma VLAN que os nós do cluster.

  • O grupo de portas de ens224 precisa permitir alterações de endereço MAC e transmissões forjadas. Isso ocorre porque as VMs do Seesaw usam o Virtual Router Redundancy Protocol (VRRP). Isso significa que o Seesaw precisa ser capaz de configurar os endereços MAC das interfaces de rede. Em particular, o Seesaw precisa ser capaz de definir o endereço MAC como um endereço MAC VRRP do formato 00-00-5E-00-01-[VRID], em que [VIRD] é um identificador de roteador virtual para o par do Seesaw.

    É possível configurá-lo na interface de usuário do vSphere nas configurações de política do grupo de portas.

    Captura de tela da permissão de alterações de endereço MAC e confirmações forjadas
    Como permitir alterações de endereços MAC e confirmações forjadas (clique para ampliar)

Como compilar o Seesaw

Para criar os binários do Seesaw, execute o seguinte script em uma máquina com o Golang instalado:

#!/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

Isso gera um diretório seesaw_files que contém os arquivos de configuração e binários do Seesaw. Para ver os arquivos, execute o comando tree:

tree seesaw_files

A saída mostra os diretórios e arquivos gerados:

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

Como exportar variáveis de ambiente

Antes de configurar as VMs do Seesaw, você precisa exportar várias variáveis de ambiente.

Em cada VM do Seesaw, exporte as seguintes variáveis de ambiente:

  • NODE_IP: o endereço IP da VM do Seesaw.

  • PEER_IP: o endereço IP da outra VM do Seesaw.

  • NODE_NETMASK: o tamanho do prefixo do intervalo CIDR para os nós de cluster.

  • VIP: o VIP que você reservou para o par de VMs do Seesaw.

  • VRID: o identificador do roteador virtual que você quer usar para o par do Seesaw.

Veja um exemplo:

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

Como configurar VMs do Seesaw

Copie o diretório seesaw_files para as duas VMs do Seesaw.

Em cada VM do Seesaw, no diretório seesaw_files, execute o seguinte script:

# 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

Como reconfigurar o Seesaw

A configuração a seguir especifica endereços IP para os nós do cluster. Também especifica VIPs dos planos de controle e controladores de entrada. Na configuração, os endereços a seguir são especificados:

  • 100.115.222.143 é o VIP do plano de controle do administrador.

  • 100.115.222.144 é o VIP do controlador de entrada do cluster de administrador.

  • 100.115.222.146 é o VIP do plano de controle do usuário.

  • 100.115.222.145 é o VIP do controlador de entrada do cluster de usuário.

  • Os endereços de nó do cluster de administrador são 100.115.222.163, 100.115.222.164, 100.115.222.165 e 100.115.222.166.

  • Os endereços de nó do cluster de usuário são 100.115.222.167, 100.115.222.168 e 100.115.222.169.

Edite a configuração para que ela contenha os endereços IP e VIPs escolhidos para os clusters de administrador e de usuário. Em seguida, em cada VM do Seesaw, anexe a configuração a /etc/seesaw/cluster.pb:

Observe que o plano de controle do cluster de usuário é implementado como um serviço no cluster de administrador. Portanto, os endereços IP dos nós em user-1-control-plane são os endereços dos nós do cluster de administrador.

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"
    >
  >
>

Como iniciar o serviço do Seesaw

Em cada VM do Seesaw, execute o seguinte comando:

systemctl --now enable seesaw_watchdog.service

Agora, o Seesaw está em execução nas duas VMs do Seesaw. É possível verificar os registros em /var/log/seesaw/.

Como modificar o arquivo de configuração do cluster

Antes de criar um cluster, gere um arquivo de configuração do cluster. Preencha o arquivo de configuração do cluster conforme descrito em Modificar o arquivo de configuração.

Especificamente, defina lbmode como "Manual". Além disso, preencha os campos manuallbspec e vips em admincluster e usercluster. Veja um exemplo:

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"