生产环境部署建议
# 1. 简介
DeepFlow 生产环境部署建议。
# 2. 使用 LTS 版本 DeepFlow
helm 增加 --version 6.4.9 参数安装升级 LTS 版本 DeepFlow Server 和 Agent
# 2.1 安装 LTS 版本 DeepFlow Server
# helm repo add deepflow https://deepflowio.github.io/deepflow
helm repo update deepflow # use `helm repo update` when helm < 3.7.0
helm upgrade --install deepflow -n deepflow deepflow/deepflow --version 6.4.9 --create-namespace
2
3
4
# helm repo add deepflow https://deepflow-ce.oss-cn-beijing.aliyuncs.com/chart/stable
helm repo update deepflow # use `helm repo update` when helm < 3.7.0
# cat << EOF > values-custom.yaml
# global:
# image:
# repository: registry.cn-beijing.aliyuncs.com/deepflow-ce
# grafana:
# image:
# repository: registry.cn-beijing.aliyuncs.com/deepflow-ce/grafana
# EOF
helm upgrade --install deepflow -n deepflow deepflow/deepflow --version 6.4.9 --create-namespace \
-f values-custom.yaml
2
3
4
5
6
7
8
9
10
11
12
13
# 2.2 安装 LTS 版本 DeepFlow Agent
# 2.2.1 K8s 环境
# cat << EOF > values-custom.yaml
# deepflowServerNodeIPS:
# - 10.1.2.3 # FIXME: K8s Node IPs
# - 10.4.5.6 # FIXME: K8s Node IPs
# clusterNAME: k8s-1 # FIXME: name of the cluster in deepflow
# EOF
# helm repo add deepflow https://deepflowio.github.io/deepflow
helm repo update deepflow # use `helm repo update` when helm < 3.7.0
helm upgrade --install deepflow-agent -n deepflow deepflow/deepflow-agent --version 6.4.9 --create-namespace \
-f values-custom.yaml
2
3
4
5
6
7
8
9
10
11
12
# cat << EOF > values-custom.yaml
# image:
# repository: registry.cn-beijing.aliyuncs.com/deepflow-ce/deepflow-agent
# deepflowServerNodeIPS:
# - 10.1.2.3 # FIXME: K8s Node IPs
# - 10.4.5.6 # FIXME: K8s Node IPs
# clusterNAME: k8s-1 # FIXME: name of the cluster in deepflow
# EOF
# helm repo add deepflow https://deepflowio.github.io/deepflow
helm repo update deepflow # use `helm repo update` when helm < 3.7.0
helm upgrade --install deepflow-agent -n deepflow deepflow/deepflow-agent --version 6.4.9 --create-namespace \
-f values-custom.yaml
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2.2.2 云主机环境
切换 Agent 下载链接至 LTS 版本:
curl -O https://deepflow-ce.oss-cn-beijing.aliyuncs.com/rpm/agent/v6.4.9/linux/$(arch | sed 's|x86_64|amd64|' | sed 's|aarch64|arm64|')/deepflow-agent-rpm.zip
unzip deepflow-agent-rpm.zip
yum -y localinstall x86_64/deepflow-agent-1.0*.rpm
2
3
curl -O https://deepflow-ce.oss-cn-beijing.aliyuncs.com/deb/agent/v6.4.9/linux/$(arch | sed 's|x86_64|amd64|' | sed 's|aarch64|arm64|')/deepflow-agent-deb.zip
unzip deepflow-agent-deb.zip
dpkg -i x86_64/deepflow-agent-1.0*.systemd.deb
2
3
curl -O https://deepflow-ce.oss-cn-beijing.aliyuncs.com/bin/agent/v6.4.9/linux/$(arch | sed 's|x86_64|amd64|' | sed 's|aarch64|arm64|')/deepflow-agent.tar.gz
tar -zxvf deepflow-agent.tar.gz -C /usr/sbin/
cat << EOF > /etc/systemd/system/deepflow-agent.service
[Unit]
Description=deepflow-agent.service
After=syslog.target network-online.target
[Service]
Environment=GOTRACEBACK=single
LimitCORE=1G
ExecStart=/usr/sbin/deepflow-agent
Restart=always
RestartSec=10
LimitNOFILE=1024:4096
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 2.3 安装 LTS 版本 Cli
切换 Cli 下载链接至 LTS 版本:
curl -o /usr/bin/deepflow-ctl https://deepflow-ce.oss-cn-beijing.aliyuncs.com/bin/ctl/v6.4.9/linux/$(arch | sed 's|x86_64|amd64|' | sed 's|aarch64|arm64|')/deepflow-ctl
chmod a+x /usr/bin/deepflow-ctl
2
# 3. 使用托管 MySQL
在生产环境中建议使用托管的 MySQL 来保证可用性,建议使用 MySQL 8.0 及以上版本。 需要提前创建如下 database 并授权账户:
- deepflow
- grafana
values-custom.yaml
配置:
global:
externalMySQL:
enabled: true ## Enable external MySQL
ip: 10.1.2.3 ## External Mysql IP address, Need to allow deepflow-server and clickhouse access
port: 3306 ## External Mysql port
username: root ## External Mysql username
password: password ## External Mysql password
mysql:
enabled: false ## Close MySQL deployment
2
3
4
5
6
7
8
9
# 4. 使用托管 ClickHouse
在生产环境中建议使用托管的 ClickHouse 来保证可用性,建议 ClickHouse 的版本至少为 21.8。 需要提前创建如下 database 并授权账户:
- deepflow_system
- event
- ext_metrics
- flow_log
- flow_metrics
- flow_tag
- profile
values-custom.yaml
配置:
global:
externalClickHouse:
enabled: true ## Enable external ClickHouse
type: ep
## External ClickHouse clusterName,The default value is 'default', query method: 'select cluster,host_address,port from system.clusters;'
clusterName: default
## External ClickHouse storage policy name,The default value is 'default', query method: 'select policy_name from system.storage_policies;'
storagePolicy: default
username: default ## External ClickHouse username
password: password ## External ClickHouse Password
## External ClickHouse IP address and port list, DeepFlow writes IP and port information to an svc endpoint, deepflow-server obtains ClickHouse's IP:Port through get&wath&list endpoint.
## deepflow-server needs to access the real IP address of ClickHouse, the port is connected using tcp-port, usually 9000, and query IP:Port through 'select host_address,port from system.clusters;'.
hosts:
- ip: 10.1.2.3
port: 9000
- ip: 10.1.2.4
port: 9000
- ip: 10.1.2.5
port: 9000
clickhouse:
enabled: false ## Close ClickHouse deployment
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DeepFlow 会将 ClickHouse 的 IP:Port 信息写入一个 Service 的 Endpoint 中,deepflow-server 的 controller 和 ingester 通过 list&watch
这个 Service 的 Endpoint 来获取 ClickHouse 地址列表,其中 controller 连接所有的 ClickHouse 进行创建库、表结构等操作,ingester 通过对所有 deepflow-server pod 名称和 Endpoint 的 IP 进行排序,依次对应 deepflow-server 和 ClickHouse,并进行创建库、表结构和写入观测数据,querier 通过访问这个 Service 来查询观测数据。
因 ClickHouse 需要请求 MySQL,使用托管 Clickhosue 的同时建议使用托管 Mysql。
如果只使用托管 ClickHouse 而不使用托管 MySQL,建议打开 MySQL 的 NodePort,并配置 global.externalMySQL
为 NodePort 访问地址。
values-custom.yaml
配置:
global:
externalClickHouse:
enabled: true ## Enable external ClickHouse
type: ep
## External ClickHouse clusterName,The default value is 'default', query method: 'select cluster,host_address,port from system.clusters;'
clusterName: default
## External ClickHouse storage policy name,The default value is 'default', query method: 'select policy_name from system.storage_policies;'
storagePolicy: default
username: default ## External ClickHouse username
password: password ## External ClickHouse Password
## External ClickHouse IP address and port list, DeepFlow writes IP and port information to an svc endpoint, deepflow-server obtains ClickHouse's IP:Port through get&wath&list endpoint.
## deepflow-server needs to access the real IP address of ClickHouse, the port is connected using tcp-port, usually 9000, and query IP:Port through 'select host_address,port from system.clusters;'.
hosts:
- ip: 10.1.2.3
port: 9000
- ip: 10.1.2.4
port: 9000
- ip: 10.1.2.5
port: 9000
externalMySQL:
enabled: true
ip: xx.xx.xx.xx ## External Mysql IP address, Need to allow deepflow-server and clickhouse access
port: 30123 ## External Mysql port
username: root ## External Mysql username
password: deepflow
clickhouse:
enabled: false ## Close ClickHouse deployment
mysql:
service:
type: NodePort
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
如果想复用 NodePort 分配的端口,需要部署两次,在第二次部署前将第一次分配的端口填入 global.externalMySQL.port
。
由于 Clickhouse 会保存 MySql 的连接方式,所以修改 MySql 连接后需要删除 Clickhouse 所有数据库并重启 deepflow-server 以重置数据库。
# 5. 优化 deepflow-agent 到 deepflow-server 的流量路径
deepflow-agent 启动时会使用本地配置文件(包括 ConfigMap )中的 controller-ips
请求deepflow-server, deepflow-server 会默认下发 deepflow-server Pod 的 Node IP 给 deepflow-agent(同一个集群中默认下发 deepflow-server 的 Pod IP) 用于后续的请求配置和发送数据,在有多个 deepflow-server 的时候会下发不同的 deepflow-server 的 Node IP 进行负载均衡,并每隔一段时间进行负载均衡后重新下发。
此时有两个端口的 IP 由 deepflow-server 动态下发给 deepflow-agent:
- deepflow-agent 和 deepflow-server 不在同一个集群
- 控制面 30035
- 数据面 30033
- deepflow-agent 和 deepflow-server 在同一个集群
- 控制面 20035 (deepflow-server ConfigMap 中配置的
controller.grpc-port
,默认 20035 ) - 数据面 20033 (deepflow-server ConfigMap 中配置的
ingester.listen-port
,默认 20033 )
- 控制面 20035 (deepflow-server ConfigMap 中配置的
默认配置下,deepflow-agent 使用 NodePort 连接 deepflow-server,该NodePort Service使用的 externalTrafficPolicy=Cluster
,经过 NodePort 到 deepflow-server 的流量一般会再次进行转发,占用不必要的节点间带宽;极端情况下,kube-proxy 可能会因为流量过多而占用过多的 CPU 等资源。
# 5.1 使用 LoadBalancer 类型的 Service
有 LoadBalancer 条件的环境可以修改 deepflow-server 的 Service 类型为 LoadBalancer,使用 LoadBalancer 代理 deepflow-agent 请求 deepflow-server 的流量,提高可用性。
values-custom.yaml
配置:
server:
service:
type: LoadBalancer
2
3
修改 deepflow-server 的 Service 类型为 LoadBalance 后,需要配置 agent-group-config 切换 deepflow-agent 请求的 deepflow-server 地址为 LoadBalance IP:
proxy_controller_ip: 1.2.3.4 # FIXME: Your LoadBalancer IP address
analyzer_ip: 1.2.3.4 # FIXME: Your LoadBalancer IP address
proxy_controller_port: 30035 # The default is 30035
analyzer_port: 30033 # The default is 30033
2
3
4
注意:配置后会固定给采集器下发此 IP 作为数据传输 IP,并且采集器也会固定使用本地配置文件中的 controller-ips 请求 控制面 30035 端口获取配置信息。
# 5.2 使用 Local externalTrafficPolicy
没有 LoadBalancer 条件的环境可以配置 deepflow-server 的 Service 为 externalTrafficPolicy=Local
来保证访问某个节点 NodePort 的流量只会路由到该节点上的 deepflow-server。
因使用 externalTrafficPolicy=Local
和 deepflow-server 漂移等因素可能会造成部分节点的 NodePort 无法访问到 deepflow-server,需要注意避免影响 deepflow-agent 配置文件中的 controller-ip。
values-custom.yaml
配置:
server:
service:
externalTrafficPolicy: Local
2
3
# 5.3 使用 HostNetwork
打开 deepflow-server 的 HostNetWork 以减少 kube-proxy 的压力。
values-custom.yaml
配置:
server:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
2
3
打开 deepflow-server 的 HostNetwork后,需要配置 agent-group-config 切换 deepflow-agent 请求 deepflow-server 的端口:
proxy_controller_port: 20035 # The deepflow-server controller listens on the port. The default port is 20035
analyzer_port: 20033 # The deepflow-server ingester listens on the port. The default port is 20033
2
# 6. 接入已有的 Grafana
# 6.1 下载安装插件
DeepFlow 支持接入已有的 Grafana,建议使用 9.0 及以上版本,支持的最低版本为 8.0,目前 DeepFlow 的插件目前正在做认证工作,在认证工作完成之前需要配置 Grafana,允许加载未认证插件:
[plugins]
allow_loading_unsigned_plugins = deepflow-querier-datasource,deepflow-apptracing-panel,deepflow-topo-panel,deepflowio-tracing-panel,deepflowio-deepflow-datasource,deepflowio-topo-panel
2
下载插件安装包:
curl -O https://deepflow-ce.oss-cn-beijing.aliyuncs.com/pkg/grafana-plugin/stable/deepflow-gui-grafana.tar.gz
将下载好的插件解压至 Grafana 插件目录,例如 /var/lib/grafana/plugins
,并重启 Grafana 加载插件:
tar -zxvf deepflow-gui-grafana.tar.gz -C /var/lib/grafana/plugins/
# 6.2 添加 DeepFlow Data source
你可以在 Grafana Data sources 中找到 DeepFlow Querier, 并添加如下配置项:
Request Url
:Grafana 访问 deepflow-server service querier 端口的 NodePort,执行如下命令可得到访问地址:echo "http://$(kubectl get nodes -o jsonpath="{.items[0].status.addresses[0].address}"):$(kubectl get --namespace deepflow -o jsonpath="{.spec.ports[0].nodePort}" services deepflow-server)"
1API Token
: 无需填写Tracing Url
: Grafana 访问 deepflow-app service app 端口的 NodePort,执行如下命令可打开 NodePort 并得到访问地址:values-custom.yaml
配置:app: service: type: NodePort
1
2
3helm upgrade deepflow -n deepflow deepflow/deepflow -f values-custom.yaml echo "http://$(kubectl get nodes -o jsonpath="{.items[0].status.addresses[0].address}"):$(kubectl get --namespace deepflow -o jsonpath="{.spec.ports[0].nodePort}" services deepflow-app)"
1
2
# 6.3 导入 Dashboard
点击进入刚刚添加的 DeepFlow Data source,切换至 Dashboards
页面,点击 dashboard 的 Import
即可导入 dashboard。
# 7. 使用AI模型
# 7.1 部署
从项目[https://github.com/deepflowio/stella-agent-ce] 中获取服务镜像,参考deploy目录下的配置文件结合实际情况部署以上服务
# 7.2 通过yaml来配置会话模型
如果通过yaml来配置模型并且启用,那么会优先使用yaml中定义的模型
目前服务支持如下模型,默认值请保持不变,空缺值请去对应平台获取相应信息后填入
ai:
enable: False # True,False,是否启用,如果启用,模型配置信息会优先使用yaml配置,请补齐后续空缺配置再启用,如果想使用db来配置模型信息请置为False
platforms:
-
enable: False # True,False,是否启用
platform: "azure"
model: "gpt"
api_type: "azure"
api_key: ""
api_base: ""
api_version: ""
engine_name:
- ""
-
enable: False
platform: "aliyun"
model: "dashscope"
api_key: ""
engine_name:
- "qwen-turbo"
- "qwen-plus"
-
enable: False
platform: "baidu"
model: "qianfan"
api_key: ""
api_secre: ""
engine_name:
- "ERNIE-Bot"
- "ERNIE-Bot-turbo"
-
enable: False
platform: "zhipu"
model: "zhipuai"
api_key: ""
engine_name:
- "chatglm_turbo"
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
# 7.3 通过db来配置会话模型
如果通过yaml来配置模型并且启用,那么会优先使用yaml中定义的模型
获取所有模型列表示例
- url
- /v1/llm_agent_config
- method
- get
- Response
{ "OPT_STATUS": "SUCCESS", "DATA": { // platform_name,模型所在平台名称 "azure": { // key_name:key_value "model": "gpt", "model_info": "", "engine_name": [ "DF-GPT-16K", "DF-GPT4" ], "enable": "1"// 开启:1,关闭:0 }, "aliyun": { "model": "dashscope", "model_info": "", "engine_name": [ "qwen-turbo", "qwen-plus" ], "enable": "1" }, "baidu": { "model": "qianfan", "model_info": "", "engine_name": [ "ERNIE-Bot", "ERNIE-Bot-turbo" ], "enable": "0" }, "zhipu": { "model": "zhipuai", "model_info": "", "engine_name": [ "chatglm_turbo" ], "enable": "1" } }, "DESCRIPTION": "SUCCESS" }
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- url
获取某个模型信息示例
- url
- /v1/llm_agent_config/{platform_name} # platform_name: 模型所在平台名称,比如: azure
- method
- get
- Response
{ "OPT_STATUS": "SUCCESS", "DATA": { // platform_name "azure": { // key_name: key_value "model": "gpt", "model_info": "", "api_base": "https://df-gpt.openai.azure.com/", "api_key": "906cc0fa3398455dbf5454e88202d", "api_type": "azure", "api_version": "2023-07-17-preview", "engine_name": [ "DF-GPT-16K", "DF-GPT4" ], "enable": "1"// 开启:1,关闭:0 } }, "DESCRIPTION": "SUCCESS" }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21- url
修改&更新某个模型下的某个配置示例
- url
- /v1/llm_agent_config/{platform_name}/{key_name} # platform_name: 模型所在平台名称,比如: azure, key_name: 配置项名称, 比如: api_base
- method
- patch
- header
- content-type: application/json
- body
- value: "" # 配置项值
- Response
{ "OPT_STATUS": "SUCCESS", "DATA": true, "DESCRIPTION": "SUCCESS" }
1
2
3
4
5- url
添加某个模型下的新引擎示例
- url
- /v1/llm_agent_config
- method
- post
- header
- content-type: application/json
- body
- platform: "" # 模型所属平台,比如: azure
- model: "" # 模型名称,比如: gpt
- model_info: "" # 模型描述,比如: "gpt模型"
- key_name: "engine_name" # 模型引擎,唯一值,固定
- value: "" # 引擎名称,比如: "DF-GPT4-32K"
- Response
{ "OPT_STATUS": "SUCCESS", "DATA": true, "DESCRIPTION": "SUCCESS" }
1
2
3
4
5- url
删除某个模型下的新引擎
- url
- /v1/llm_agent_config/{engine_name} # engine_name: 引擎名称,比如: DF-GPT4-32K
- method
- delete
- Response
{ "OPT_STATUS": "SUCCESS", "DATA": true, "DESCRIPTION": "SUCCESS" }
1
2
3
4
5- url
# 8. 使用
请求会话模型,platform_name: 模型所在平台名称,比如: azure, engine_name: 引擎名称,比如: DF-GPT4-32K
- url
- /v1/ai/stream/{platform_name}?{engine_name}
- method
- post
- header
- content-type: application/json
- body
- system_content: "你是一个网络专家" # 模型角色定位
- user_content: "web测试" # 问题描述
- Response
请提供有效信息,我无法回答