配置 Octavia 负载均衡服务(可选)¶
Octavia 是一个 OpenStack 项目,它通过为每个负载均衡器部署到自己的虚拟机,并利用 haproxy 执行负载均衡,从而提供运营商级别的负载均衡(与命名空间驱动程序相反)。
Octavia 具有可扩展性和内置的高可用性,通过主动-被动模式实现。
OpenStack-Ansible 部署¶
在控制器上创建
br-lbaas网桥。创建 br-lbaas 在部署器主机准备期间完成,不属于 openstack-ansible 的范围。br-lbaas 的使用方式的说明如下。为 Octavia 创建 openstack-ansible 容器。为此,您需要在
openstack_user_config.yml中为octavia-infra_hosts组定义主机。完成此操作后,运行以下 playbookopenstack-ansible playbooks/containers-lxc-create.yml --limit lxc_hosts,octavia_all定义 openstack-ansible octavia role 的 defaults/main.yml 中变量所需的覆盖。
运行 os-octavia playbook
openstack-ansible playbooks/os-octavia-install.yml运行 haproxy-install.yml playbook,将新的 octavia API 端点添加到负载均衡器。
为 Amphora 驱动程序定义项目配额¶
Octavia 的 Amphora 驱动程序是在使用 Octavia 启动负载均衡器的默认选项。该驱动程序依赖于 OpenStack Nova/Neutron 服务,从专用镜像中启动虚拟机,这些虚拟机充当负载均衡器。
这些虚拟机默认在 service 项目中创建,租户无法直接访问它们。
因此,操作员必须确保 service 项目具有足够的配额定义,以处理其中的所有租户负载均衡器。
建议的方法是通过利用 openstack.osa.openstack_resources playbook,并在 user_variables.yml 或 group_vars/utility_all 中定义以下变量
# In case of `octavia_loadbalancer_topology` set to ACTIVE_STANDBY (default)
# each Load Balancer will create 2 VMs
_max_amphora_instances: 10000
openstack_user_identity:
quotas:
- name: "service"
# Default Amphora flavor is 1 Core, 1024MB RAM
cores: "{{ _max_amphora_instances }}"
ram: "{{ (_max_amphora_instances | int) * 1024 }}"
instances: "{{ _max_amphora_instances }}"
port: "{{ (_max_amphora_instances | int) * 10 }}"
server_groups: "{{ ((_max_amphora_instances | int) * 0.5) | int | abs }}"
server_group_members: 50
# A security group is created per Load Balancer listener
security_group: "{{ (_max_amphora_instances | int) * 1.5 | int | abs }}"
security_group_rule: "{{ ((_max_amphora_instances | int) * 1.5 | int | abs) * 100 }}"
# If `octavia_cinder_enabled: true` also define these
volumes: "{{ _max_amphora_instances }}"
# Volume size is defined with `octavia_cinder_volume_size` with default of 20
gigabytes: "{{ (_max_amphora_instances | int) * 20 }}"
这些值将在运行 openstack-ansible openstack.osa.openstack_resources 或作为 openstack.osa.setup_openstack playbook 的一部分应用。
为 Octavia 设置 neutron 网络¶
Octavia 需要控制平面和负载均衡器虚拟机之间的连接。为此,应创建一个提供 L2 连接的提供程序网络,该网络将控制器(容器化或部署在物理机上)上的 octavia 服务与 octavia amphora 虚拟机连接起来。请参阅 octavia 服务的相应文档,并查阅此项目中的测试,以获取一个可用的示例。
需要特别注意提供程序网络的 --allocation-pool,不要使用与分配给主机、lxc 容器或其他基础设施(如路由器或防火墙)的 IP 地址重叠的 IP 地址。
一个示例,为 OSA 动态库存提供 172.29.232.0-9/22,并将剩余地址分配给 neutron 分配池,而不会重叠,如下所示
在 openstack_user_config.yml 中,如下所示
#the address range for the whole lbaas network
cidr_networks:
lbaas: 172.29.232.0/22
#the range of ip addresses excluded from the dynamic inventory
used_ips:
- "172.29.232.10,172.29.235.200"
并在 user_variables.yml 中定义
#the range of addresses which neutron can allocate for amphora VM
octavia_management_net_subnet_allocation_pools: "172.29.232.10-172.29.235.200"
注意
如果将 octavia_ip_tables_fw 设置为 True(默认值),系统将部署一个 iptables 防火墙。这为控制平面提供了额外的保护,以防负载均衡器虚拟机受到损害。请仔细检查规则并根据您的安装进行调整。请注意,未启用丢弃数据包的日志记录,您需要手动添加这些规则。
FLAT 网络场景¶
在一般情况下,neutron 网络可以是一个简单的扁平网络。但是,在复杂的情况下,它可以是您需要的任何网络。确保相应地调整部署。以下是 openstack_user_config.yml 中的一个示例条目
- network:
container_bridge: "br-lbaas"
container_type: "veth"
container_interface: "eth14"
host_bind_override: "bond0" # Defines neutron physical network mapping
ip_from_q: "octavia"
type: "flat"
net_name: "octavia"
group_binds:
- neutron_linuxbridge_agent
- octavia-worker
- octavia-housekeeping
- octavia-health-manager
如果不同意使用 lbaas 作为提供程序网络名称和 lbaas-mgmt 作为 neutron 名称,则需要调整几个变量。此外,系统会尝试根据库存推断某些值,这并不总是有效,因此可能需要显式声明这些值。有关更多信息,请查看 defaults/main.yml 文件。
octavia ansible role 可以创建所需的 neutron 网络。请查看相应的设置 - 特别是 octavia_management_net_subnet_cidr,应根据您的环境进行调整。或者,可以在其他地方预先创建 neutron 网络,并由 Octavia 消耗。
VLAN 网络场景¶
如果您想利用标准的 VLAN 网络来用于 Octavia 管理网络,则 openstack_user_config.yml 中的定义可能如下所示
- network:
container_bridge: "br-lbaas"
container_type: "veth"
container_interface: "eth14"
ip_from_q: "lbaas"
type: "raw"
net_name: lbaas
group_binds:
- neutron_linuxbridge_agent
- octavia-worker
- octavia-housekeeping
- octavia-health-manager
使用以下覆盖扩展 user_variables.yml
octavia_provider_network_name: vlan
octavia_provider_network_type: vlan
octavia_provider_segmentation_id: 400
octavia_provider_inventory_net_name: lbaas
此外,您需要确保在控制器节点上有一个接口,该接口将 neutron 管理的 br-vlan 与 br-lbaas 链接起来(对于 br-vlan 已经存在于同时托管 neutron L3 代理的控制器上的情况)。创建 veth 对或 macvlans 可能会适合。
构建 Octavia 镜像¶
注意
默认行为是从 OpenStack artifact 存储下载 Octavia 团队每天提供的测试镜像。由于此镜像不会及时应用操作系统安全补丁,因此不适合生产使用。
一些操作系统供应商可能会提供官方 amphora 构建,或者组织可能会维护自己的 artifact 存储 - 对于这些情况,也可以利用自动下载。
使用 diskimage-builder 构建的镜像必须在容器外部构建。对于此过程,请使用环境中的一个物理主机。
安装必要的软件包并配置 Python 虚拟环境
apt-get install qemu uuid-runtime curl kpartx git jq python3-pip pip3 install virtualenv virtualenv -p /usr/bin/python3 /opt/octavia-image-build source /opt/octavia-image-build/bin/activate
克隆必要的存储库和依赖项
git clone https://opendev.org/openstack/octavia.git /opt/octavia-image-build/bin/pip install --isolated \ git+https://git.openstack.org/openstack/diskimage-builder.git
运行 Octavia 的 diskimage 脚本
在
octavia/diskimage-create目录中运行./diskimage-create.sh
禁用
octavia-image-buildvenvdeactivate
将创建的用户镜像上传到 Image (glance) 服务
openstack image create --disk-format qcow2 \ --container-format bare --tag octavia-amphora-image --file amphora-x64-haproxy.qcow2 \ --private --project service amphora-x64-haproxy
注意
或者,您可以指定适当设置中的新镜像,并使用适当的标签重新运行 ansible。
您可以在 https://opendev.org/openstack/octavia/tree/2025.2/diskimage-create 处找到有关 diskimage 脚本和流程的更多信息
这是一个执行所有这些任务的脚本
#/bin/sh apt-get install qemu uuid-runtime curl kpartx git jq pip -v >/dev/null || {apt-get install python3-pip} pip3 install virtualenv virtualenv -p /usr/bin/python3 /opt/octavia-image-build || exit 1 source /opt/octavia-image-build/bin/activate pushd /tmp git clone https://opendev.org/openstack/octavia.git /opt/octavia-image-build/bin/pip install --isolated \ git+https://git.openstack.org/openstack/diskimage-builder.git pushd octavia/diskimage-create ./diskimage-create.sh mv amphora-x64-haproxy.qcow2 /tmp deactivate popd popd # upload image openstack image delete amphora-x64-haproxy openstack image create --disk-format qcow2 \ --container-format bare --tag octavia-amphora-image --file /tmp/amphora-x64-haproxy.qcow2 \ --private --project service amphora-x64-haproxy
注意
如果您在从 pipy 安装 dib-utils 时遇到问题,请考虑直接从源代码安装 pip install git+https://opendev.org/openstack/dib-utils.git
创建加密证书¶
注意
对于生产安装,请务必仔细查看此内容,并根据您自己的安全要求使用您自己的 CA 签署证书。
系统将自动生成并使用自签名证书,为控制平面和 amphora 使用不同的证书颁发机构。请务必将副本保存在安全的地方,以备潜在的灾难恢复之用。
可选:配置 Octavia 以使用 ssh 访问 amphora¶
在极少数情况下,为了额外的故障排除,获得对 amphora 的 ssh 访问权限可能是有益的。按照以下步骤启用访问权限。
相应地配置 Octavia
将
octavia_ssh_enabled: True添加到 /etc/openstack-deploy 中的用户文件运行
os_octaviarole。SSH 密钥将被生成并上传
注意
SSH 密钥将存储在 octavia_keypair_setup_host(默认情况下为 localhost)中的 ~/.ssh/{{ octavia_ssh_key_name }} 中
可选:调整 Octavia 以用于生产¶
请仔细查看 main.yml 中的可调整参数。最重要的更改是将 Octavia 设置为 ACTIVE_STANDBY 模式,方法是在 /etc/openstack-deploy 中的用户文件中添加 octavia_loadbalancer_topology: ACTIVE_STANDBY 和 octavia_enable_anti_affinity=True,以确保主动和被动 amphora(取决于 nova 中部署的反亲和力过滤器)位于两个不同的主机上
我们还建议设置更具体的 octavia_cert_dir,以防止意外的证书轮换。