Seesaw로 부하 분산

이 페이지에서는 GKE On-Prem 클러스터의 Seesaw 부하 분산기를 구성하는 방법을 보여줍니다.

GKE On-Prem 클러스터는 통합 또는 수동의 두 가지 부하 분산 모드 중 하나로 실행될 수 있습니다. Seesaw 부하 분산기를 사용하려면 수동 부하 분산 모드를 사용합니다.

모든 수동 부하 분산의 공통된 단계

Seesaw 부하 분산기를 구성하기 전에 모든 수동 부하 분산 구성에 공통된 다음 단계를 수행합니다.

Seesaw VM의 IP 주소 및 VIP 예약

한 쌍의 Seesaw VM에 대해 IP 주소 2개를 예약합니다. 또한 한 쌍의 Seesaw VM에 대해 VIP 1개도 예약합니다. 이 3개 주소는 모두 클러스터 노드와 동일한 VLAN에 있어야 합니다.

Seesaw VM 만들기

vSphere 환경에서 깨끗한 VM 2개를 만들어 Seesaw active-passive 쌍을 실행합니다. Seesaw와 호환되는 다른 OS 버전도 있지만 Seesaw VM에는 Ubuntu 18.04 + Linux 커널 4.15가 권장됩니다.

두 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 주소로 설정할 수 있어야 합니다. 여기서 [VRID]는 Seesaw 쌍의 가상 라우터 ID입니다.

    이 설정은 포트 그룹의 정책 설정에 있는 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 바이너리와 구성 파일이 있는 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: Seesaw 쌍의 VM에 예약한 VIP입니다.

  • VRID: Seesaw 쌍에 사용할 가상 라우터 ID입니다.

예를 들면 다음과 같습니다.

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 주소를 지정합니다. 또한 제어 영역 및 인그레스 컨트롤러에 대한 VIP를 지정합니다. 작성된 대로 구성은 다음 주소를 지정합니다.

  • 100.115.222.143은 관리자 제어 영역용 VIP입니다.

  • 100.115.222.144는 관리자 클러스터 인그레스 컨트롤러용 VIP입니다.

  • 100.115.222.146은 사용자 제어 영역용 VIP입니다.

  • 100.115.222.145는 사용자 클러스터 인그레스 컨트롤러용 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에 추가합니다.

사용자 클러스터 제어 영역은 관리자 클러스터에서 서비스로 구현됩니다. 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 아래의 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"

알려진 문제

현재 gkectl의 부하 분산기 유효성 검사는 Seesaw를 지원하지 않으며 오류를 반환할 수 있습니다. Seesaw를 사용하는 클러스터를 설치하거나 업그레이드하는 경우 --skip-validation-load-balancer 플래그를 전달합니다.

자세한 내용은 문제 해결을 참조하세요.