背景
通常情况下单个K8S 集群不是单一的团队在使用,可观测数据采集后,将数据上报到云端就有数据隔离的需求。
传统模式
在一个k8s集群中,每个node节点下部署datakit探针,探针配置的是观测云同一个工作空间的token,最终4个node 节点的所有数据都会汇聚到观测云的一个空间中
dataway-sinker 分流模式
在dataway分流模式下,部署在node节点上的datakit配置的是token不再是观测云工作空间的token,而是dataway-sinker网关下发的token。dataway-sinker需要配置分流规则,datakit上报数据如果命中分流规则,就会打到对应的工作空间。 如此,即实现了同一个K8S集群的数据分流到不同工作空间的需求。
配置
dataway
本文主要说明dataway在K8S环境部署情况。 环境变量设置dataway-token 和 sinker规则
yaml
- name: DW_SECRET_TOKEN
value: "tkn_zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
- name: DW_SINKER_FILE_PATH
value: "/usr/local/cloudcare/dataflux/dataway/sinker.json"
singker规则 configMap 配置,省略不变配置。
yaml
volumeMounts:
- mountPath: /usr/local/cloudcare/dataflux/dataway/sinker.json
name: sinker
subPath: sinker.json
`
`
`
volumes:
- configMap:
name: sinker
name: sinker
`
`
`
apiVersion: v1
kind: ConfigMap
metadata:
name: sinker
namespace: utils
data:
sinker.json: |
{
"strict":true,
"rules": [
{
"rules": [
"{ project = 'xxxxx'}"
],
"url": "http://kodo.forethought-kodo:9527?token=tkn_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
{
"rules": [
"{ project = 'xxxxx'}"
],
"url": "http://kodo.forethought-kodo:9527?token=tkn_yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}
]
}
configMap中的token为实际工作空间的token值。
sinker规则支持正则,具体规则参考: docs.guance.com/datakit/dat...
可以使用etcd 代替configmap,环境变量配置参考:docs.guance.com/deployment/...
etcd使用命令写入sinker规则: docs.guance.com/deployment/...
datakit
开启分流模式,需要注意修改三个部分
- 上报的token地址改为dataway配置的DW_SECRET_TOKEN
- 开启分流配置
- 设置分流的标识。
Datakit 设置的全局标签和全局选举标签将会默认作为分流的标识
分流标识支持设置数据标签, 如指标的tag,日志tag,链路数据tag数据等,也支持按照数据类型进行分流,如配置GLOBAL_CUSTOMER_KEYS 为 category ,则可以按照tracing、logging 等整个类型数据进行分流。
分流标志仅支持字符串类型数据。
datakit 环境变量配置
yaml
- name: ENV_DATAWAY
value: http://dataway.com?token=this_dataway_dw_secret_token
- name: ENV_DATAWAY_ENABLE_SINKER
value: "true"
- name: ENV_SINKER_GLOBAL_CUSTOMER_KEYS
value: namespace,project
主机datakit.conf 配置修改
ini
# /usr/local/datakit/conf.d/datakit.conf
[dataway]
# 指定一组 customer key
global_customer_keys = [
# 示例:添加 category 和 class 俩个 key
# 此处不宜配置太多 key,一般 2 ~ 3 个即可
"category",
"class",
]
# 开启 sinker 功能
enable_sinker = true
最佳实践
按照命名空间进行分流
通常情况下,不同命名空间下会有不同的业务存在
datakit中配置
yaml
- name: ENV_GLOBAL_HOST_TAGS
value: host=__datakit_hostname,host_ip=__datakit_ip,namespace=non_namespace_data
- name: ENV_GLOBAL_ELECTION_TAGS
value: namespace=non_namespace_data
- name: ENV_SINKER_GLOBAL_CUSTOMER_KEYS
value: namespace
sinker规则配置
yaml
{
"strict":true,
"rules": [
{
"rules": [
"{ namespace = 'xxxxx'}"
],
"url": "http://kodo.forethought-kodo:9527?token=tkn_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
{
"rules": [
"{ namespace = 'non_namespace_data'}"
],
"url": "http://kodo.forethought-kodo:9527?token=tkn_yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}
]
}
配置讲解
datakit采集的所有K8S数据会附加namespace标签,默认会覆盖全局标签中的"namespace=non_namespace_data",如k8s指标、命名空间下的应用日志、命名空间下的链路数据会按照对应的sinker规则上报到不同的工作空间。
主机数据默认是不会包含namespace标签的,如node节点的cpu指标。这时候全局标签中的"namespace=non_namespace_data"就起了对应的作用,会给原本不带namespace的数据附带上"namespace=non_namespace_data",可以把未进行分流的数据,统一打到一个工作空间里,这些数据通常是node节点的对象数据、指标数据等。
按照自定义tag进行分流
特殊情况下,相同命名空间下,也会有不同业务属性的数据,这时候就需要按照自定义标签来进行分流,比如使用自定义project_id标签进行分流。
datakit中配置
yaml
- name: ENV_GLOBAL_HOST_TAGS
value: host=__datakit_hostname,host_ip=__datakit_ip,project_id=000000
- name: ENV_GLOBAL_ELECTION_TAGS
value: project_id=000000
- name: ENV_SINKER_GLOBAL_CUSTOMER_KEYS
value: namespace
sinker规则配置
yaml
{
"strict":true,
"rules": [
{
"rules": [
"{ project_id = 'xxxxx'}"
],
"url": "http://kodo.forethought-kodo:9527?token=tkn_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
{
"rules": [
"{ project_id = '000000'}"
],
"url": "http://kodo.forethought-kodo:9527?token=tkn_yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}
]
}
数据上报原理和namespace一致,不再赘述
标签配置方式
k8s指标
DK需要开启label转tag功能,环境变量配置如下
yaml
- name: ENV_INPUT_CONTAINER_EXTRACT_K8S_LABEL_AS_TAGS_V2_FOR_METRIC
value: '["project_id"]'
- name: ENV_INPUT_CONTAINER_EXTRACT_K8S_LABEL_AS_TAGS_V2
value: '["project_id"]'
注意: 需要在deployment、pod、service 等数据上附加对应的label,添加后才可以进行label转tag。
容器日志
以stdout 为例,为被采集的日志添加project_id 标签
yaml
annotations:
## 添加配置,且指定容器为 log-output
datakit/log-output.logs: |
[{
"disable": false,
"source": "log-output-source",
"service": "log-output-service",
"multiline_match": "^\d{4}",
"tags" : {
"project_id": "xxxx"
}
}]
链路数据
通过operator注入环境变量,获取pod labels,加到APM Tags 环境变量中。
bash
"PROJECT_ID": "{fieldRef:metadata.labels['project_id']}",
"POD_NAME": "{fieldRef:metadata.name}",
"POD_NAMESPACE": "{fieldRef:metadata.namespace}",
"DD_TAGS": "pod_name:$(POD_NAME),namespace:$(POD_NAMESPACE),host:$(NODE_NAME),project_id:$(PROJECT_ID)"
至此, 我们需要的数据已经全部打上了对应的数据标签,数据会按照project_id的sinker规则打到对应的空间中去