OpenStack VIP(Virtual IP)を使った冗長構成テスト
論理構成図
Step1:VIP用ポート作成
openstack port create --network train-net --fixed-ip subnet=train-net-subnet,ip-address=10.0.0.202 vip-port
vip-port という名前で train-net ネットワークに IP 10.0.0.202 を固定割り当てしたポートを作成しています。これは後で Floating IP と紐付けて VIP として使うためのポートです。
Step2:VIP ポートID取得/Floating IP を VIP ポートに紐付け
VIP_PORT_ID=$(openstack port list | awk -F '|' "/vip-port/ {gsub(/ /,\"\",\$2); print \$2}")
echo "VIP Port ID: $VIP_PORT_ID"
openstack floating ip set --port $VIP_PORT_ID 172.20.2.11
openstack port list で作成したポートを検索して Port ID を取得しています。
Step3:VM用ポート作成
openstack port create --network train-net --fixed-ip subnet=train-net-subnet,ip-address=10.0.0.200 myvma-port
openstack port create --network train-net --fixed-ip subnet=train-net-subnet,ip-address=10.0.0.201 myvms-port
myvm-a と myvm-s の VM 専用のポートを作成。それぞれ IP 10.0.0.200 / 10.0.0.201 に固定しています。この IP は VIP の背後にある実際のサーバとして機能します。
Step4:Allowed Address Pair 設定
openstack port set --allowed-address ip-address=10.0.0.202 myvma-port
openstack port set --allowed-address ip-address=10.0.0.202 myvms-port
allowed-address pair を設定して、各 VM が VIP (10.0.0.202) を自身で持てるようにしています。これがないと VM は VIP からのパケットを受け取れません。
Keepalived などで アクティブ/スタンバイ切り替えをする場合には必須設定です。
Step5:サーバ作成とポート割当
openstack server create --image Ubuntu2404 --flavor m1.small --key-name mykey --port myvma-port --user-data ~/install_httpd_act myvm-a
openstack server create --image Ubuntu2404 --flavor m1.small --key-name mykey --port myvms-port --user-data ~/install_httpd_stb myvm-s
VM を作成する際に 事前に作ったポートを指定。
--user-data で 起動時スクリプトを流し込み、HTTP サーバなどを自動インストール。
myvm-a はアクティブ用スクリプト、myvm-s はスタンバイ用スクリプトを使っています。
VIP を使った冗長構成テストに向けた設定です。
動作確認
Compute NodeからVMにログインします。VIPが設定されている事が分かります。
virsh list
virsh console instance-00000001
root@myvm-a:~# ip a show ens3
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1442 qdisc fq_codel state UP group default qlen 1000
link/ether fa:16:3e:ae:20:56 brd ff:ff:ff:ff:ff:ff
altname enp0s3
inet 10.0.0.200/24 metric 100 brd 10.0.0.255 scope global dynamic ens3
valid_lft 42229sec preferred_lft 42229sec
inet 10.0.0.202/32 scope global ens3
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:feae:2056/64 scope link
valid_lft forever preferred_lft forever
クライアントからアクセスしてACTに接続している事を確認します。
[user01@ ~(train)]$ curl 172.20.2.11
OpenStack Web Server ACT
ACT⇒Standby切替
apacheを停止させる事で、ACT⇒STBに切り替えます。
root@myvm-a:~# systemctl stop apache2
クライアントからアクセスしてSTBに接続している事を確認します。
VIPが消えている事を確認します。
[user01@ ~(train)]$ curl 172.20.2.11
OpenStack Web Server STB
root@myvm-a:~# ip a show ens3
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1442 qdisc fq_codel state UP group default qlen 1000
link/ether fa:16:3e:ae:20:56 brd ff:ff:ff:ff:ff:ff
altname enp0s3
inet 10.0.0.200/24 metric 100 brd 10.0.0.255 scope global dynamic ens3
valid_lft 42172sec preferred_lft 42172sec
inet6 fe80::f816:3eff:feae:2056/64 scope link
valid_lft forever preferred_lft forever
事前作業
openstack image create --disk-format qcow2 --private --file ~/Images/noble-server-cloudimg-amd64.img Ubuntu2404
openstack keypair create mykey > ~/mykey.pem
chmod 600 ~/mykey.pem
openstack security group rule list default
openstack security group rule create --proto tcp --dst-port 80 default
openstack security group rule create --proto icmp default
install_httpd_act
#!/bin/bash
timedatectl set-timezone Asia/Tokyo
echo "root:test1234" | sudo chpasswd
sudo apt upgrade
sudo apt update
sudo apt install -y apache2
echo "OpenStack Ubuntu Web Server ACT" | sudo tee /var/www/html/index.html
sudo apt update && sudo apt install -y keepalived
cat <<EOF | sudo tee /etc/keepalived/keepalived.conf
vrrp_script chk_httpd {
script "/etc/keepalived/check_httpd.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens3
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.202
}
track_script {
chk_httpd
}
}i
EOF
cat <<EOF | sudo tee /etc/keepalived/check_httpd.sh
#!/bin/bash
/usr/bin/curl -sf http://127.0.0.1/ >/dev/null 2>&1 || exit 1
exit 0
EOF
chmod +x /etc/keepalived/check_httpd.sh
sudo systemctl enable --now keepalived
install_httpd_stb
#!/bin/bash
timedatectl set-timezone Asia/Tokyo
echo "root:test1234" | sudo chpasswd
sudo apt upgrade
sudo apt update
sudo apt install -y apache2
echo "OpenStack Ubuntu Web Server STB" | sudo tee /var/www/html/index.html
sudo apt update && sudo apt install -y keepalived
cat <<EOF | sudo tee /etc/keepalived/keepalived.conf
vrrp_script chk_httpd {
script "/etc/keepalived/check_httpd.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens3
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.202
}
track_script {
chk_httpd
}
}i
EOF
cat <<EOF | sudo tee /etc/keepalived/check_httpd.sh
#!/bin/bash
/usr/bin/curl -sf http://127.0.0.1/ >/dev/null 2>&1 || exit 1
exit 0
EOF
chmod +x /etc/keepalived/check_httpd.sh
sudo systemctl enable --now keepalived