openstack-notes

Extension以及Port binding简述

Extension 是 Neutron 项目中对基本资源实现属性扩展的手段,而 Portbinding 则是 Neutron 在早期即引入的一个扩展模块,可以实现对 Port 资源的属性扩展。该扩展模块在 neutron 及 Agent 将 port 和实际网卡资源绑定时发挥重要作用,使得管理员可以人工指定或者获取 port 的物理绑定信息,其属性的正确与否会影响到 server(虚拟机、baremeta)的能否成功启动。

Port binding 的属性

Port binding 扩展定义的属性主要包括 vnic_type、vif_type、vif_details、host_id、profile ,这些属性都可以在创建 port 的 REST API接口中可以直接指定。

一个创建 port 的 REST API body 实例如下:

POST /v2.0/ports

{
    "port": {
        "binding:host_id": "4df8d9ff-6f6f-438f-90a1-ef660d4586ad",
        "binding:profile": {
            "local_link_information": [
                {
                    "port_id": "Ethernet3/1",
                    "switch_id": "0a:1b:2c:3d:4e:5f",
                    "switch_info": "switch1"
                }
            ]
        },
        "binding:vnic_type": "baremetal",
        "device_id": "d90a13da-be41-461f-9f99-1dbcf438fdf2",
        "device_owner": "baremetal:none",
        "dns_domain": "my-domain.org.",
        "dns_name": "myport",
        "qos_policy_id": "29d5e02e-d5ab-4929-bee4-4a9fc12e22ae"
    }
}

关于每个属性的具体含义、类型与取值范围如下表:

Port binding 的属性在Neutron的mechanism driver中作用

Neutron.plugin.ml2.plugin.Ml2plugin类方法 _bind_port()中调用注册到mechanism manager的driver尝试对端口进行绑定。

    def _bind_port(self, orig_context):
        # 构建一个新的port上下文结构
        port = orig_context.current
        orig_binding = orig_context._binding
        new_binding = models.PortBinding(
            host=orig_binding.host,
            vnic_type=orig_binding.vnic_type,
            profile=orig_binding.profile,
            vif_type=portbindings.VIF_TYPE_UNBOUND,
            vif_details=''
        )
        self._update_port_dict_binding(port, new_binding)
        new_context = driver_context.PortContext(
            self, orig_context._plugin_context, port,
            orig_context.network.current, new_binding, None,
            original_port=orig_context.original)

        # 以下开始使用注册的mechanism driver进行端口绑定
        self.mechanism_manager.bind_port(new_context)
        return new_context

在每个 mechanism driver 的 __init__() 方法中会指明该 driver 是否支持端口包过滤特性,接下来会指定该 driver 支持的 vNIC 类型,ML2 的 mechanism driver 只会调用支持该端口指定vNIC 类型的driver来尝试执行绑定操作。

参考https://blog.csdn.net/bestjie01/article/details/83628340