Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20201130_keepalived

 20201130_keepalived

VirtualBox+Vagrant + keepalivedの実装サンプル。
書いてみてわかったけど、LVS+Keepalived、構築するもんじゃないなぁ...。

ONO,Tetsuo

November 30, 2020
Tweet

More Decks by ONO,Tetsuo

Other Decks in How-to & DIY

Transcript

  1. VirtualBox+Vagrant による検証環境の作成 (LVS+Keepalived) 大野 哲生(@g_plains)

  2. 目次  はじめに  用意する環境  Vagrantテンプレート用boxの作成  Keepalivedの設定を実際に行う ◦

    作成するネットワーク図 ◦ Vagrantfile ◦ 実作業(keepalived.conf サンプル含む)  ふりかえり
  3. 用意する環境  物理マシン(以下の機能を具備すること) 2C4T以上、メモリ8GB以上 HDD空き40GB ※VM個数+1C=4VMの場合、4C8Tが望ましい  100Mbps以上のブロードバンド環境 1-2GBのダウンロードが発生するため 

    予めVirtualBoxとVagrantをインストールしておく
  4. Vagrant:テンプレート用boxの作成-1  HAの検証では「作って壊し」を頻繁に行うため、結果的に (CentOSでいうところの)yum/dnf を頻繁に実施する  なるべくネットワークアクセスを抑えるため、予めテンプ レート用boxを作って、これをもとに環境作成を検討する  テンプレート用Vagrantfileの例

    (httpd/lvs/corosync用) Vagrant.configure("2") do |config| config.vm.box = "centos/7" config.vm.provision "shell", inline: <<-SHELL sudo yum update -y # ベースラインを更新 sudo yum install -y httpd # バックエンドサーバ用httpd sudo yum install -y ipvsadm keepalived # LVS/keepalived sudo yum install -y haproxy # LVS用 haproxy sudo yum install -y pacemaker pcs # pacemaker/corosync SHELL end
  5. Vagrant:テンプレート用boxの作成-2  実際にテンプレート用boxを作成してみる コマンドプロンプトより、c:¥vagrant配下に移動して実行  前頁ではhttpd/lvs/keepalived/corosync のサービスは いずれもdisabled になっているので、検証時は適宜有効化 vagrant

    init # Vagrantfile の作成 # 前頁のテンプレート用Vagrantfile の内容をVagrantfileにコピペ… vagrant up # yum update他が実行される vagrant package --output template.box vagrant destroy -f # 仮想マシンはここで削除される vagrant box list vagrant box add template template.box vagrant box list systemctl is-enabled httpd # disabled であること systemctl start httpd # 停止>実行に変化する systemctl enable httpd # 無効>有効 に変化する systemctl is-enabled httpd # enabledであること
  6. Keepalived実習:想定される実習環境  LVS-1,LVS-2 : IPVS、Keepalivedを設定 VIPとして192.168.1.120/192.168.2.100 が片側に生える ※LBの中継方法はNATとします  node1,node2:httpd

    を設定 192.168.1.0/24 LVS-1 LB LVS-2 LB 仮想化基盤 11 121 122 VIP 120 private_network public_network VirtualBoxでのNIC node1 サーバ node2 サーバ 100 112 111 102 101 192.168.2.0/24
  7. Vagrantfile  Vagrantfile の記述例 (1/2) 今回は作業の簡便のため 、テンプレートを使用する Vagrant.configure("2") do |config|

    config.vm.box = “template" # config.vm.network "private_network", type: "dhcp" config.vm.define "lvs-1" do |machine| machine.vm.network "public_network", ip: "192.168.1.121" machine.vm.network "private_network", ip: "192.168.2.101" ¥ ,virtualbox_intnet: "backend" machine.vm.hostname = "lvs-1" end config.vm.define "lvs-2" do |machine| machine.vm.network "public_network", ip: "192.168.1.122" machine.vm.network "private_network", ip: "192.168.2.102" ¥ ,virtualbox_intnet: "backend" machine.vm.hostname = "lvs-2" end
  8. Vagrantfile  Vagrantfile の記述例 (2/2) 前頁と足して1ファイルとなる config.vm.define "node1" do |machine|

    machine.vm.network "private_network", ip: "192.168.2.111" ¥ ,virtualbox_intnet: "backend" machine.vm.hostname = "node1" end config.vm.define "node2" do |machine| machine.vm.network "private_network", ip: "192.168.2.112" ¥ ,virtualbox_intnet: "backend" machine.vm.hostname = "node2" end config.vm.provider "virtualbox" do |vb| # Display the VirtualBox GUI when booting the machine vb.gui = false # Customize the amount of memory on the VM: vb.memory = "2048" vb.cpus = "1" end end
  9. 各ノードの起動  Vagrantfile を配置した状態で以下を実行する  エラーなくプロンプトに戻ったところで以下を実行する 以下のような結果が得られる  各ノードは以下のように管理コンソールへ接続できる vagrant

    up vagrant ssh lvs-1 vagrant ssh lvs-2 vagrant ssh node1 vagrant ssh node2 "lvs-1_xxxx_xxxx" {UUID_1} "lvs-2_xxxx_xxxx" {UUID_1} "node1 _xxxx_xxxx " {UUID_2} "node2 _xxxx_xxxx " {UUID_3} vboxmanage list vms
  10. node1(/node2)の設定変更  node1 の管理コンソールに接続する  ネットワーク設定の確認 以下のような結果が得られる - nmcli の操作対象が

    “System eth1” である - eth0(10.0.2.0/24)がデフォルトゲートウェイである  ルーティングをひとまず変更し、httpdを有効化する  同様に node2 も設定変更する vagrant ssh node1 sudo nmcli c m "System eth1" +ipv4.routes "192.168.1.0/24 192.168.2.100" sudo systemctl enable httpd ; sudo systemctl start httpd ip a ; ip route ;nmcli d s
  11. LVSの設定変更-1  LVS の管理コンソールに接続する  ネットワーク設定の確認 以下のような結果が得られる - nmcli の操作対象が

    “System eth1” である - eth0(10.0.2.0/24)がデフォルトゲートウェイである  node1/node2 にそれぞれcurl してみる vagrant ssh lvs curl 192.168.2.111 curl 192.168.2.112 ip a ; ip route ;nmcli d s
  12. LVSの設定変更-2  LVS の管理コンソールに接続する  ipv4転送機能を有効化する  実際にkeepalived.conf を修正する vagrant

    ssh lvs-1 sudo echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf sudo sysctl -p sudo vi /etc/keepalived/keepalived.conf
  13. Keepalived.conf(LVS-1側) global_defs { notification_email { superuser@domain.local } notification_email_from noreply@domain.local smtp_server

    127.0.0.1 smtp_connect_timeout 10 } vrrp_sync_group VG1 { group { LVS_OUTER LVS_INNER } } vrrp_instance LVS_OUTER { state MASTER interface eth1 # public_network virtual_router_id 10 priority 100 advert_int 1 authentication { auth_type PASS auth_pass outer11 } virtual_ipaddress { 192.168.1.120 } } 今回は eth1(外側)とeth2(内側)で別のセグメン トを定義するので、2セグメントが同時に切り 替わるよう vrrp_sync_group を定義する LVS_OUTER 区 - state マスタ側: MASTER 、待機側:BACKUP - priority(優先度) マスタ側: 100 、待機側:90
  14. Keepalived.conf (LVS-1側) vrrp_instance LVS_INNER { state MASTER interface eth2 #

    private_network virtual_router_id 10 priority 100 advert_int 1 authentication { auth_type PASS auth_pass inner12 } virtual_ipaddress { 192.168.2.100 } } virtual_server 192.168.1.120 80 { delay_loop 6 lb_algo wlc lb_kind NAT protocol TCP real_server 192.168.2.111 80 { TCP_CHECK { connect_timeout 10 } } real_server 192.168.2.112 80 { TCP_CHECK { connect_timeout 10 } } } LVS_INNER 区 - state マスタ側: MASTER 、待機側:BACKUP - priority(優先度) マスタ側: 100 、待機側:90 Virtual_Server 区 ipvsadm の設定をしない代わりに、ここでの設 定がLVSに反映される
  15. Keepalived.conf(LVS-2側) global_defs { notification_email { superuser@domain.local } notification_email_from noreply@domain.local smtp_server

    127.0.0.1 smtp_connect_timeout 10 } vrrp_sync_group VG1 { group { LVS_OUTER LVS_INNER } } vrrp_instance LVS_OUTER { state BACKUP interface eth1 # public_network virtual_router_id 10 priority 90 advert_int 1 authentication { auth_type PASS auth_pass outer11 } virtual_ipaddress { 192.168.1.120 } } 今回は eth1(外側)とeth2(内側)で別のセグメン トを定義するので、2セグメントが同時に切り 替わるよう vrrp_sync_group を定義する LVS_OUTER 区 - state マスタ側: MASTER 、待機側:BACKUP - priority(優先度) マスタ側: 100 、待機側:90
  16. Keepalived.conf (LVS-2側) vrrp_instance LVS_INNER { state BACKUP interface eth2 #

    private_network virtual_router_id 10 priority 90 advert_int 1 authentication { auth_type PASS auth_pass inner12 } virtual_ipaddress { 192.168.2.100 } } virtual_server 192.168.1.120 80 { delay_loop 6 lb_algo wlc lb_kind NAT protocol TCP real_server 192.168.2.111 80 { TCP_CHECK { connect_timeout 10 } } real_server 192.168.2.112 80 { TCP_CHECK { connect_timeout 10 } } } LVS_INNER 区 - state マスタ側: MASTER 、待機側:BACKUP - priority(優先度) マスタ側: 100 、待機側:90 Virtual_Server 区 ipvsadm の設定をしない代わりに、ここでの設 定がLVSに反映される
  17. LVSの設定変更-3  keepalivedを有効化する(LVS-1,LVS-2それぞれ)  LVSの状態を確認する  実際にブラウザで表示する  LVS-1側がアクティブの場合、LVS-1をシャットダウンして 改めてブラウザで表示してみる

    sudo systemctl enable keepalived sudo systemctl start keepalived sudo ipvsadm -S ; sudo ipvsadm -ln # テーブルの確認 curl http://192.168.1.120 curl http://192.168.1.120
  18. ふりかえり  keepalivedにおけるreal_serverの設定問題 リアルサーバを2台設定しているはずが、1台目しかLVSに 登録されていない…(PoC用環境の問題?)  backend(node1/node2)の設定問題 初期設定されるNATネットワークが地味に邪魔 再起動した場合、改めてip routeでデフォルトルート飛ばし

    ~経路再設定したほうがいいかも…  firewalld vagrantテンプレート(CentOS/7)だとfirewalldはdisabled になっているけど、本番系ではNAT時のトラフィック開放を 行う必要がある
  19. ふりかえり  PoCなので致し方なしなのですが… LBとかVRRP周りは、アプライアンス(およびサービス)にお 任せしたほうが精神的に楽だと感じました。 AWSだとELBとかDNSの複数値回答ルーティングとか