在 Bigtable 和 GKE 上使用 OpenTSDB 监控时间序列数据

Last reviewed 2022-01-12 UTC

本指南介绍如何利用 Google Kubernetes Engine (GKE)Bigtable 上运行的 OpenTSDB 收集、记录和监控 Google Cloud 上的时序数据

时序数据是一项非常宝贵的资产,可用于趋势、监控和机器学习等各种应用。您可以基于服务器基础架构、应用代码和其他来源生成时间序列数据。OpenTSDB 可收集和保留大量具有高粒度级的时间序列数据。

本指南介绍如何使用 GKE 为时序数据创建可扩缩的集合层。此外还展示了如何使用 Bigtable 处理收集的数据。本指南假定您熟悉 Kubernetes 和 Bigtable。

下图显示了本指南的高级架构:

Bigtable 中存储的时间序列数据的来源。

上图显示了使用 GKE 上部署的 OpenTSDB 存储在 Bigtable 中的多个时间序列数据(例如物联网事件和系统指标)。

目标

  • 通过 Cloud Build 构建本指南中使用的容器映像。
  • 使用 Artifact Registry 管理这些容器映像。
  • 创建 Bigtable 实例。
  • 创建 GKE 集群。
  • 将 OpenTSDB 部署到 GKE 集群。
  • 将时间序列指标发送到 OpenTSDB。
  • 使用 OpenTSDB 和 Grafana 来直观显示指标。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能

  3. 启用 Bigtable, Bigtable Admin, GKE, Compute Engine, Cloud Build, and Artifact Registry API。

    启用 API

  4. 在 Google Cloud 控制台中,转到欢迎页面。

    转到“欢迎”页面

    记下项目 ID,因为后续步骤中会用到。

  5. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

创建 Bigtable 实例

本指南使用 Bigtable 来存储您收集的时序数据,因此您必须创建 Bigtable 实例。

Bigtable 是一种键/宽列存储,适用于时间序列数据。Bigtable 支持 HBase API,因此您可以使用旨在处理 Apache HBase 的软件(例如 OpenTSDB)。如需详细了解 OpenTSDB 使用的 HBase 架构,请参阅 HBase 架构

OpenTSDB 的一个关键组件是 AsyncHBase 客户端,它允许您以完全异步、非阻塞、线程安全的方式批量写入 HBase。当您结合使用 OpenTSDB 和 Bigtable 时,AsyncHBase 将以 AsyncBigtable 客户端的形式实现。

本指南使用具有单节点集群的 Bigtable 实例。迁移到生产环境时,请考虑将 Bigtable 实例用于大型集群。如需详细了解如何选择集群大小,请参阅了解 Bigtable 性能

  1. 在 Cloud Shell 中,为您的 Google Cloud 可用区设置环境变量,您将在该可用区中创建 Bigtable 集群和 GKE 集群以及 Bigtable 集群的实例标识符:

    export BIGTABLE_INSTANCE_ID=BIGTABLE_INSTANCE_ID
    export ZONE=ZONE
    

    替换以下内容:

    • BIGTABLE_INSTANCE_ID:Bigtable 实例的标识符。
    • ZONE:将在其中创建 Bigtable 集群和 GKE 集群的可用区。

    该命令应类似于以下示例:

    export BIGTABLE_INSTANCE_ID=bt-opentsdb
    export ZONE=us-central1-f
    
  2. 创建 Bigtable 实例:

    gcloud bigtable instances create ${BIGTABLE_INSTANCE_ID} \
        --cluster-config=id=${BIGTABLE_INSTANCE_ID}-${ZONE},zone=${ZONE},nodes=1 \
        --display-name=OpenTSDB
    

创建用于部署和测试 OpenTSDB 的映像

为了部署和演示使用 Bigtable 存储后端的 OpenTSDB,本指南会使用一系列部署到 GKE 的 Docker 容器映像。您可以使用 Cloud Build 附带的 GitHub 代码库中的代码构建多个此类映像。将基础架构部署到 GKE 时,系统会使用容器代码库。在本指南中,您将使用 Artifact Registry 来管理这些容器映像。

  1. 在 Cloud Shell 中,为要在其中创建 Artifact Registry 代码库的 Google Cloud 可用区设置环境变量:

    export PROJECT_ID=PROJECT_ID
    export REGION=REGION
    export AR_REPO=AR_REPO
    

    替换以下内容:

    • PROJECT_ID:您的项目 ID
    • REGION:将在其中创建 Artifact Registry 代码库的区域
    • AR_REPO:您的 Artifact Registry 代码库的名称

    该命令应类似于以下示例:

    export PROJECT_ID=bt-opentsdb-project-id
    export REGION=us-central1
    export AR_REPO=opentsdb-bt-repo
    
  2. 创建 Artifact Registry 代码库:

    gcloud artifacts repositories create ${AR_REPO} \
        --repository-format=docker  \
        --location=${REGION} \
        --description="OpenTSDB on bigtable container images"
    

创建和管理用于部署和演示 OpenTSDB 的映像

本指南使用两个 Docker 容器映像。第一个映像用于两个用途:为 OpenTSDB 执行一次性 Bigtable 数据库设置,以及为 OpenTSDB 部署部署读取和写入服务容器。第二个映像用于生成示例指标数据,以演示 OpenTSDB 部署。

将容器映像构建作业提交到 Cloud Build 时,您可以标记映像,以便在构建后存储在 Artifact Registry 中。

  1. 在 Cloud Shell 中,克隆包含附带代码的 GitHub 代码库:

    git clone https://github.com/GoogleCloudPlatform/opentsdb-bigtable.git
    
  2. 转到示例代码目录:

    cd opentsdb-bigtable
    
  3. 为使用 Bigtable 作为存储后端的 OpenTSDB 服务器映像设置环境变量:

    export SERVER_IMAGE_NAME=opentsdb-server-bigtable
    export SERVER_IMAGE_TAG=2.4.1
    
  4. 使用 Cloud Build 构建映像:

    gcloud builds submit \
        --tag ${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO}/${SERVER_IMAGE_NAME}:${SERVER_IMAGE_TAG} \
        build
    

    由于您正确标记了映像,因此构建完成后,映像将由 Artifact Registry 代码库管理。

  5. 为演示时序数据生成映像设置环境变量:

    export GEN_IMAGE_NAME=opentsdb-timeseries-generate
    export GEN_IMAGE_TAG=0.1
    
  6. 使用 Cloud Build 构建映像:

    cd generate-ts
    ./build-cloud.sh
    cd ..
    

创建 GKE 集群

GKE 提供代管式 Kubernetes 环境。创建 GKE 集群后,您可以将 Kubernetes Pods 部署到该集群。本指南使用 GKE 和 Kubernetes Pod 来运行 OpenTSDB。

OpenTSDB 将其存储空间与应用层分开,因此可跨多个实例同时部署。通过并行运行,OpenTSDB 可以处理大量时间序列数据。

  1. 在 Cloud Shell 中,为要在其中创建 Bigtable 集群和 GKE 集群的 Google Cloud 可用区设置环境变量,并为 GKE 集群设置名称、节点类型和版本:

    export GKE_CLUSTER_NAME=GKE_CLUSTER_NAME
    export GKE_VERSION=1.20
    export GKE_NODE_TYPE=n1-standard-4
    

    GKE_CLUSTER_NAME 替换为 GKE 集群的名称。

    该命令应类似于以下示例:

    export GKE_CLUSTER_NAME=gke-opentsdb
    export GKE_VERSION=1.20
    export GKE_NODE_TYPE=n1-standard-4
    
  2. 创建 GKE 集群。

    gcloud container clusters create ${GKE_CLUSTER_NAME} \
        --zone=${ZONE} \
        --cluster-version=${GKE_VERSION} \
        --machine-type ${GKE_NODE_TYPE} \
        --scopes "https://www.googleapis.com/auth/cloud-platform"
    

    此操作可能需要几分钟才能完成。 通过将范围添加到 GKE 集群,您的 OpenTSDB 容器可以与 Bigtable 和 Container Registry 进行交互。

    本指南的其余部分使用您刚刚构建的容器,这些容器由 Artifact Registry 管理。用于构建容器的 Dockerfileentrypoint 脚本位于以下指南代码库的 build 文件夹中。

  3. 获取凭据,以便您可以连接到 GKE 集群:

    gcloud container clusters get-credentials ${GKE_CLUSTER_NAME} --zone ${ZONE}
    

创建具有配置详情的 ConfigMap

Kubernetes 使用 ConfigMap 将配置详细信息与容器映像分离,以使应用更具可移植性。OpenTSDB 的配置在 opentsdb.conf 文件中指定。包含 opentsdb.conf 文件的 ConfigMap 随附在示例代码中。

在此步骤中和后续步骤中,您将使用 GNU envsubst 实用程序将 YAML 模板文件中的环境变量占位符替换为各自的部署值。

  • 通过更新后的 opentsdb-config.yaml 文件创建 ConfigMap:

    envsubst < configmaps/opentsdb-config.yaml.tpl | kubectl create -f -
    

在 Bigtable 中创建 OpenTSDB 表

您需要在 Bigtable 中创建表来存储该数据,然后才能使用 OpenTSDB 读取或写入数据。 要创建表,您需要创建一项 Kubernetes 作业

  1. 在 Cloud Shell 中,启动作业:

    envsubst < jobs/opentsdb-init.yaml.tpl | kubectl create -f -
    

    该作业可能需要 1 分钟或更长时间才能完成。验证作业是否成功完成:

    kubectl describe jobs
    

    输出显示 Pods Statuses 显示 1 Succeeded 时,表示一个作业已成功完成。

  2. 检查表创建作业日志:

    OPENTSDB_INIT_POD=$(kubectl get pods --selector=job-name=opentsdb-init \
                        --output=jsonpath={.items..metadata.name})
    kubectl logs $OPENTSDB_INIT_POD
    

    输出内容类似如下:

    create 'tsdb-uid',
      {NAME => 'id', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'},
      {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 3.2730 seconds
    
    create 'tsdb',
      {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 1.8440 seconds
    
    create 'tsdb-tree',
      {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 1.5420 seconds
    
    create 'tsdb-meta',
      {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 1.9910 seconds
    

    输出列出了所创建的每个表。此作业运行多个表创建命令,每个命令均使用 create TABLE_NAME 格式。当您以 0 row(s) in TIME seconds 格式输出时,已成功创建表。

    • TABLE_NAME:作业创建的表的名称
    • TIME:创建表的时间

数据模型

您创建的表来自 OpenTSDB 的数据点。在稍后的步骤中,您会将时间序列数据写入这些表中。时间序列数据点按如下形式进行整理和存储:

字段 必填 说明 示例
metric 必需 要测量的项—默认键 sys.cpu.user
timestamp 必需 测量的 Unix 纪元时间 1497561091
tags 至少需要输入一个标记 允许出于查询目的进行测量 hostname=www cpu=0 env=prod
value 必需 测量值 89.3

来自行键的指标、时间戳和标记(标记键和标记值)。时间戳会被归一化为一小时,以确保某一行包含的数据点数量不会过多。如需了解详情,请参阅 HBase 架构

部署 OpenTSDB

下图展示了 OpenTSDB 部署架构,其服务在 GKE 上运行,并使用 Bigtable 作为存储后端:(译注:原英文 OpenTSTB 可能是 OpenTSDB 的笔误)

两个 OpenTSDB Kubernetes 部署。

本指南使用两个 OpenTSDB Kubernetes 部署:一个部署向 Bigtable 发送指标,另一个部署从中读取指标。使用两个部署可防止长时间运行的读取和写入相互阻塞。每个部署中的 pod 都使用相同的映像。OpenTSDB 提供了一个名为 tsd 的守护进程,它在每个容器中运行。单个 tsd 进程每秒都可处理高吞吐量的事件。为分配负载,本指南中的每个部署都会创建三个读写 Pod 副本。

  1. 在 Cloud Shell 中,创建一个用于写入指标的部署:

    envsubst < deployments/opentsdb-write.yaml.tpl | kubectl create -f  -
    

    写入部署的配置信息位于指南代码库的 deployments 文件夹的 opentsdb-write.yaml.tpl 文件中。

  2. 创建用于读取指标的部署:

    envsubst < deployments/opentsdb-read.yaml.tpl | kubectl create -f  -
    

    读取器部署的配置信息位于指南代码库的 deployments 文件夹的 opentsdb-read.yaml.tpl 文件中。

在生产部署中,您可以通过手动方式或在 Kubernetes 中使用自动扩缩功能以增加正在运行的 tsd Pod 数量。同样地,您也可以手动或使用集群自动扩缩器增加 GKE 集群中的实例数。

创建 OpenTSDB 服务

为了向这些部署提供一致的网络连接,您需要创建两个 Kubernetes 服务:一个服务将指标写入 OpenTSDB,另一个读取操作。

  1. 在 Cloud Shell 中,创建用于写入指标的服务:

    kubectl create -f services/opentsdb-write.yaml
    

    指标写入服务的配置信息包含在指南代码库的 services 文件夹的 opentsdb-write.yaml 文件中。此服务在您的 Kubernetes 集群内创建,可供集群中运行的其他服务访问。

  2. 创建用于读取指标的服务:

    kubectl create -f services/opentsdb-read.yaml
    

    指标读取服务的配置信息包含在指南代码库的 services 文件夹的 opentsdb-read.yaml 文件中。

将时序数据写入 OpenTSDB

您可以通过多种机制将数据写入 OpenTSDB。在定义服务端点后,您可以指示进程开始向这些端点写入数据。本指南部署一项 Python 服务,该服务发出两个指标的演示时序数据:集群内存利用率 (memory_usage_gauge) 和集群 CPU 利用率 (cpu_node_utilization_gauge)。

  • 在 Cloud Shell 中,将时序指标生成器部署到您的集群:

    envsubst < deployments/generate.yaml.tpl | kubectl create -f -
    

使用 OpenTSDB 检查示例时序数据

您可以使用本指南前面部署的 opentsdb-read 服务端点来查询时序指标。您可以通过多种方式使用数据。常见的一种方式是直观显示它。OpenTSDB 附带一个基本界面,用于直观显示其收集到的指标。本指南使用的是 Grafana,它是一种直观显示指标的常用替代方案,同时还提供其他功能。

在集群中运行 Grafana,需要一个与设置 OpenTSDB 类似的过程。除了创建 ConfigMap 和部署之外,您还需要配置端口转发,以便当 Grafana 在 Kubernetes 集群中运行时对其进行访问。

  1. 在 Cloud Shell 中,使用指南代码库的 configmaps 文件夹的 grafana.yaml 文件中的配置信息创建 Grafana ConfigMap:

    kubectl create -f configmaps/grafana.yaml
    
  2. 使用指南代码库的 deployments 文件夹的 grafana.yaml 文件中的配置信息创建 Grafana 部署:

    kubectl create -f deployments/grafana.yaml
    
  3. 获取集群中 Grafana pod 的名称,并用它来设置端口转发。

    GRAFANA_PODS=$(kubectl get pods --selector=app=grafana \
                   --output=jsonpath={.items..metadata.name})
    kubectl port-forward $GRAFANA_PODS 8080:3000
    

    验证转发是否成功。输出内容类似如下:

    Forwarding from 127.0.0.1:8080 -> 3000
    
  4. 如需连接到 Grafana 网页界面,请在 Cloud Shell 中点击网页预览,然后选择在端口 8080 上预览

    如需了解详情,请参阅使用网页预览

    随即打开新的浏览器标签页并连接到 Grafana 网页界面。稍等片刻之后,浏览器会显示如下图形:

    显示集群指标的折线图。

    Grafana 的该项部署已针对本指南进行了自定义。configmaps/grafana.yamldeployments/grafana.yaml 文件配置了 Grafana,使其连接到 opentsdb-read 服务、允许匿名身份验证和显示一些基本集群指标。要在生产环境中部署 Grafana,我们建议您实施适当的身份验证机制并使用更丰富的时间序列图。

清除数据

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

逐个删除资源

  1. 删除 Kubernetes 集群以删除您创建的所有工件:

    gcloud container clusters delete GKE_CLUSTER_NAME
    

    要删除 Kubernetes 集群,请输入 Y 进行确认。

  2. 如需删除 Bigtable 实例,请执行以下操作:

    1. 在 Google Cloud 控制台中,转到 Bigtable

      转到 Bigtable

    2. 选择您之前创建的实例,然后点击删除实例

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤