额外的云资源标签

# 1. 简介

DeepFlow 除了能够主动调用(拉取)云服务商、K8s apiserver 的 API 以同步资源信息以外,还提供了一个 domain-additional-resource 的声明式接口以允许外部服务推送额外的资源信息。这种方式适用于同步 DeepFlow 尚未支持的公有云资源、使用 DeepFlow 社区版同步私有云资源、以及同步 CMDB 中的业务标签等场景。

使用该 API 可推送的资源信息包括:

  • 可用区
  • VPC
  • 子网
  • 服务器
  • 云服务器
  • 自定义业务标签
  • 负载均衡器

使用该 API 可推送的自定义标签包括:

  • 关联如下 K8s 资源的自定义标签
    • 命名空间
  • 关联如下云资源的自定义标签
    • 云服务器

# 2. API 调用方法

# 2.1 接口

${deepflow_server_node_ip}:${port}/v1/domain-additional-resources/
1

# 2.2 请求方式

PUT

# 2.3 请求参数

名称 类型 是否必填 说明
Content-Type 字符串 application/json

# 2.3.2 body

名称 类型 是否必填 说明
azs AZ 结构体数组 Availability Zone(可用区)
vpcs VPC 结构体数组 Virtual Private Cloud
subnets Subnet 结构体数组 子网
hosts Host 结构体数组 服务器
chosts Chost 结构体数组 云服务器
cloud_tags CloudTag 结构体数组 一般用于注入业务标签,详见 CMDB 中的业务标签
lbs LB 结构体数组 Load Balancer

AZ 结构体

名称 类型 是否必填 说明
name 字符串
uuid 字符串
domain_uuid 字符串 云平台 UUID

VPC 结构体

名称 类型 是否必填 说明
name 字符串
uuid 字符串
domain_uuid 字符串 云平台 UUID

Subnet 结构体

名称 类型 是否必填 说明
name 字符串
uuid 字符串
type 整型 默认值: 4,可选:3 (WAN),4 (LAN)
is_vip 布尔 可选:true,false
vpc_uuid 字符串
az_uuid 字符串
domain_uuid 字符串 云平台 UUID
cidrs 字符串数组 例如:["x.x.x.x/x"]

Host 结构体

名称 类型 是否必填 说明
name 字符串
uuid 字符串
ip 字符串
type 整型 默认值: 3(KVM)。 可选:2 (ESXi), 3 (KVM), 5 (Hyper-V), 6 (Gateway)
az_uuid 字符串
domain_uuid 字符串 云平台 UUID
vinterfaces Vinterface 1 结构体数组 network interfaces

Vinterface 1 结构体

名称 类型 是否必填 说明
mac 字符串 例:xx:xx:xx:xx:xx:xx
subnet_uuid 字符串
ips 字符串数组 例:["x.x.x.x"]

Chost 结构体

名称 类型 是否必填 说明
name 字符串
uuid 字符串
host_ip 字符串 hypervisor IP address
type 整型 默认值: 1(vm/compute)。可选: 1 (vm/compute), 2 (bm/compute), 3 (vm/network), 4 (bm/network), 5 (vm/storage), 6 (bm/storage)
vpc_uuid 字符串
az_uuid 字符串
domain_uuid 字符串 云平台 UUID
vinterfaces Vinterface 2 结构体数组 chost interfaces

Vinterface 2 结构体

名称 类型 是否必填 说明
mac 字符串 例:xx:xx:xx:xx:xx:xx
subnet_uuid 字符串
ips 字符串数组 例:["x.x.x.x"]

CloudTag 结构体:详见 CMDB 中的业务标签

Tag 结构体

名称 类型 是否必填 说明
key 字符串 限制 255 字符,不支持空格、冒号、反引号、反斜杠、单引号
value 字符串 限制 255 字符,不支持空格、冒号、反引号、反斜杠

LB 结构体

名称 类型 是否必填 说明
name 字符串
model 整型 默认值: 2。 可选: 1 (internal), 2 (external)
vpc_uuid 字符串
domain_uuid 字符串
vinterfaces Vinterface 2 结构体数组 chost interfaces
lb_listeners LBListener 结构体数组

LBListener 结构体

名称 类型 是否必填 说明
name 字符串 若为空,则赋值 ${ip}-${port}
protocol 字符串 可选: TCP, UDP
ip 整型
port 字符串
lb_target_servers LBTargetServer 结构体数组

LBTargetServer 结构体

名称 类型 是否必填 说明
ip 字符串
port 整型

# 2.4 响应结果

# 2.4.1 返回参数

名称 类型 是否必填 说明
OPT_STATUS 字符串 成功与否
DESCRIPTION 字符串 错误信息
DATA JSON 返回数据

# 2.4.2 成功响应

当返回参数 OPT_STATUS 等于 SUCCESS 时,表明调用成功。返回值示例如下:

{
  "OPT_STATUS": "SUCCESS",
  "DESCRIPTION": "",
  "DATA": {}
}
1
2
3
4
5

# 2.4.3 失败响应

当返回参数 OPT_STATUS 不等于 SUCCESS 时,表明调用失败。返回值示例如下:

{
  "OPT_STATUS": "INVALID_POST_DATA",
  "DESCRIPTION": "cloud tag (resource name: deepflow) domain (uuid: 76b5d56a-a65d-58db-bd49-e04585529ce5) not found",
  "DATA": null
}
1
2
3
4
5

错误码为返回值中 OPT_STATUS 字段的信息

错误码 说明 建议解决办法
INVALID_POST_DATA 无效参数 根据错误提示检查对应字段的值是否正确
RESOURCE_NOT_FOUND 资源未发现 填写的资源值无效,请检查后填写正确

# 3. 调用示例

# 3.1 通过 HTTP API 调用

curl -XPUT -H "Content-Type:application/json" \
${deepflow_server_node_ip}:${port}/v1/domain-additional-resources/ \
-d@additional_resource.json
1
2
3

参数文件 additional_resource.json (参考 YAML 文件 (opens new window)

{
    "azs": [
        {
            "name": "xxxx",
            "uuid": "xxxx",
            "domain_uuid": "xxxx"
        }
    ],
    "vpcs": [
        {
            "name": "xxxx",
            "uuid": "xxxx",
            "domain_uuid": "xxxx"
        }
    ],
    "subnets": [
        {
            "name": "xxxx",
            "uuid": "xxxx",
            "type": 3,
            "is_vip": false,
            "vpc_uuid": "xxxx",
            "az_uuid": "xxxx",
            "domain_uuid": "xxxx",
            "cidrs": [
                "x.x.x.x/x"
            ]
        }
    ],
    "hosts": [
        {
            "name": "xxxx",
            "uuid": "xxxx",
            "ip": "x.x.x.x",
            "type": 3,
            "az_uuid": "xxxx",
            "domain_uuid": "xxxx",
            "vinterfaces": [
                {
                    "mac": "xx:xx:xx:xx:xx:xx",
                    "subnet_uuid": "xxxx",
                    "ips": [
                        "x.x.x.x"
                    ]
                }
            ]
        }
    ],
    "chosts": [
        {
            "name": "xxxx",
            "uuid": "xxxx",
            "host_ip": "x.x.x.x",
            "type": 1,
            "vpc_uuid": "xxxx",
            "az_uuid": "xxxx",
            "domain_uuid": "xxxx",
            "vinterfaces": [
                {
                    "mac": "xx:xx:xx:xx:xx:xx",
                    "subnet_uuid": "xxxx",
                    "ips": [
                        "x.x.x.x"
                    ]
                }
            ]
        }
    ],
    "cloud_tags": [
        {
            "resource_type": "xxxx",
            "resource_name": "xxxx",
            "domain_uuid": "xxxx",
            "tags": [
                {
                    "key": "xxxx",
                    "value": "xxxx"
                }
            ]
        }
    ],
    "lbs": [
        {
            "name": "xxx",
            "model": 2,
            "vpc_uuid": "xxxx",
            "domain_uuid": "xxxx",
            "region_uuid": "xxxx",
            "vinterfaces": [
                {
                    "mac": "xx:xx:xx:xx:xx:xx",
                    "subnet_uuid": "xxxx",
                    "ips": [
                        "x.x.x.x"
                    ]
                }
            ],
            "lb_listeners": [
                {
                    "name": "xxx",
                    "protocol": "TCP/UDP",
                    "ip": "x.x.x.x",
                    "port": 9000,
                    "lb_target_servers": [
                        {
                            "ip": "x.x.x.x",
                            "port": 9090
                        }
                    ]
                }
            ]
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114

# 3.2 通过 deepflow-ctl 命令调用

除了使用 HTTP API 调用以外,你也可以使用 deepflow-ctl 命令通过 yaml 文件的方式调用。

# 查看 yaml 参数示例
deepflow-ctl domain additional-resource example

# 建立 additional-resource.yaml 文件
deepflow-ctl domain additional-resource example > additional-resource.yaml

# 添加对应的参数后执行命令
deepflow-ctl domain additional-resource apply -f additional-resource.yaml
1
2
3
4
5
6
7
8

资源手动添加成功后,1 分钟后(取决于 server.yaml 配置文件的 resource_recorder_interval 字段)对应的数据库表就能查看到信息:

  • 可用区(表 az)
  • VPC(表 epc)
  • 子网(表 subnet)
  • 服务器(表 host_device)
  • 云服务器(表 vm)
  • 负载均衡器(表 lb、lb_listener 和 lb_target_server)
  • 命名空间(表 pod_namespace)