Tungsten Fabric知识库丨更多组件内部探秘
在上一篇文章中,我们和您一起了解了vRouter的内部结构和进程,今天继续Tungsten Fabric其它组件的内部探秘旅程。
作者:Tatsuya Naganawa 译者:TF编译组
- control内部 -
IFMAP-SERVER弃用
在R4.0之后,不建议使用ifmap-server,当前控制节点直接从cassandra接收配置信息。
话虽如此,但是在内部,它仍然使用ifmap结构来存储vrf、interface、logical-router等的拓扑数据。
为了直接从cassandra中拾取数据,对ifmap客户端进行了一些更改,这些更改由control使用。
最初,ifmap客户端包含很多逻辑来从ifmap-server提取数据,但是目前它仅包含一种逻辑,从cassandra获取json文件,并用该数据填充ifmap结构。
- https://github.com/Juniper/contrail-controller/tree/R2002/src/ifmap/client
- https://github.com/Juniper/contrail-controller/tree/R3.2/src/ifmap/client
因此,它现在将ifmap用作内部使用的结构,而不是用作一个wire协议。
NAMED和DNS的区别
contrail-dns和contrail-named是不同的进程,实际上有着不同的用途。 contrail-dns具有与contrail-control类似的功能,它通过XMPP提供vDNS信息,vRouter将基于该输入执行一些DNS任务。
- https://github.com/Juniper/contrail-controller/tree/master/src/dns
- https://github.com/Juniper/contrail-controller/wiki/DNS-and-IPAM
contrail-named实际上并不使用XMPP,而是使用ISC绑定来提供DNS数据,用于对vDNS条目进行外部DNS查询。
- config内部 -
CRUD操作REST API和MSGBUS更新
Config-api将提供REST API,以实现每个配置对象的CRUD操作,例如virtual-network、network-policy等。
为此,它基于架构(schema)文件动态创建URL。
- _generate_resource_crud_methods和_generate_resource_crud_uri创建通用方法和URL
这种方法的默认行为是执行Cassandra更新,并且Rabbitmq交换也填充了一些信息,以供其它进程使用,例如schema-transformer、svc-monitor、device-manager。
def dbe_create(self, obj_type, obj_uuid, obj_dict):
(ok, result) = self._object_db.object_create(obj_type, obj_uuid,
obj_dict)
if ok:
# publish to msgbus
self._msgbus.dbe_publish('CREATE', obj_type, obj_uuid,
obj_dict['fq_name'], obj_dict=obj_dict)
self._dbe_publish_update_implicit(obj_type, result)
return (ok, result)
# end dbe_create
其它任务(例如检查输入数据或使用默认值填充)将由pre_dbe_create或post_dbe_create(此创建可以删除,更新,读取等)完成,并且按资源定义。
DEPENDENCY_TRACKER
schema-transformer、svc-monitor和device-manager使用dependency tracker来处理config-api中的amqp消息,并递归地评估更新对象所引用的对象。
在内部,如果reaction_map包含amqp消息中的对象的键(key),它将开始评估该对象。这里reaction_map其实是一个已更新对象名称的python dict,而其它对象名称需要评估。
举例来说,如果virtual-machine-interface已更新,
如果它具有最初更新的virtual-machine-interface引用,还将评估virtual-machine、port-tuple、virtual-network和bgp-as-a-service。
- config database内部 -
读取CONFIG_DB_UUID键空间内容
当cqlsh看到Cassandra的内容时(例如cql> select * from config_db_uuid.obj_fq_name_table;),它将返回一些人类无法理解的输出。
关键是config-api内部使用pycassa的ColumnFamily(https://github.com/pycassa/pycassa#basic-usage),类似于Cassandra的ORM映射器。
要读取此信息,通过backup / restore程序创建的json文件是很方便的。
尽管该结果与config-api的HTTP GET输出大部分相似。
TUNGSTEN FABRIC配置数据库中 ZOOKEEPER的使用
使用Cassandra计算下一个整数并不容易,为此Tungsten Fabric使用了Zookeeper。
数据在各种Zookeeper的path中,可以使用以下命令查看。
docker exec -it config_database_zookeeper_1 bash
./bin/zkCli.sh -server config-database-ip
[zk: 172.31.12.209(CONNECTED) 0] ls /
[analytics-discovery-, api-server-election, device-manager, fq-name-to-uuid, id, schema-transformer, svc-monitor, zookeeper]
[zk: 172.31.12.209(CONNECTED) 1] ls /id
[bgp, security-groups, tags, virtual-networks]
[zk: 172.31.12.209(CONNECTED) 2] ls /id/bgp
[route-targets]
[zk: 172.31.12.209(CONNECTED) 3] ls /id/bgp/route-targets
[type0]
[zk: 172.31.12.209(CONNECTED) 4] ls /id/bgp/route-targets/type0
[0008000000, 0008000001, 0008000002, 0008000003, 0008000004, 0008000005, 0008000006]
[zk: 172.31.12.209(CONNECTED) 5]
[zk: 172.31.12.209(CONNECTED) 11] get /id/bgp/route-targets/type0/0008000000
default-domain:default-project:default-virtual-network:default-virtual-network
[zk: 172.31.12.209(CONNECTED) 12]
备份脚本也可以用于转储所有Zookeeper数据。
- analytics内部 -
REDIS、CASSANDRA和KAFKA
Analytics有多个后端数据库,最主要的是notabliy、redis和cassandra,如果安装了alarmgen,那么还包括kafka。
这些数据库由collector分别更新,当vRouter之类的sandesh更新时,control就已经到达了该进程。
收到之后,到达ruleeng.cc,
并根据收到的sandesh数据类型执行一些任务。
- 如果收到的是UVE,则填充redis和kafka,如果安装了Cassandra,还将填充此数据库的统计表。
因此,redis和kafka将仅处理UVE,当Cassandra未安装时,除UVE之外的所有数据都不会导入到analytics数据库中。
UVEUPDATE.LUA
在UVE到达collector时,collector目录中的一些lua文件将用于更新Redis。
在内部,它在编译时通过xxd命令转换为cpp文件。
- 补充一些配置knob -
转发模式(FORWARDING MODE)
vRouter具有几种转发模式。
默认情况下,它将使用L2/L3模式。L3模式和L2模式也有一些用例。
未知单播泛洪(FLOOD UNKNOWN UNICAST)
当使用L2 BMS连接时使用此knob。
默认情况下,由于控制器知道虚拟机的所有mac地址,因此vRouter将丢弃未知的单播,尽管使用L2 BMS时并非如此。
因此,在这种情况下需要启用此knob。
允许传递(ALLOW TRANISIT)
此knob与服务链功能一起使用。
当VM1 - VN1 - VNF1 - VN2 - VNF2 - VN3 - VM2已创建,并且VN1-VN2,VN2-VN3服务链已配置时,由于ServiceChain前缀不可传递,因此默认情况下VM1无法ping通VM2。
在VN2中启用此knob后,VN1中的前缀将导入到VN3,反之亦然,因此VM1可以ping通到VM3。
多重服务链(MULTIPLE SERVICE CHAIN)
我实际上从未尝试过此knob。
此URL中描述了详细信息:
原文链接: https://github.com/tnaganawa/tungstenfabric-docs/blob/master/TungstenFabricKnowledgeBase.md
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法