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在本文档中已经使用很多次了,这里没有更多可以说的了。

  • https://github.com/vcheny/contrail-introspect-cli

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

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

  • https://github.com/Juniper/contrail-vrouter/tree/master/utils

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

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

contrail-api-cli

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

  • https://github.com/eonpatapon/contrail-api-cli

它也可以像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。

  • 用户名/密码可以通过webui config参数更改:
  • https://github.com/Juniper/contrail-container-builder/blob/master/containers/controller/webui/base/entrypoint.sh#L248

左上角有四个图标,分别表示“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。这个过程描述如下。

  • https://www.juniper.net/documentation/en_US/contrail5.1/topics/concept/backup-using-json-50.html

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

  • https://github.com/konono/contrail_backup

更改容器参数

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

容器参数列表

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

  • https://github.com/Juniper/contrail-container-builder/tree/master/containers

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

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

  • https://github.com/Juniper/contrail-container-builder/blob/master/containers/vrouter/agent/entrypoint.sh
[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时,不可避免地要在应用程序级别维护数据库的一致性。

  • https://github.com/Juniper/contrail-controller/wiki/Database-management-tool-to-check-and-fix-inconsistencies

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

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

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

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

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

  • https://github.com/Juniper/contrail-controller/blob/master/src/config/api-server/vnc_cfg_api_server/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入门宝典系列文章——

1.首次启动和运行指南

  1. TF组件的七种“武器”
  2. 编排器集成
  3. 关于安装的那些事(上)
  4. 关于安装的那些事(下)
  5. 主流监控系统工具的集成

Tungsten Fabric 架构解析系列文章——

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


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