Ubuntu 安装与配置

本节描述了如何在 Ubuntu 18.04 (LTS) 上安装和配置负载均衡器服务。

先决条件

在安装和配置服务之前,您必须创建一个数据库、服务凭证和 API 端点。

  1. 创建数据库,请完成以下步骤

    • 使用数据库访问客户端以 root 用户身份连接到数据库服务器

      # mysql
      
    • 创建 octavia 数据库

      CREATE DATABASE octavia;
      
    • 授予 octavia 数据库适当的访问权限

      GRANT ALL PRIVILEGES ON octavia.* TO 'octavia'@'localhost' \
      IDENTIFIED BY 'OCTAVIA_DBPASS';
      GRANT ALL PRIVILEGES ON octavia.* TO 'octavia'@'%' \
      IDENTIFIED BY 'OCTAVIA_DBPASS';
      

      将 OCTAVIA_DBPASS 替换为合适的密码。

    • 退出数据库访问客户端。

      exit;
      
  2. 激活 admin 凭证以访问仅管理员可用的 CLI 命令

    $ . admin-openrc
    
  3. 要创建 Octavia 服务凭证,请完成以下步骤

    • 创建 octavia 用户

      $ openstack user create --domain default --password-prompt octavia
        User Password:
        Repeat User Password:
        +---------------------+----------------------------------+
        | Field               | Value                            |
        +---------------------+----------------------------------+
        | domain_id           | default                          |
        | enabled             | True                             |
        | id                  | b18ee38e06034b748141beda8fc8bfad |
        | name                | octavia                          |
        | options             | {}                               |
        | password_expires_at | None                             |
        +---------------------+----------------------------------+
      
    • admin 角色添加到 octavia 用户

      $ openstack role add --project service --user octavia admin
      

      注意

      此命令不会产生任何输出。

      注意

      Octavia 服务不需要完整的 admin 角色。关于如何在没有 admin 角色的情况下运行 Octavia 的详细信息将在本文档的未来版本中提供。

    • 创建 octavia 服务实体

      $ openstack service create --name octavia --description "OpenStack Octavia" load-balancer
        +-------------+----------------------------------+
        | Field       | Value                            |
        +-------------+----------------------------------+
        | description | OpenStack Octavia                |
        | enabled     | True                             |
        | id          | d854f6fff0a64f77bda8003c8dedfada |
        | name        | octavia                          |
        | type        | load-balancer                    |
        +-------------+----------------------------------+
      
  4. 创建负载均衡器服务 API 端点

    $ openstack endpoint create --region RegionOne \
      load-balancer public http://controller:9876
      +--------------+----------------------------------+
      | Field        | Value                            |
      +--------------+----------------------------------+
      | enabled      | True                             |
      | id           | 47cf883de46242c39f147c52f2958ebf |
      | interface    | public                           |
      | region       | RegionOne                        |
      | region_id    | RegionOne                        |
      | service_id   | d854f6fff0a64f77bda8003c8dedfada |
      | service_name | octavia                          |
      | service_type | load-balancer                    |
      | url          | http://controller:9876           |
      +--------------+----------------------------------+
    
    $ openstack endpoint create --region RegionOne \
      load-balancer internal http://controller:9876
      +--------------+----------------------------------+
      | Field        | Value                            |
      +--------------+----------------------------------+
      | enabled      | True                             |
      | id           | 225aef8465ef4df48a341aaaf2b0a390 |
      | interface    | internal                         |
      | region       | RegionOne                        |
      | region_id    | RegionOne                        |
      | service_id   | d854f6fff0a64f77bda8003c8dedfada |
      | service_name | octavia                          |
      | service_type | load-balancer                    |
      | url          | http://controller:9876           |
      +--------------+----------------------------------+
    
    $ openstack endpoint create --region RegionOne \
      load-balancer admin http://controller:9876
      +--------------+----------------------------------+
      | Field        | Value                            |
      +--------------+----------------------------------+
      | enabled      | True                             |
      | id           | 375eb5057fb546edbdf3ee4866179672 |
      | interface    | admin                            |
      | region       | RegionOne                        |
      | region_id    | RegionOne                        |
      | service_id   | d854f6fff0a64f77bda8003c8dedfada |
      | service_name | octavia                          |
      | service_type | load-balancer                    |
      | url          | http://controller:9876           |
      +--------------+----------------------------------+
    
  5. 创建 octavia-openrc 文件

    cat << EOF >> $HOME/octavia-openrc
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_NAME=service
    export OS_USERNAME=octavia
    export OS_PASSWORD=OCTAVIA_PASS
    export OS_AUTH_URL=http://controller:5000
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2
    export OS_VOLUME_API_VERSION=3
    EOF
    

    将 OCTAVIA_PASS 替换为您在 Identity 服务中为 octavia 用户选择的密码。

  6. 激活 octavia 凭证以访问 octavia CLI 命令

    $ . $HOME/octavia-openrc
    
  7. 创建 amphora 镜像

    有关创建 amphora 镜像,请参阅 构建 Octavia Amphora 镜像

  8. 上传 amphora 镜像

    $ openstack image create --disk-format qcow2 --container-format bare \
      --private --tag amphora \
      --file <path to the amphora image> amphora-x64-haproxy
    
  9. 为 amphora 镜像创建一个 flavor

    $ openstack flavor create --id 200 --vcpus 1 --ram 1024 \
      --disk 2 "amphora" --private
    

安装和配置组件

  1. 安装软件包

    # apt install octavia-api octavia-health-manager octavia-housekeeping \
      octavia-worker python3-octavia python3-octaviaclient
    

    如果 octavia-common 和 octavia-api 包要求您进行配置,请选择“否”。

  2. 创建证书

    $ git clone https://opendev.org/openstack/octavia.git
    $ cd octavia/bin/
    $ source create_dual_intermediate_CA.sh
    $ sudo mkdir -p /etc/octavia/certs/private
    $ sudo chmod 755 /etc/octavia -R
    $ sudo cp -p etc/octavia/certs/server_ca.cert.pem /etc/octavia/certs
    $ sudo cp -p etc/octavia/certs/server_ca-chain.cert.pem /etc/octavia/certs
    $ sudo cp -p etc/octavia/certs/server_ca.key.pem /etc/octavia/certs/private
    $ sudo cp -p etc/octavia/certs/client_ca.cert.pem /etc/octavia/certs
    $ sudo cp -p etc/octavia/certs/client.cert-and-key.pem /etc/octavia/certs/private
    

    对于生产环境,请参阅 Octavia 证书配置指南

  3. 激活 octavia 凭证以访问 octavia CLI 命令

    $ . octavia-openrc
    
  4. 创建安全组及其规则

    $ openstack security group create lb-mgmt-sec-grp
    $ openstack security group rule create --protocol icmp lb-mgmt-sec-grp
    $ openstack security group rule create --protocol tcp --dst-port 22 lb-mgmt-sec-grp
    $ openstack security group rule create --protocol tcp --dst-port 9443 lb-mgmt-sec-grp
    $ openstack security group create lb-health-mgr-sec-grp
    $ openstack security group rule create --protocol udp --dst-port 5555 lb-health-mgr-sec-grp
    
  5. 创建一个密钥对以登录到 amphora 实例

    $ openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
    

    注意

    提前检查 “ ~/.ssh/id_rsa.pub” 文件是否存在。如果文件不存在,请运行 ssh-keygen 命令创建它。

  6. 为 dhclient 创建 dhclient.conf 文件

    $ cd $HOME
    $ sudo mkdir -m755 -p /etc/dhcp/octavia
    $ sudo cp octavia/etc/dhcp/dhclient.conf /etc/dhcp/octavia
    
  7. 创建网络

    注意

    在执行以下命令期间,请将 BRNAME 和 MGMT_PORT_MAC 保存到记事本中以供进一步参考。

    $ OCTAVIA_MGMT_SUBNET=172.16.0.0/12
    $ OCTAVIA_MGMT_SUBNET_START=172.16.0.100
    $ OCTAVIA_MGMT_SUBNET_END=172.16.31.254
    $ OCTAVIA_MGMT_PORT_IP=172.16.0.2
    
    $ openstack network create lb-mgmt-net
    $ openstack subnet create --subnet-range $OCTAVIA_MGMT_SUBNET --allocation-pool \
      start=$OCTAVIA_MGMT_SUBNET_START,end=$OCTAVIA_MGMT_SUBNET_END \
      --network lb-mgmt-net lb-mgmt-subnet
    
    $ SUBNET_ID=$(openstack subnet show lb-mgmt-subnet -f value -c id)
    $ PORT_FIXED_IP="--fixed-ip subnet=$SUBNET_ID,ip-address=$OCTAVIA_MGMT_PORT_IP"
    
    $ MGMT_PORT_ID=$(openstack port create --security-group \
      lb-health-mgr-sec-grp --device-owner Octavia:health-mgr \
      --host=$(hostname) -c id -f value --network lb-mgmt-net \
      $PORT_FIXED_IP octavia-health-manager-listen-port)
    
    $ MGMT_PORT_MAC=$(openstack port show -c mac_address -f value \
      $MGMT_PORT_ID)
    
    $ sudo ip link add o-hm0 type veth peer name o-bhm0
    $ NETID=$(openstack network show lb-mgmt-net -c id -f value)
    $ BRNAME=brq$(echo $NETID|cut -c 1-11)
    $ sudo brctl addif $BRNAME o-bhm0
    $ sudo ip link set o-bhm0 up
    
    $ sudo ip link set dev o-hm0 address $MGMT_PORT_MAC
    $ sudo iptables -I INPUT -i o-hm0 -p udp --dport 5555 -j ACCEPT
    $ sudo dhclient -v o-hm0 -cf /etc/dhcp/octavia
    
  8. 主机重新启动后,需要以下设置来创建 veth 对

    编辑 /etc/systemd/network/o-hm0.network 文件

    [Match]
    Name=o-hm0
    
    [Network]
    DHCP=yes
    

    编辑 /etc/systemd/system/octavia-interface.service 文件

    [Unit]
    Description=Octavia Interface Creator
    Requires=neutron-linuxbridge-agent.service
    After=neutron-linuxbridge-agent.service
    
    [Service]
    Type=oneshot
    RemainAfterExit=true
    ExecStart=/opt/octavia-interface.sh start
    ExecStop=/opt/octavia-interface.sh stop
    
    [Install]
    WantedBy=multi-user.target
    

    编辑 /opt/octavia-interface.sh 文件

    #!/bin/bash
    
    set -ex
    
    MAC=$MGMT_PORT_MAC
    BRNAME=$BRNAME
    
    if [ "$1" == "start" ]; then
      ip link add o-hm0 type veth peer name o-bhm0
      brctl addif $BRNAME o-bhm0
      ip link set o-bhm0 up
      ip link set dev o-hm0 address $MAC
      ip link set o-hm0 up
      iptables -I INPUT -i o-hm0 -p udp --dport 5555 -j ACCEPT
    elif [ "$1" == "stop" ]; then
      ip link del o-hm0
    else
      brctl show $BRNAME
      ip a s dev o-hm0
    fi
    

    您需要将 $MGMT_PORT_MAC 和 $BRNAME 替换为您的环境中的值。

  9. 编辑 /etc/octavia/octavia.conf 文件

    • [database] 部分,配置数据库访问

      [database]
      connection = mysql+pymysql://octavia:OCTAVIA_DBPASS@controller/octavia
      

      将 OCTAVIA_DBPASS 替换为您为 Octavia 数据库选择的密码。

    • [DEFAULT] 部分,配置 RabbitMQ 消息代理的传输 URL。

      [DEFAULT]
      transport_url = rabbit://openstack:RABBIT_PASS@controller
      

      将 RABBIT_PASS 替换为您在 RabbitMQ 中为 openstack 帐户选择的密码。

    • [oslo_messaging] 部分,配置 RabbitMQ 消息代理的传输 URL 和主题名称。

      [oslo_messaging]
      ...
      topic = octavia_prov
      

      将 RABBIT_PASS 替换为您在 RabbitMQ 中为 openstack 帐户选择的密码。

    • [api_settings] 部分,配置要绑定的主机 IP 和端口。

      [api_settings]
      bind_host = 0.0.0.0
      bind_port = 9876
      
    • [keystone_authtoken] 部分,配置身份服务访问。

      [keystone_authtoken]
      www_authenticate_uri = http://controller:5000
      auth_url = http://controller:5000
      memcached_servers = controller:11211
      auth_type = password
      project_domain_name = Default
      user_domain_name = Default
      project_name = service
      username = octavia
      password = OCTAVIA_PASS
      

      将 OCTAVIA_PASS 替换为您在 Identity 服务中为 octavia 用户选择的密码。

    • [service_auth] 部分,配置使用其他 openstack 服务所需的凭证

      [service_auth]
      auth_url = http://controller:5000
      memcached_servers = controller:11211
      auth_type = password
      project_domain_name = Default
      user_domain_name = Default
      project_name = service
      username = octavia
      password = OCTAVIA_PASS
      

      将 OCTAVIA_PASS 替换为您在 Identity 服务中为 octavia 用户选择的密码。

    • [certificates] 部分,配置 CA 证书、用于签名的私钥和密码的绝对路径。

      [certificates]
      ...
      server_certs_key_passphrase = insecure-key-do-not-use-this-key
      ca_private_key_passphrase = not-secure-passphrase
      ca_private_key = /etc/octavia/certs/private/server_ca.key.pem
      ca_certificate = /etc/octavia/certs/server_ca.cert.pem
      

      注意

      ca_private_key_passphrase 和 server_certs_key_passphrase 的值是默认值,不应在生产环境中使用。server_certs_key_passphrase 必须是 base64 兼容且长度为 32 个字符的字符串。

    • [haproxy_amphora] 部分,配置客户端证书和 CA。

      [haproxy_amphora]
      ...
      server_ca = /etc/octavia/certs/server_ca-chain.cert.pem
      client_cert = /etc/octavia/certs/private/client.cert-and-key.pem
      
    • [health_manager] 部分,配置心跳的 IP 和端口号。

      [health_manager]
      ...
      bind_port = 5555
      bind_ip = 172.16.0.2
      controller_ip_port_list = 172.16.0.2:5555
      
    • [controller_worker] 部分,配置 worker 设置。

      [controller_worker]
      ...
      amp_image_owner_id = <id of service project>
      amp_image_tag = amphora
      amp_ssh_key_name = mykey
      amp_secgroup_list = <lb-mgmt-sec-grp_id>
      amp_boot_network_list = <lb-mgmt-net_id>
      amp_flavor_id = 200
      network_driver = allowed_address_pairs_driver
      compute_driver = compute_nova_driver
      amphora_driver = amphora_haproxy_rest_driver
      client_ca = /etc/octavia/certs/client_ca.cert.pem
      
  10. 填充 octavia 数据库

# octavia-db-manage --config-file /etc/octavia/octavia.conf upgrade head

完成安装

重启服务

# systemctl restart octavia-api octavia-health-manager octavia-housekeeping octavia-worker