查询 host monitor 时发生内部错误_Tungsten Fabric知识库丨更多组件内部探秘

点击蓝字关注

找到右上角点击 ...  设为 9f134a8bcbb1294067ff8d6841db39c1.png星标置顶9f134a8bcbb1294067ff8d6841db39c1.png

在上一篇文章中,我们和您一起了解了vRouter的内部结构和进程,今天继续Tungsten Fabric其它组件的内部探秘旅程。 作者:Tatsuya Naganawa   译者:TF编译组   control内部 -  

ifmap-server弃用

在R4.0之后,不建议使用ifmap-server,当前控制节点直接从cassandra接收配置信息。
  •  https://github.com/tungstenfabric/tf-specs/blob/master/deprecating-discovery-4.0.md

话虽如此,但是在内部,它仍然使用ifmap结构来存储vrf、interface、logical-router等的拓扑数据。 为了直接从cassandra中拾取数据,对ifmap客户端进行了一些更改,这些更改由control使用。
  • https://bugs.launchpad.net/juniperopenstack/+bug/1632470

最初,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查询。
  • https://github.com/tungstenfabric/tf-container-builder/blob/master/containers/controller/control/named/entrypoint.sh#L10

  - 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。
  • https://github.com/Juniper/contrail-controller/blob/master/src/config/api-server/vnc_cfg_api_server/vnc_db.py#L1595-L1606

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 msgbusself._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(此创建可以删除,更新,读取等)完成,并且按资源定义。
  • https://github.com/Juniper/contrail-controller/tree/master/src/config/api-server/vnc_cfg_api_server/resources

dependency_tracker

schema-transformer、svc-monitor和device-manager使用dependency tracker来处理config-api中的amqp消息,并递归地评估更新对象所引用的对象。
  • https://github.com/Juniper/contrail-controller/blob/master/src/config/common/cfgm_common/dependency_tracker.py

在内部,如果reaction_map包含amqp消息中的对象的键(key),它将开始评估该对象。这里reaction_map其实是一个已更新对象名称的python dict,而其它对象名称需要评估。 举例来说,如果virtual-machine-interface已更新,
  • https://github.com/Juniper/contrail-controller/blob/master/src/config/schema-transformer/schema_transformer/to_bgp.py#L92-L94

        'virtual_machine_interface': {'self': ['virtual_machine', 'port_tuple', 'virtual_network','bgp_as_a_service'],
如果它具有最初更新的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映射器。

    def _cassandra_init_conn_pools(self):
(snip)for cf_name in cf_dict:
                cf_kwargs = cf_dict[cf_name].get('cf_args', {})self._cf_dict[cf_name] = ColumnFamily(
                    pool,
                    cf_name,
                    read_consistency_level=ConsistencyLevel.QUORUM,
                    write_consistency_level=ConsistencyLevel.QUORUM,
                    dict_class=dict,
                    **cf_kwargs)

要读取此信息,通过backup / restore程序创建的json文件是很方便的。
  • https://github.com/tnaganawa/tungstenfabric-docs/blob/master/TungstenFabricPrimer.md#backup-and-restore

尽管该结果与config-api的HTTP GET输出大部分相似。

Tungsten Fabric配置数据库中 Zookeeper的使用

使用Cassandra计算下一个整数并不容易,为此Tungsten Fabric使用了Zookeeper。 https://stackoverflow.com/questions/53702288/is-increment-integer-in-cassandra-possible-in-some-cases 数据在各种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/0008000000default-domain:default-project:default-virtual-network:default-virtual-network
[zk: 172.31.12.209(CONNECTED) 12] 

备份脚本也可以用于转储所有Zookeeper数据。 https://github.com/tnaganawa/tungstenfabric-docs/blob/master/TungstenFabricPrimer.md#backup-and-restore   -  analytics内部  - 

Redis、cassandra和kafka

Analytics有多个后端数据库,最主要的是notabliy、redis和cassandra,如果安装了alarmgen,那么还包括kafka。 这些数据库由collector分别更新,当vRouter之类的sandesh更新时,control就已经到达了该进程。 收到之后,到达ruleeng.cc,
  • https://github.com/tungstenfabric/tf-analytics/blob/master/contrail-collector/ruleeng.cc#L900

并根据收到的sandesh数据类型执行一些任务。
  • 如果收到的是UVE,则填充redis和kafka,如果安装了Cassandra,还将填充此数据库的统计表。

    // First publish to redis and kafkaif (uveproc) handle_uve_publish(parent, vmsgp, db, header, db_cb);// Check if the message needs to be droppedif (db && db->DropMessage(header, vmsgp)) {return true;
    }if (db) {// 1. make entry in OBJECT_VALUE_TABLE if needed// 2. get object-type:name{1-6}
        handle_object_log(parent, vmsgp, db, header, &object_names, db_cb);// Insert into the message table
        db->MessageTableInsert(vmsgp, object_names, db_cb);if (uveproc) handle_uve_statistics(parent, vmsgp, db, header, db_cb);
        handle_session_object(parent, db, header, db_cb);
    }

因此,redis和kafka将仅处理UVE,当Cassandra未安装时,除UVE之外的所有数据都不会导入到analytics数据库中。

uveupdate.lua

在UVE到达collector时,collector目录中的一些lua文件将用于更新Redis。
  • https://github.com/tungstenfabric/tf-analytics/blob/master/contrail-collector/uveupdate.lua

在内部,它在编译时通过xxd命令转换为cpp文件。
  • https://github.com/tungstenfabric/tf-analytics/blob/master/contrail-collector/SConscript#L155-L160

    def RedisLuaBuild(env, scr_name):
  env.Command('%s_lua.cpp' % scr_name ,'%s.lua' % scr_name,\'(cd %s ; xxd -i %s.lua > ../../../%s/%s_lua.cpp)' %
              (Dir('#src/contrail-analytics/contrail-collector').path,
               scr_name, Dir('.').path, scr_name))
  env.Depends('redis_processor_vizd.cc','%s_lua.cpp' % scr_name)

  -  补充一些配置knob  - 

转发模式(forwarding mode)

vRouter具有几种转发模式。
  • https://bugs.launchpad.net/juniperopenstack/+bug/1471637

默认情况下,它将使用L2/L3模式。L3模式和L2模式也有一些用例。

未知单播泛洪(flood unknown unicast)

当使用L2 BMS连接时使用此knob。
  • https://bugs.launchpad.net/juniperopenstack/+bug/1424523

默认情况下,由于控制器知道虚拟机的所有mac地址,因此vRouter将丢弃未知的单播,尽管使用L2 BMS时并非如此。 因此,在这种情况下需要启用此knob。

允许传递(allow tranisit)

此knob与服务链功能一起使用。
  • https://bugs.launchpad.net/opencontrail/+bug/1365277

当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://bugs.launchpad.net/juniperopenstack/+bug/1505023

原文链接:

https://github.com/tnaganawa/tungstenfabric-docs/blob/master/TungstenFabricKnowledgeBase.md


往期精选

TF知识库

  • vRouter内部运行探秘

推荐阅读

Tungsten Fabric入门宝典系列文章——

  1.  首次启动和运行指南

  2. TF组件的七种“武器”

  3. 编排器集成

  4. 关于安装的那些事(上)

  5. 关于安装的那些事(下)

  6. 主流监控系统工具的集成

  7. 开始第二天的工作

  8. 8个典型故障及排查Tips

  9. 关于集群更新的那些事  

  10. 说说L3VPN及EVPN集成

  11. 关于服务链、BGPaaS及其它

  12. 关于多集群和多数据中心

  13. 多编排器用法及配置

6faa78dd5d8c61a67fdaec54c1f37548.png

TF中文社区

多云互联 · 开源开放

70c8c0b68b87f6dbeb632e74c838e731.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值