Devstack 与 Octavia 负载均衡

从 OpenStack Pike 版本开始,Octavia 现在是一个独立的的服务,为 OpenStack 提供负载均衡服务。

本指南将向您展示如何创建一个启用 Octavia API 的 devstack。

阶段 1:创建 DevStack + 2 个 nova 实例

首先,设置一个您选择的虚拟机,至少 8 GB RAM 和 16 GB 磁盘空间,并确保已更新。安装 git 和您认为有用的任何其他开发工具。

安装 devstack

git clone https://opendev.org/openstack/devstack
cd devstack/tools
sudo ./create-stack-user.sh
cd ../..
sudo mv devstack /opt/stack
sudo chown -R stack.stack /opt/stack/devstack

这将克隆当前的 devstack 代码到本地,然后设置 devstack 服务将运行的“stack”帐户。最后,它会将 devstack 移动到其默认位置 /opt/stack/devstack。

编辑您的 /opt/stack/devstack/local.conf 使其看起来像

[[local|localrc]]
# ===== BEGIN localrc =====
DATABASE_PASSWORD=password
ADMIN_PASSWORD=password
SERVICE_PASSWORD=password
SERVICE_TOKEN=password
RABBIT_PASSWORD=password
GIT_BASE=https://opendev.org
# Optional settings:
# OCTAVIA_AMP_BASE_OS=centos
# OCTAVIA_AMP_DISTRIBUTION_RELEASE_ID=9-stream
# OCTAVIA_AMP_IMAGE_SIZE=3
# OCTAVIA_LB_TOPOLOGY=ACTIVE_STANDBY
# OCTAVIA_ENABLE_AMPHORAV2_JOBBOARD=True
# LIBS_FROM_GIT+=octavia-lib,
# Enable Logging
LOGFILE=$DEST/logs/stack.sh.log
VERBOSE=True
LOG_COLOR=True
enable_service rabbit
enable_plugin neutron $GIT_BASE/openstack/neutron
# Octavia supports using QoS policies on the VIP port:
enable_service q-qos
enable_service placement-api placement-client
# Octavia services
enable_plugin octavia $GIT_BASE/openstack/octavia master
enable_plugin octavia-dashboard $GIT_BASE/openstack/octavia-dashboard
enable_plugin ovn-octavia-provider $GIT_BASE/openstack/ovn-octavia-provider
enable_plugin octavia-tempest-plugin $GIT_BASE/openstack/octavia-tempest-plugin
enable_service octavia o-api o-cw o-hm o-hk o-da
# If you are enabling barbican for TLS offload in Octavia, include it here.
# enable_plugin barbican $GIT_BASE/openstack/barbican
# enable_service barbican
# Cinder (optional)
disable_service c-api c-vol c-sch
# Tempest
enable_service tempest
# ===== END localrc =====

注意

为了获得最佳性能,强烈建议使用 KVM 虚拟化而不是 QEMU。 此外,请确保如 相关指南 中所述启用嵌套虚拟化。 通过将 LIBVIRT_CPU_MODE="host-passthrough" 添加到您的 local.conf,您可以使访客虚拟机利用主机 CPU 提供的所有功能。

运行 stack.sh 并进行一些健全性检查

sudo su - stack
cd /opt/stack/devstack
./stack.sh
. ./openrc

openstack network list  # should show public and private networks

创建两个 nova 实例,我们可以将其用作测试 http 服务器

# create nova instances on private network
openstack server create --image $(openstack image list | awk '/ cirros-.*-x86_64-.* / {print $2}') --flavor 1 --nic net-id=$(openstack network list | awk '/ private / {print $2}') node1
openstack server create --image $(openstack image list | awk '/ cirros-.*-x86_64-.* / {print $2}') --flavor 1 --nic net-id=$(openstack network list | awk '/ private / {print $2}') node2
openstack server list # should show the nova instances just created

# add secgroup rules to allow ssh etc..
openstack security group rule create default --protocol icmp
openstack security group rule create default --protocol tcp --dst-port 22:22
openstack security group rule create default --protocol tcp --dst-port 80:80

在每个实例上设置一个简单的 Web 服务器。 一种可能性是使用 Golang 测试服务器,该服务器也由 Octavia 项目用于 CI 测试。 将二进制文件复制到您的实例并按如下所示启动它(用户名 ‘cirros’,密码 ‘gocubsgo’)

INST_IP=<instance IP>
scp -O test_server.bin cirros@${INST_IP}:
ssh -f cirros@${INST_IP} ./test_server.bin -id ${INST_IP}

以这种方式启动后,测试服务器将使用其自身的 IP 地址响应 HTTP 请求。

阶段 2:创建您的负载均衡器

创建您的负载均衡器

openstack loadbalancer create --wait --name lb1 --vip-subnet-id private-subnet
openstack loadbalancer listener create --wait --protocol HTTP --protocol-port 80 --name listener1 lb1
openstack loadbalancer pool create --wait --lb-algorithm ROUND_ROBIN --listener listener1 --protocol HTTP --name pool1
openstack loadbalancer healthmonitor create --wait --delay 5 --timeout 2 --max-retries 1 --type HTTP pool1
openstack loadbalancer member create --wait --subnet-id private-subnet --address <web server 1 address> --protocol-port 80 pool1
openstack loadbalancer member create --wait --subnet-id private-subnet --address <web server 2 address> --protocol-port 80 pool1

请注意:<web server # address> 字段是阶段 1 中创建的 nova 服务器的 IP 地址。 另外请注意,直接使用 API,您可以在一个 API 调用中完成以上所有命令。

阶段 3:测试您的负载均衡器

openstack loadbalancer show lb1 # Note the vip_address
curl http://<vip_address>
curl http://<vip_address>

这应该显示来自每个成员服务器的“欢迎来到 <IP>”消息。