观测云-k8s可观测之多团队数据空间隔离

背景

通常情况下单个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

开启分流模式,需要注意修改三个部分

  1. 上报的token地址改为dataway配置的DW_SECRET_TOKEN
  2. 开启分流配置
  3. 设置分流的标识。

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规则打到对应的空间中去

相关推荐
帅儿二郎19 天前
ELK:日志监控平台部署-基于elastic stack 8版本
linux·运维·elk·自动化运维·elastic·日志监控平台·日志分析平台
concisedistinct1 个月前
在多数据中心环境中,自动化运维如何保证跨区域的一致性?网络延迟导致的数据不一致是否可以完全避免?|自动化运维|跨区域一致性
运维·网络·自动化·自动化运维·数据中心
winkee1 个月前
OpenSSL 使用 pkcs#8 格式来封装密钥
linux·自动化运维·devops
北京_宏哥1 个月前
🔥《最新出炉》系列初窥篇-Python+Playwright自动化测试-33-处理https 安全问题或者非信任站点-上篇
前端·python·自动化运维
tangdou3690986552 个月前
两种方案手把手教你多种服务器使用tinyproxy搭建http代理
运维·后端·自动化运维
子洋2 个月前
自动化部署脚本教程:前端项目的自动打包、上传与部署
前端·后端·自动化运维
洛小豆2 个月前
有趣的实战经验分享:自动化测试中如何精确模拟富文本编辑器中的输入与提交
前端·javascript·自动化运维
cooldream20092 个月前
828华为云征文 | 华为云X实例监控与告警管理详解
华为云·自动化运维·云监控·告警
码上飞扬2 个月前
深入浅出 Ansible 自动化运维:从入门到实战
运维·ansible·自动化运维
疾风终究没有归途3 个月前
Ansible自动化运维实战:打造高效、可靠的系统管理方案!
运维·自动化运维·配置管理·应用部署