Tungsten Fabric入门宝典丨开始第二天的工作



  • Tungsten Fabric入门宝典系列文章,来自技术大牛倾囊相授的实践经验,由TF中文社区为您编译呈现,旨在帮助新手深入理解TF的运行、安装、集成、调试等全流程。如果您有相关经验或疑问,欢迎与我们互动,并与社区极客们进一步交流。更多TF技术文章,请点击【TF中文社区】微信公众号底部按钮>学习>文章合集。
    
    作者:Tatsuya Naganawa  译者:TF编译组
    

    首次启动和运行,以及运营安装之后。用户需要查看运行状态(例如路由表和vif状态),并在Tungsten Fabric DB中配置各种对象,例如virtual-network, logical-router, bgp-router等。

    尽管Tungsten Fabric与OpenStack Neutron和Kubernetes YAML集成在一起以配置一些参数,但是在许多情况下,这些DB需要由Tungsten Fabric API或Tungsten Fabric webui直接编辑。

    下面我来介绍能实现此目标的几种选择。

    ist.py

    由于ist.py在本文档中已经使用很多次了,这里没有更多可以说的了。

    它可以基于各种Tungsten Fabric组件的introspect API,使用路由的操作命令来转储类似信息,包括路由表、bgp状态、组件状态等。

    有一点需要补充的是,在vRouter上,还有其他几个命令会显示类似的信息,比如vif、flow、vxlan、nh、rt、......

    由于ist.py将从vrouter-agent中选择信息,而那些工具从netlink中选择信息,因此(大多数)信息始终会同步。

    • 不过,当vRouter吞吐量是关键时,实时信息如vif --list --rate, flow -s将是一个很好的补充。

    contrail-api-cli

    当需要从CLI更新Tungsten Fabric的配置时,也许使用这个工具将是最好的方法之一。

    它也可以像Unix shell一样,以直观的方式转储和遍历Tungsten Fabric DB的内容,并在需要时执行ls、cat、edit,并检查ref和back_refs。

    下面介绍一些我认为有用的命令。

    安装步骤

    请键入以下命令,以在Centos7上安装此工具。

    yum -y install gcc python-devel
    pip install contrail-api-cli
    

    如果显示某些依赖性错误,virtualenv可能会有所帮助。

    yum -y install gcc python-devel
    pip install virtualenv
    virtualenv venv
    source venv/bin/activate
      pip install contrail-api-cli
    

    完成安装后,请尝试以下命令来测试Tungsten Fabric访问(在此示例中使用了Kubernetes安装)。

    contrail-api-cli --host xx.xx.xx.xx ls  ## xx.xx.xx.xx indicates config-api's ip
    

    Is

    如果安装了此工具,我首先建议键入这个命令。

    contrail-api-cli --host xx.xx.xx.xx ls -l \*
    

    然后,它会将所有的uuid以原来的名字转储到Tungsten Fabric DB中!

    结合这一点和cat命令,只需几行就可以写出一个转储DB内所有配置的命令,这对于调查配置的内容非常有用。

    for i in $(contrail-api-cli --host xx.xx.xx.xx ls \*)
    do
     echo $i
     contrail-api-cli --host xx.xx.xx.xx cat $i
    done
    

    cat

    此命令类似于Unix cat,它将json文件转储到Tungsten Fabric DB中。要查看每个元素中配置的内容,可以使用此命令。

    contrail-api-cli --host xx.xx.xx.xx ls -l virtual-network
    contrail-api-cli --host xx.xx.xx.xx cat virtual-network/xxxx-xxxx-xxxx-xxxx
    

    tree

    该命令有两个选项,我认为这两个选项都很有用。

    这条命令基本上可以把一个元素所拥有的 refs 和 back_refs 转储出来。

    举个例子,如果要查看一个virtual-network中的所有端口,就需要用到此命令。

    (forward_refs)
    contrail-api-cli --host xx.xx.xx.xx tree virtual-network/xxxx-xxxx-xxxx-xxxx
    (back_refs)
    contrail-api-cli -r --host xx.xx.xx.xx tree virtual-network/xxxx-xxxx-xxxx-xxxx
    

    另外一个选项是-P,它转储一个元素的父级。此选项在某些情况下也很有用。

    contrail-api-cli -P --host xx.xx.xx.xx tree virtual-network/xxxx-xxxx-xxxx-xxxx
    

    edit

    该命令的基本思想是,首先GET具有特定uuid的json文件,并将其保存在临时文件中,然后编辑(edit)该文件,再使用相同的uuid来PUT该文件以更新内容。

    • 举例来说,与visudo的行为比较类似

    此外,由于支持EDITOR环境变量,该命令可能会更强大。

    默认情况下,EDITOR被定义为“vim”,但由于它可以是任何命令或脚本(例如python文件),因此可以说,它为Tungsten Fabric的自动化打下了良好的基础(基于REST API)。

    • 不幸的是,由于目前尚无任何主要的自动化工具(如ansible、manageiq、terraform)直接支持Tungsten Fabric API,因此这可能是配置Tungsten Fabric特定选项(如virtual-networks的route-target,或端口的packet-mode)的唯一方法。

    • 如果安装了neutron-plugin,你还可以通过Neutron API使用ansible、manageiq、terraform等工具

    此命令的基本用法将像这样,以更新uuid指定的某些元素。

    contrail-api-cli edit --host xx.xx.xx.xx cat virtual-network/xxxx-xxxx-xxxx-xxxx
    EDITOR=/bin/vi contrail-api-cli edit --host xx.xx.xx.xx cat virtual-network/xxxx-xxxx-xxxx-xxxx
    

    如果自动化是一个预期的用例,可以使用与此类似的命令。

    EDITOR=(path-of-a-script) contrail-api-cli edit --host xx.xx.xx.xx cat virtual-network/xxxx-xxxx-xxxx-xxxx
    
    
    (venv) [root@ip-172-31-11-240 ~]# EDITOR=/tmp/configure-vn.py contrail-api-cli --host 172.31.11.240 edit virtual-network/035a1e3d-966b-45fd-941c-b845fd48d0c5
     -> json in Tungsten Fabric DB is updated
    
    (venv) [root@ip-172-31-11-240 ~]# cat /tmp/configure-vn.py 
    #!/usr/bin/python
    import sys
    import json
    filename=sys.argv[1]
    
    with open (filename) as f:
     js=json.load(f)
    
    ##print (js)
    js["flood_unknown_unicast"]=True ### edit json data here
    
    with open (filename, 'w') as f:
     json.dump(js, f)
    (venv) [root@ip-172-31-11-240 ~]#
    

    因此,通过这个命令,你可以在没有深入了解 Tungsten Fabric API 的情况下,对 Tungsten Fabric json 进行编程编辑。由于许多对象都是由Neutron API等创建的,因此可能首先要使用它们,然后借助此工具,使用Tungsten Fabric特定参数(比如route-target)对其进行更新。

    webui

    尽管目前有几种出色的CLI工具可以用,但从历史上看,大多数操作都是通过Tungsten Fabric webui完成的。

    你可以在https://(controller-ip):8143找到它,默认的用户名/密码为admin/ contrail123。

    左上角有四个图标,分别表示“Monitor”、“Configure”、“Inspect”、“Query”。
    每个模块都具有这些功能。

    1. Monitor:在某些情况下,此模块主要基于introspect、analytics UVE和配置DB的信息,来显示每个组件的状态。(如果未安装analyticsdb,则某些功能可能无法正常运行)

    2. Configure:大多数的配置任务将在此模块中完成。

    3. Inspect:该模块具有三个选项卡:list-of-uuid、introspect、config editor。Introspect显示与ist.py相同的信息。List-of-uuid和config editor显示与contil-api-cli ls和contrail-api-cli cat / edit类似的信息。

    4. Query:该模块将查询analyticsdb的内容。它显示了与contrail-logs、contrail-flows、contrail-sessions等命令相同的信息。
      https://github.com/Juniper/contrail-controller/wiki/Contrail-utility-scripts-for-getting-logs,-stats-and-flows-from-analytics)如果未安装analyticsdb,该模块将显示为灰色。

    虽然这个webui对于掌握Tungsten Fabric的现状是非常有用的,但是如果节点数量很多(如超过2000个),它的响应可能会有点慢。在这种情况下,基于CLI的方法会更有意义。

    backup和restore

    对于SDN配置这样的重要数据来说,backup / restore是非常重要的功能。

    Tungsten Fabric支持通过db_json_exim.py脚本进行backup和restore。这个过程描述如下。

    注意:这个repo也可能有用(restore已通过测试)

    更改容器参数

    在R5.0以后,Tungsten Fabric组件通过docker容器分发。由于这些容器有各种环境变量来改变行为,所以有时需要在安装后更新容器的环境变量。下面我来介绍一下如何更改它们。

    容器参数列表

    容器参数通常用于在/entrypoint.sh中创建conf文件,该文件会更改每个微服务的行为。要查看容器环境和相关参数,最直接的方法就是查看这个repo。

    此repo包含各种容器的Dockerfile和entrypoint.sh,因此,通过该操作,你可以检查如何修改所需的参数。

    例如,如果你要更改vrouter-agent的网关参数,可以检查此文件,然后直接使用VROUTER_GATEWAY替换该参数。

    [VIRTUAL-HOST-INTERFACE]
    name=vhost0
    ip=$vrouter_cidr
    physical_interface=$phys_int
    gateway=$VROUTER_GATEWAY   ### this is the container environment variable which needs to be changed
    compute_node_address=$vrouter_ip
    

    因此,如果你知道所需的微服务参数,可以检查相应的容器环境变量。

    请注意,在某些情况下,没有容器环境变量可以直接修改微服务参数。

    在这种情况下,可以使用add_ini_params_from_env函数,该函数位于每个entrypoint.sh的最后一部分。

    add_ini_params_from_env VROUTER_AGENT /etc/contrail/contrail-vrouter-agent.conf
    

    此时,如果你给出这个环境变量,

    VROUTER_AGENT__FLOWS__thread_count=8
    

    它可以转换为[FLOWS], thread_count=8,于是,即使没有提供方便的参数来修改它,你仍然可以使用该方法直接修改微服务的conf文件。

    ansible-deployer

    如果使用ansible-deployer,它将使用docker-compose创建docker容器,并且在/etc/contrail/common_xxx.env中定义环境变量(xxx是角色名)。

    因此,如果要更新诸如vrouter参数之类的信息,你可以编辑(edit)/etc/contrail/common_vrouter.env,然后键入以下命令。

    docker-compose -f /etc/contrail/vrouter/docker-compose.yaml down
    docker-compose -f /etc/contrail/vrouter/docker-compose.yaml up -d
    

    然后,vrouter容器会被重新创建,并应用新的参数。

    Kubeadm

    如果使用kubeadm和kubernetes yaml安装Tungsten Fabric容器,则每个容器都将使用名为“env”的配置映射(configmap)作为环境变量的来源。因此,你可以键入此命令来编辑(edit)环境变量,并可以删除一些Tungsten Fabric的pod以重新创建容器。(由于容器被定义为DaemonMap,它将自动重新创建)。

    kubectl edit configmap -n kube-system env
    

    保持数据一致性

    由于cassandra不支持事务(transaction),并且zookeeper和casssandra都具有一些数据,因此当使用config-api时,不可避免地要在应用程序级别维护数据库的一致性。

    接下来我会总结一些故障情况和管理脚本以解决此问题。

    在某些情况下,你需要进行数据维护。

    1. 创建两个具有ref和back_refs的对象,但是在添加back_refs之前config-api就崩溃了。

    2. Zookeeper维护一些对象的uuid和indexallocator列表,例如每个子网中的IP分配。因此,在更新zookeeper之后以及在更新cassandra之前config-api崩溃时,它将导致两个数据库之间的差异。

    Config-api有一个数据维护脚本db_manage.py来解决这种情况。

    主要的命令有三个,我们将会周期性地键入它们。

    docker exec -it config_api_1 /bin/bash
     cd /usr/lib/python2.7/site-packages/vnc_cfg_api_server
     python db_manage.py check
     python db_manage.py --execute clean
     python db_manage.py --execute heal
    

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

    首次启动和运行指南
    TF组件的七种“武器”
    编排器集成
    关于安装的那些事(上)
    关于安装的那些事(下)
    主流监控系统工具的集成

    Tungsten Fabric 架构解析系列文章——
    第一篇:TF主要特点和用例
    第二篇:TF怎么运作
    第三篇:详解vRouter体系结构
    第四篇:TF的服务链
    第五篇:vRouter的部署选项
    第六篇:TF如何收集、分析、部署?
    第七篇:TF如何编排
    第八篇:TF支持API一览
    第九篇:TF如何连接到物理网络?
    第十篇:TF基于应用程序的安全策略


Log in to reply