配置 Octavia 负载均衡服务(可选)

Octavia 是一个 OpenStack 项目,它通过为每个负载均衡器部署到自己的虚拟机,并利用 haproxy 执行负载均衡,从而提供运营商级别的负载均衡(与命名空间驱动程序相反)。

Octavia 具有可扩展性和内置的高可用性,通过主动-被动模式实现。

OpenStack-Ansible 部署

  1. 在控制器上创建 br-lbaas 网桥。创建 br-lbaas 在部署器主机准备期间完成,不属于 openstack-ansible 的范围。br-lbaas 的使用方式的说明如下。

  2. 为 Octavia 创建 openstack-ansible 容器。为此,您需要在 openstack_user_config.yml 中为 octavia-infra_hosts 组定义主机。完成此操作后,运行以下 playbook

    openstack-ansible playbooks/containers-lxc-create.yml --limit lxc_hosts,octavia_all
    
  3. 定义 openstack-ansible octavia role 的 defaults/main.yml 中变量所需的覆盖。

  4. 运行 os-octavia playbook

    openstack-ansible playbooks/os-octavia-install.yml
    
  5. 运行 haproxy-install.yml playbook,将新的 octavia API 端点添加到负载均衡器。

为 Amphora 驱动程序定义项目配额

Octavia 的 Amphora 驱动程序是在使用 Octavia 启动负载均衡器的默认选项。该驱动程序依赖于 OpenStack Nova/Neutron 服务,从专用镜像中启动虚拟机,这些虚拟机充当负载均衡器。

这些虚拟机默认在 service 项目中创建,租户无法直接访问它们。

因此,操作员必须确保 service 项目具有足够的配额定义,以处理其中的所有租户负载均衡器。

建议的方法是通过利用 openstack.osa.openstack_resources playbook,并在 user_variables.ymlgroup_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 构建的镜像必须在容器外部构建。对于此过程,请使用环境中的一个物理主机。

  1. 安装必要的软件包并配置 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
    
  2. 克隆必要的存储库和依赖项

    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
    
  3. 运行 Octavia 的 diskimage 脚本

    octavia/diskimage-create 目录中运行

    ./diskimage-create.sh
    

    禁用 octavia-image-build venv

    deactivate
    
  4. 将创建的用户镜像上传到 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 访问权限可能是有益的。按照以下步骤启用访问权限。

  1. 相应地配置 Octavia

    octavia_ssh_enabled: True 添加到 /etc/openstack-deploy 中的用户文件

  2. 运行 os_octavia role。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_STANDBYoctavia_enable_anti_affinity=True,以确保主动和被动 amphora(取决于 nova 中部署的反亲和力过滤器)位于两个不同的主机上

我们还建议设置更具体的 octavia_cert_dir,以防止意外的证书轮换。