さくらのクラウドのロードバランサを使ってswarm上のコンテナへのアクセス経路の可用性を高める


概要

さくらのクラウドのロードバランサとそれに付帯するVIPを使って
Docker swarm上にデプロイしたコンテナへの可用性高め(たぶん)の
アクセス経路を作る。

経緯

DockerSwarmでデプロイしたコンテナを自動的にtraefikに登録する
traefikを使ったものの、vipの設定やソーリーサーバの設定やそれらの管理が
面倒くさいなぁって思ったので。

前提

ubuntu@swarm-manager001:~$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
ubuntu@swarm-manager001:~$ 

さくらのクラウドのロードバランサを作る

公式のマニュアルに沿ってGUIからポチポチして作る。
公式のマニュアルは https://manual.sakura.ad.jp/cloud/network/load-balancer.html です。

  • 今回はVIPを "192.168.1.201" とする
  • ソーリーサーバは今回は省く
  • ポート番号は80で待ち受ける
  • 実サーバにはmanagerのnodeを登録しておく

実サーバ側の設定を行う

公式マニュアルの https://manual.sakura.ad.jp/cloud/network/load-balancer.html#id15 に書いている事をする。
補足しつつ書き出すと以下のようになる。

カーネルパラメータの設定

/etc/sysctl.conf の最後に

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

を追加して、 $ sudo sysctl -p で反映させる。

ネットワークの設定

/etc/netplan/01-netcfg.yaml (他のファイル名の場合は適宜読み替える)に
以下の感じで追記する。

    lo:
      match:
        name: lo
      addresses:
        - ロードバランサのVIP

e.g.
network: 
  ethernets: 
    eth0: 
      addresses: 
        - 192.168.1.20/24
      dhcp4: 'no'
      dhcp6: 'no'
      gateway4: 192.168.1.254
      nameservers: 
        addresses: 
          - 133.242.0.3
          - 133.242.0.4
        search: 
          - localdomain
    lo:
      match:
        name: lo
      addresses:
        - 192.168.1.201/32 #ロードバランサのVIP
  renderer: networkd
  version: 2

iptables の設定

以下を実行する。

sudo iptables -t nat -A PREROUTING -d ロードバランサのVIP -j REDIRECT

e.g.
sudo iptables -t nat -A PREROUTING -d 192.168.1.201 -j REDIRECT

ロードバランサのVIPにアクセスしてみる!

httpかつtraefikのルールに合致したアクセスしてバランシングされてたら出来上がり!

その他

自分のドメインを持っていたら、さくらのクラウドのDNSアプライアンスを使って、
*.lb.自分の.ドメイン A ロードバランサのVIP みたいなAレコードを
DNSアプライアンスに設定すると名前解決出来るようになって楽しくなる。