neutron/agent/metadata/driver.py
monitors = {}
def __init__(self, l3_agent):
self.metadata_port = l3_agent.conf.metadata_port
self.metadata_access_mark = l3_agent.conf.metadata_access_mark
registry.subscribe(
after_router_added, resources.ROUTER, events.AFTER_CREATE)
registry.subscribe(
after_router_updated, resources.ROUTER, events.AFTER_UPDATE)
registry.subscribe(
before_router_removed, resources.ROUTER, events.BEFORE_DELETE)
metadata_port
默认为 9697metadata_access_mark
默认为 0x1(Iptables mangle mark used to mark metadata valid requests.)- 在系统回调中的感兴趣资源及其事件
- resource :
ROUTER
; event :AFTER_CREATE
; callback :after_router_added
- resource :
ROUTER
; event :AFTER_UPDATE
; callback :after_router_updated
- resource :
ROUTER
; event :BEFORE_DELETE
; callback :before_router_removed
设定 metadata 的包过滤的 iptables 中 filter 表的规则
iptables -t filter -A INPUT -m mark --mark 0x1/0xffff -j ACCEPT
iptables -t filter -A INPUT -p tcp -m tcp --dport 9697 -j DROP
设定 metadata 的包过滤的 iptables 中 mangle 表的规则
iptables -t mangle -A PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x1/0xffff
设定 metadata 的包过滤的 iptables 中 nat 表的规则
iptables -t nat -A PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
获取 metadata proxy 的 user、group 和 watchlog
该方法用于在生成要执行的外部进程的命令。
- network_id 或 router_id 必须有一个
- 定义一个内部方法
callback
用来生成具体的命令
neutron-ns-metadata-proxy --pid_file=/opt/stack/data/neutron/external/pids/61eaacf9-d4e0-4202-bac9-321da0ceaa69.pid --metadata_proxy_socket=/opt/stack/data/neutron/metadata_proxy --router_id=61eaacf9-d4e0-4202-bac9-321da0ceaa69 --state_path=/opt/stack/data/neutron --metadata_port=9697 --metadata_proxy_user=1000 --metadata_proxy_group=1000 --debug
创建一个 ProcessManager
实例,用来监测 metadata proxy 进程
def spawn_monitored_metadata_proxy(cls, monitor, ns_name, port, conf, network_id=None, router_id=None)
启动 metatdata proxy 进程并监测其状态
- 调用
_get_metadata_proxy_callback
获取构造执行命令的方法 - 调用
_get_metadata_proxy_process_manager
获取监测执行命令的ProcessManager
实例 - 调用
ProcessManager.enable
启动该外部进程 - 调用
ProcessMonitor.register
注册ProcessManager
的实例,用来监测该进程的状态 - 记录该 router 上的
ProcessMonitor
实例
- 调用
ProcessMonitor.unregister
取消对 metadata proxy 进程的检测 - 调用
_get_metadata_proxy_process_manager
获取 metatdata proxy 的包装,ProcessManager
实例 - 调用
ProcessManager.disable
停止该外部进程 - 取消对该进程的记录
当在该 l3 agent 上创建了新的 router 后,会做如下操作:
- 调用
MetadataDriver.metadata_filter_rules
获取 filter 表的 Metatdata 数据包的规则 - 调用
MetadataDriver.metadata_mangle_rules
获取 mangle 表的 Metatdata 数据包的规则 - 调用
MetadataDriver.metadata_nat_rules
获取 nat 表的 Metatdata 数据包的规则 - 调用
iptables_manager
完成上述规则的添加 - 若该 router 不是个 ha router,则调用
MetadataDriver.spawn_monitored_metadata_proxy
为该 router 启动提供 metadata 服务的进程
根据 MetadataDriver.monitors
查看是否已经为该 router 创建了 metadata 服务,若没有,则调用 after_router_added
创建
调用 MetadataDriver.destroy_monitored_metadata_proxy
销毁该 router 上的 metadata 服务