LBノードの構築

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コマンドを使用して、確認することも可能。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください