本节介绍了使用非管理员特权的 OpenStack 完全访问的集成过程。

您需要具有管理员特权才能在 OpenStack 上以提供程序模式部署 NSX Advanced Load Balancer 解决方案。管理员特权在系统范围内提供对 OpenStack 资源的访问,例如租户(项目)、用户、角色、网络、路由器和端口等,从而使 NSX Advanced Load Balancer 与 OpenStack 的集成能够无缝地工作。云管理员或操作员无需在 OpenStack 中进行任何其他配置。

不过,对于某些部署,将根据业务或 IT 策略禁用管理员特权。在这些情况下,您将无法在提供程序模式下部署和使用 NSX Advanced Load Balancer。本指南简要说明了 OpenStack 服务策略更改以及对 OpenStack 网络资源的限制,以便在提供程序模式下部署和使用 NSX Advanced Load Balancer 而无需为其授予管理员特权。

创建没有管理员特权的 admin 用户

要使 OpenStack 在没有管理员特权的情况下工作,OpenStack 管理员需要在 OpenStack 中创建 NSX Advanced Load Balancer admin 用户、NSX Advanced Load Balancer admin 角色和租户以在 NSX Advanced Load Balancer 云配置中使用。也可以使用现有的租户。

您可以使用在 NSX Advanced Load Balancer OpenStack 云中配置的 admin 用户(称为 NSX Advanced Load Balancer admin 用户)以建立初始连接,在 Keystone 中进行身份验证以及访问项目、部署的区域和网络以进行初始设置。在完成初始设置后,您可以使用该设置从 OpenStack 导入租户,并访问各种租户中的资源。确保 NSX Advanced Load Balancer admin 用户具有足够的特权以读取租户(项目)、用户和角色,并列出为租户中的用户分配的角色。

NSX Advanced Load Balancer OpenStack 云中的 admin 租户(称为 NSX Advanced Load Balancer admin 租户)是 NSX Advanced Load Balancer 以提供程序模式在其中启动 SE 的租户。确保 admin 用户具有足够的权限以上载 SE 映像、列出类型,以及启动在 NSX Advanced Load Balancer admin 租户中创建或共享的网络中的虚拟机。

您可以在 OpenStack 中创建 NSX Advanced Load Balancer admin 用户,如下所示:

  1. 使用以下命令利用 admin 凭据在 OpenStack 中创建 aviadmin 角色:

    source admin-openrc.sh
  2. 使用以下命令在 OpenStack 云中创建名为 aviuser 的用户:

    config
    $ openstack user create --password avi123 --description 'Avi Admin user' aviuser
  3. 使用以下命令创建 aviadmin 角色:

     $ openstack role create aviadmin 
  4. 使用以下命令创建名为 avilbaas project 的项目以在 OpenStack 中作为 NSX Advanced Load Balancer admin 租户:

    Cloud config
     $ openstack project create --description 'Avi LBaaS Project' avilbaas 
  5. 使用以下命令在 avilbaas 租户中分配 aviuser 用户和 aviadmin 角色:

    $ openstack role add --project avilbaas --user aviuser aviadmin 
  6. aviuser 用户和 aviadmin 角色添加到需要使用 NSX Advanced Load Balancer 负载均衡器服务的其他项目中。以下是 CLI 命令:

    $ openstack role add --project demo --user aviuser aviadmin 
  7. 使用以下命令验证在所有租户中分配给 aviuser 的角色:

    $ openstack role assignment list --user aviuser --names 
  8. 对于非默认域,请在创建 NSX Advanced Load Balancer admin 用户和 NSX Advanced Load Balancer admin 租户时使用所需的域。

OpenStack 策略更改

NSX Advanced Load Balancer Controller 与 Keystone、Nova、Neutron 和 Glance OpenStack 服务进行交互。以下是每种服务所需的策略更改列表:

Keystone 策略更改

以下是针对 Keystone 策略更改进行交互的步骤:

  1. keystone.conf 文件中找到策略文件,例如,

    [oslo_policy]
    policy_file = keystone.policy.yaml 
  2. 在 Keystone 策略文件中定义 aviadmin 角色,例如,keystone.policy.yaml

     "aviadmin_role": "role:aviadmin" 
  3. aviadmin_role 授予以下 API 的访问权限,例如,在 keystone.policy.yaml 中,

    Show domain details
    GET  /v3/domains/{domain_id}
    Intended scope(s): system
    "identity:get_domain": "rule:admin_required or token.project.domain.id:%(target.domain.id)s or rule:aviadmin_role"
          
    List domains
    GET  /v3/domains
    Intended scope(s): system
    "identity:list_domains": "rule:admin_required or rule:aviadmin_role"
       
       
    List endpoints
    GET  /v3/endpoints
    Intended scope(s): system
    "identity:list_endpoints": "rule:admin_required or rule:aviadmin_role"
       
    List projects
    GET  /v3/projects
    Intended scope(s): system
    "identity:list_projects": "rule:admin_required or rule:aviadmin_role"
       
    Show role details
    GET  /v3/roles/{role_id}
    HEAD  /v3/roles/{role_id}
    Intended scope(s): system
    "identity:get_role": "rule:admin_required or rule:aviadmin_role"
       
    List roles
    GET  /v3/roles
    HEAD  /v3/roles
    Intended scope(s): system
    "identity:list_roles": "rule:admin_required or rule:aviadmin_role"
       
    List role assignments
    GET  /v3/role_assignments
    HEAD  /v3/role_assignments
    Intended scope(s): system
    "identity:list_role_assignments": "rule:admin_required or rule:aviadmin_role"
       
    List services
    GET  /v3/services
    Intended scope(s): system
    "identity:list_services": "rule:admin_required or rule:aviadmin_role"
       
    Show user details
    GET  /v3/users/{user_id}
    HEAD  /v3/users/{user_id}
    "identity:get_user": "rule:admin_or_owner or rule:aviadmin_role"
       
    List users
    GET  /v3/users
    HEAD  /v3/users
    Intended scope(s): system
    "identity:list_users": "rule:admin_required or rule:aviadmin_role"  
  4. 使用下列命令重新启动 Keystone 服务:

     apache2ctl restart 

Nova 策略更改

以下是针对 Nova 策略更改进行交互的步骤:

  1. nova.conf 文件中找到策略文件:

    [oslo_policy] policy_file = nova.policy.yaml
  2. 在 Nova 策略文件中定义 aviadmin 角色:

    "aviadmin_role": "role:aviadmin"
  3. aviadmin_role in nova policy file: 授予以下 API 的访问权限:

    List all aggregates
     GET  /os-aggregates
     "os_compute_api:os-aggregates:index": "rule:admin_api or rule:aviadmin_role"
        
     Show details for an aggregate
     GET  /os-aggregates/{aggregate_id}
     "os_compute_api:os-aggregates:show": "rule:admin_api or rule:aviadmin_role"
        
     List availability zone information without host information
     GET  /os-availability-zone
     "os_compute_api:os-availability-zone:list": "rule:admin_or_owner or rule:aviadmin_role"
        
     List detailed availability zone information with host information
     GET  /os-availability-zone/detail
     "os_compute_api:os-availability-zone:detail": "rule:admin_api or rule:aviadmin_role"
        
     List available extensions and show information for an extension by
     alias
     GET  /extensions
     GET  /extensions/{alias}
     "os_compute_api:extensions": "rule:admin_or_owner or rule:aviadmin_role"
        
     It also allows access to the full list of tenants that have access
     to a flavor via an os-flavor-access API.
     GET  /flavors/{flavor_id}/os-flavor-access
     GET  /flavors/detail
     GET  /flavors/{flavor_id}
     POST  /flavors
     PUT  /flavors/{flavor_id}
     "os_compute_api:os-flavor-access": "rule:admin_or_owner or rule:aviadmin_role"
        
     List all servers
     GET  /servers
     "os_compute_api:servers:index": "rule:admin_or_owner or rule:aviadmin_role"
        
     List all servers with detailed information
     GET  /servers/detail
     "os_compute_api:servers:detail": "rule:admin_or_owner or rule:aviadmin_role"
        
     List all servers for all projects
     GET  /servers
     "os_compute_api:servers:index:get_all_tenants": "rule:admin_api or rule:aviadmin_role"
        
     List all servers with detailed information for all projects
     GET  /servers/detail
     "os_compute_api:servers:detail:get_all_tenants": "rule:admin_api or rule:aviadmin_role"
  4. 重新启动 nova-api 服务:

    service nova-api restart

Neutron 策略更改

以下是针对 Neutron 策略更改进行交互的步骤:

  1. neutron.conf 文件中找到策略文件:

    [oslo_policy]
     policy_file = neutron.policy.json 
  2. neutron.policy 文件 (neutron.policy.json):) 中定义 aviadmin 角色:

     "aviadmin_role": "role:aviadmin", 
  3. neutron.policy.json 中为 aviadmin_role 授予以下 API 的访问权限:

     "create_port:device_owner": "not rule:network_device or rule:context_is_advsvc or rule:admin_or_network_owner or rule:aviadmin_role",
        
     "create_port:fixed_ips": "rule:context_is_advsvc or rule:admin_or_network_owner or rule:aviadmin_role",
     "create_port:fixed_ips:ip_address": "rule:context_is_advsvc or rule:admin_or_network_owner or rule:aviadmin_role",
     "create_port:fixed_ips:subnet_id": "rule:context_is_advsvc or rule:admin_or_network_owner or rule:shared or rule:aviadmin_role",
     "create_port:allowed_address_pairs": "rule:admin_or_network_owner or rule:aviadmin_role",
     "get_port": "rule:context_is_advsvc or rule:admin_owner_or_network_owner or rule:aviadmin_role",
     "update_port:fixed_ips": "rule:context_is_advsvc or rule:admin_or_network_owner or rule:aviadmin_role",
     "update_port:fixed_ips:ip_address": "rule:context_is_advsvc or rule:admin_or_network_owner or rule:aviadmin_role",
     "update_port:fixed_ips:subnet_id": "rule:context_is_advsvc or rule:admin_or_network_owner or rule:shared or rule:aviadmin_role",
     "update_port:allowed_address_pairs": "rule:admin_or_network_owner or rule:aviadmin_role ",
     "get_agent": "rule:admin_only or rule:aviadmin_role",
     "get_l3-agents": "rule:admin_only or rule:aviadmin_role",
     "get_loadbalancer-agent": "rule:admin_only or rule:aviadmin_role",
     "get_loadbalancer-pools": "rule:admin_only or rule:aviadmin_role",
     "get_agent-loadbalancers": "rule:admin_only or rule:aviadmin_role",
     "get_loadbalancer-hosting-agent": "rule:admin_only or rule:aviadmin_role",
     "create_floatingip:floating_ip_address": "rule:admin_only or rule:aviadmin_role",
     "get_floatingip": "rule:admin_or_owner or rule:aviadmin_role",
  4. 使用以下命令重新启动 neutron-server 服务:

     service neutron-server restart 

配置云

NSX Advanced Load Balancer Controller 上,使用 aviuser 凭据配置云,并将 avilbaas 作为 admin 租户。在 OpenStack 角色映射中,将 OpenStack aviadmin 角色映射到 NSX Advanced Load Balancer System-Admin 或 Tenant-Admin 角色。

您可以将 map_admin_to_cloud_admin 设置为 True。这会将 avilbaas 租户映射到 NSX Advanced Load Balancer 中的 admin 租户,在 NSX Advanced Load Balancer 中的 admin 租户上执行的任何操作将反映在 avilbaas 租户中。

配置示例

在该示例中,为所有 OpenStack 角色分配了 Tenant-Admin 角色。

[admin:avi-controller]: show cloud Default-Cloud
+------------------------------+--------------------------------------------+
| Field                        | Value                                      |
+------------------------------+--------------------------------------------+
| uuid                         | cloud-4db84437-f236-41cb-996f-11e450976744 |
| name                         | Default-Cloud                              |
| vtype                        | CLOUD_OPENSTACK                            |
| openstack_configuration      |                                            |
|   username                   | aviuser                                    |
|   password                   | [sensitive]                                |
|   admin_tenant               | avilbaas                                   |
|   mgmt_network_name          | mgmt                                       |
|   privilege                  | WRITE_ACCESS                               |
|   use_keystone_auth          | True                                       |
|   region                     | RegionOne                                  |
|   hypervisor                 | KVM                                        |
|   tenant_se                  | False                                      |
|   import_keystone_tenants    | True                                       |
|   anti_affinity              | True                                       |
|   port_security              | False                                      |
|   security_groups            | False                                      |
|   allowed_address_pairs      | True                                       |
|   free_floatingips           | False                                      |
|   img_format                 | OS_IMG_FMT_AUTO                            |
|   use_admin_url              | True                                       |
|   role_mapping[1]            |                                            |
|     os_role                  | *                                          |
|     avi_role                 | Tenant-Admin                               |
|   use_internal_endpoints     | False                                      |
|   config_drive               | True                                       |
|   auth_url                   | http://10.10.32.213:5000/v3                |
|   insecure                   | False                                      |
|   external_networks          | False                                      |
|   neutron_rbac               | True                                       |
|   map_admin_to_cloudadmin    | True                                       |
|   nuage_port                 | 8443                                       |
|   contrail_plugin            | False                                      |
|   name_owner                 | True                                       |
|   use_nuagevip               | False                                      |
|   nuage_virtualip            | False                                      |
|   contrail_disable_policy    | False                                      |
| apic_mode                    | False                                      |
| dhcp_enabled                 | True                                       |
| mtu                          | 1500 bytes                                 |
| prefer_static_routes         | False                                      |
| enable_vip_static_routes     | False                                      |
| license_type                 | LIC_CORES                                  |
| state_based_dns_registration | True                                       |
| ip6_autocfg_enabled          | True                                       |
| tenant_ref                   | admin                                      |
| license_tier                 | ENTERPRISE_18                              |
| autoscale_polling_interval   | 60 seconds                                 |
+------------------------------+--------------------------------------------+

OpenStack Keystone/Nova/Neutron 资源的要求

以下是 OpenStack 资源的要求:

  1. NSX Advanced Load Balancer Controller 必须位于 avilbaas 租户中,才能使集群 VIP 正常工作。如果没有管理员特权,控制器将无法查看控制器的其他租户,并认为控制器和 SE 位于同一租户(avilbaas 租户)中。

  2. 类型 - 控制器将能够仅使用公用类型或 avilbaas 租户可以访问的类型。与 avilbaas 租户共享类型,以便将类型用于 SE。在共享类型后,在 SE 组中设置 instance_flavor 选项。

  3. 在所有租户中添加 aviadmin 角色 - 您需要具有 admin 角色以使集成正常工作。

    1. 如果没有 admin 角色,NSX Advanced Load Balancer admin 用户将无法在租户网络中创建端口。无法通过 Neutron 策略更改该行为。要解决该问题,CC 代理将使用租户范围的客户端以创建虚拟服务 VIP 端口。

    2. 如果没有 admin 角色或不是网络所有者,NSX Advanced Load Balancer admin 用户将无法为租户网络中创建的端口添加 allowed-address-pair 条目。这会导致虚拟服务放置失败。可以进行策略更改以解决该问题。要解决该问题,您可以为租户中的 NSX Advanced Load Balancer admin 用户添加 aviadmin 角色,并按照上面“Neutron 策略更改”一节中所述进行策略更改。

  4. 租户网络

    1. 在提供程序模式下进行部署时,必须与 NSX Advanced Load Balancer admin 租户(例如,avilbaas 租户)共享租户网络。否则,控制器无法将 SE 连接到网络。例如,

      neutron rbac-create --target-tenant [avilbaas-tenant-uuid] --action access_as_shared --type network [network-uuid]
    2. 在非提供程序模式(专用 SE 模式、租户上下文中的 SE)下进行部署时,必须在要部署 NSX Advanced Load Balancer 的所有租户中共享管理网络。无需与 avilbaas 租户共享用于创建虚拟服务 VIP 或后端池成员的租户网络。

  5. FIP 分配 - 必须在租户中创建将租户网络连接到提供程序网络的路由器。如果路由器是在 admin 租户(或任何其他租户)中创建的,控制器将无法访问这些路由器,也无法确定要用于 FIP 分配的提供程序网络。

注:

如果要使用浮动 IP 功能,则不能将路由器放在不同的租户中,即使您在虚拟服务 VIP 请求中手动传递了浮动网络/子网 UUID。这种方法无效,因为访问仅限于在其中创建虚拟服务的租户,如果控制器看不到连接到路由器的 VIP 网络,则也看不到 FIP 网络。FIP 网络是从租户路由器到提供程序网络的接口派生的,并要求将路由器作为托管 VIP 网络的租户。

升级功能

现有部署使用具有 admin 角色的 admin 凭据。您可以重新配置云以使用具有 aviadmin 角色的新凭据。

用例 1:

将 OpenStack admin 租户作为 NSX Advanced Load Balancer admin 租户。您需要为 admin 租户中的 admin 用户添加 aviadmin 角色,并与 admin 租户共享所有租户网络。升级以使用该功能不会造成中断。

用例 2:

将 OpenStack 非 admin 租户作为 NSX Advanced Load Balancer admin 租户。在这种情况下,aviadmin 角色将添加到该租户中的 admin 用户。该租户在 NSX Advanced Load Balancer 云配置中配置为 NSX Advanced Load Balancer admin 租户。需要与该租户共享所有租户网络。升级以使用该功能不会造成中断。

用例 3:

在云中更改 NSX Advanced Load Balancer admin 租户。在某些情况下,这会造成中断,因为将使用 admin 租户来启动 SE。配置不同的 admin 租户意味着,使用其他租户来托管所有 SE。这会造成中断,并需要在维护时段停用或启用所有虚拟服务。