LBノードを構築する。
目次
LBノードの役割
- haproxyを用いてKubernetesのAPI宛LB
- keepalivedを使用して、VIPの提供
インストール
keepalivedのインストール
aptを使ってkeepalivedをインストール
$ sudo apt-get install keepalived
keepalived用設定ファイルの作成
Active/Standby/VIPは以下の通り設定
Network | Interface | Master | Backup | VIP |
---|---|---|---|---|
External | ens33 | 192.168.0.11 | 192.168.0.12 | 192.168.0.10 |
Management | ens32 | 192.168.1.11 | 192.168.1.12 | 192.168.1.10 |
上記の通りにkeepalivedの設定ファイルを作る。
まず、初期Masterとなるノードを設定する。
Masterのインタフェースは以下の通り。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:69:54:7c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.11/24 brd 192.168.1.255 scope global ens32
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe69:547c/64 scope link
valid_lft forever preferred_lft forever
3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:47:b5:01 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.11/24 brd 192.168.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe47:b501/64 scope link
valid_lft forever preferred_lft forever
Management Network(ens32)を使って2つのノード間でVRRPをしゃべる。
manを使って必要な設定を確認する。
$ man keepalived.conf
完成した設定ファイルは以下の通り。
# /etc/haproxy/haproxy.conf
vrrp_script chk_haproxy {
script "pidof haproxy"
interval 1
}
vrrp_instance VI_K8S {
# Initial state
state MASTER
# interface for inside_network, bound by vrrp
interface ens32
track_interface {
ens32
ens33
}
track_script {
chk_haproxy
}
# default IP for binding vrrpd is the primary IP on interface.
unicast_src_ip 192.168.1.11
# if the configured src_ip doesn't exist or is removed put the instance into fault state
track_src_ip
# Use unicast instead of multicast
unicast_peer {
192.168.1.12
}
# VRRP Router ID
virtual_router_id 101
# for electing MASTER, highest priority wins.
priority 200
# VRRP Advert interval in seconds (e.g. 0.92) (use default)
advert_int 1
# VIP to be assigned on MASTER
virtual_ipaddress {
192.168.0.10/24 dev ens33
192.168.1.10/24 dev ens32
}
# Preempt and delay to become MASTER
preempt
preempt_delay 30
}
設定内容は以下の通り
- ens32を使用してVRRPをしゃべる
- ユニキャストを使用する
- ens32,ens33をトラックする
- 1秒ごとにVRRPパケットを送信
- haproxyのPIDを1秒ごとに確認
- MASTERが復活した際には、切り替えるが30秒遅らせる
同様にBACKUP側の設定ファイルを作成
BACKUPノードのネットワークは以下の通り。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:52:38:e1 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.12/24 brd 192.168.1.255 scope global ens32
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe52:38e1/64 scope link
valid_lft forever preferred_lft forever
3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:cf:e3:41 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.12/24 brd 192.168.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fecf:e341/64 scope link
valid_lft forever preferred_lft forever
設定ファイルは以下の通り。
# /etc/haproxy/haproxy.conf
vrrp_script chk_haproxy {
script "pidof haproxy"
interval 1
}
vrrp_instance VI_K8S {
# Initial state
state BACKUP
# interface for inside_network, bound by vrrp
interface ens32
track_interface {
ens32
ens33
}
track_script {
chk_haproxy
}
# default IP for binding vrrpd is the primary IP on interface.
unicast_src_ip 192.168.1.12
# if the configured src_ip doesn't exist or is removed put the instance into fault state
track_src_ip
# Use unicast instead of multicast
unicast_peer {
192.168.1.11
}
# VRRP Router ID
virtual_router_id 101
# for electing MASTER, highest priority wins.
priority 100
# VRRP Advert interval in seconds (e.g. 0.92) (use default)
advert_int 1
# VIP to be assigned on MASTER
virtual_ipaddress {
192.168.0.10/24 dev ens33
192.168.1.10/24 dev ens32
}
# Preempt and delay to become MASTER
preempt
preempt_delay 30
}
変更点は初期状態、IPアドレス、プライオリティ。
keepalivedの起動
keepalivedを起動する。すでに起動している場合には、restart
を使用。
$ sudo systemctl start keepalived
起動後statusを確認
$ susdo systemctl status keepalived
activeになっていることを確認。
haproxyが起動していないので、現状ではどのノードにもVIPが付与されない。
haproxyのインストール
aptを使ってhaproxyをインストール
$ sudo apt-get install haproxy
haproxy用設定ファイルの作成
Kuberneteのポートはデフォルトの6443を用いる。
6443宛に来たTCPパケットは、3つのMasterにロードバランスする。
設定ファイルは以下の通り。
ここを参考に、2つのLBともに同じ設定を入れる。
# /etc/haproxy/haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend k8s-api
bind 192.168.0.10:6443
bind 192.168.1.10:6443
mode tcp
option tcplog
default_backend k8s-api
backend k8s-api
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s rise 3 fall 2
server master1 192.168.1.21:6443 check
server master2 192.168.1.22:6443 check
server master3 192.168.1.23:6443 check
設定内容は以下の通り
- VIP宛の6443ポートをmaster1からmaster3にロードバランス
- 10秒ごとにサーバのチェックを行う
- サーバがUPと認識されるまで3回連続で成功
- サーバがDOWNと認識されるまで2回連続で失敗
haproxyの起動
haproxyを起動するにあたって、VIPにhaproxyをバインドするためnet.ipv4.ip_nonlocal_bind
の値を変更する。
$ sudo vi /etc/sysctl.conf
ファイルの最後に以下の行を追加。
net.ipv4.ip_nonlocal_bind = 1
追加した値を再読込。
$ sudo sysctl -p
続けて、haproxyを起動。
すでに起動している場合には、restart
を使用。
$ sudo systemctl start haproxy
起動後statusを確認
$ susdo systemctl status haproxy
activeになっていることを確認。
ここでMASTERに設定しのノードでVIPが付与されていることを確認。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:69:54:7c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.11/24 brd 192.168.1.255 scope global ens32
valid_lft forever preferred_lft forever
inet 192.168.1.10/24 scope global secondary ens32
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe69:547c/64 scope link
valid_lft forever preferred_lft forever
3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:47:b5:01 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.11/24 brd 192.168.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.0.10/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe47:b501/64 scope link
valid_lft forever preferred_lft forever
動作確認
haproxyの状態を確認する
下記コマンドにてk8s-api宛のロードバランサー情報を確認する。
$ echo "show stat" | sudo socat stdio /run/haproxy/admin.sock
もし、MasterにてAPIサーバが起動していれが以下のように状態がUPになる。
# pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,comp_in,comp_out,comp_byp,comp_rsp,lastsess,last_chk,last_agt,qtime,ctime,rtime,ttime,
k8s-api,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,2,0,,,,0,0,0,0,,,,,,,,,,,0,0,0,,,0,0,0,0,,,,,,,,
k8s-api,master1,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,1,0,0,0,2557,0,,1,3,1,,0,,2,0,,0,L4OK,,0,,,,,,,0,,,,0,0,,,,,-1,,,0,0,0,0,
k8s-api,master2,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,1,1,2554,2554,,1,3,2,,0,,2,0,,0,L4CON,,0,,,,,,,0,,,,0,0,,,,,-1,Connection refused at initial connection step of tcp-check,,0,0,0,0,
k8s-api,master3,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,1,1,2550,2550,,1,3,3,,0,,2,0,,0,L4CON,,0,,,,,,,0,,,,0,0,,,,,-1,Connection refused at initial connection step of tcp-check,,0,0,0,0,
k8s-api,BACKEND,0,0,0,0,200,0,0,0,0,0,,0,0,0,0,UP,1,1,0,,0,2557,0,,1,3,0,,0,,1,0,,0,,,,,,,,,,,,,,0,0,0,0,0,0,-1,,,0,0,0,0,
また、curlコマンドを使用して、確認することも可能。