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에 저장된 IoT 이벤트 및 시스템 측정항목과 같은 시계열 데이터의 여러 소스를 보여줍니다.

목표

  • Cloud Build를 사용하여 이 가이드에 사용된 컨테이너 이미지를 빌드합니다.
  • Artifact Registry를 사용하여 컨테이너 이미지를 관리합니다.
  • Bigtable 인스턴스를 만듭니다.
  • GKE 클러스터를 만듭니다.
  • GKE 클러스터에 OpenTSDB를 배포합니다.
  • 시계열 측정항목을 OpenTSDB에 전송합니다.
  • OpenTSDB 및 Grafana를 사용하여 측정항목을 시각화합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  2. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  3. API Bigtable, Bigtable Admin, GKE, Compute Engine, Cloud Build, and Artifact Registry 사용 설정

    API 사용 설정

  4. Google Cloud 콘솔에서 시작 페이지로 이동합니다.

    시작 페이지로 이동

    이후 단계에 사용되므로 프로젝트 ID를 기록해 둡니다.

  5. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

Bigtable 인스턴스를 만듭니다.

이 가이드에서는 Bigtable을 사용하여 수집되는 시계열 데이터를 저장합니다. 따라서 Bigtable 인스턴스를 만들어야 합니다.

Bigtable은 시계열 데이터에 효과적인 키/와이드 칼럼 저장소입니다. Bigtable은 HBase API를 지원하므로 OpenTSDB와 같이 Apache HBase에 작동하도록 설계된 소프트웨어를 사용할 수 있습니다. OpenTSDB에 사용되는 HBase 스키마에 대한 자세한 내용은 HBase 스키마를 참조하세요.

OpenTSDB의 핵심 구성요소는 완전 비동기, 비차단, 스레드에 안전한 방식으로 HBase에 대한 대량 쓰기를 사용 설정하는 AsyncHBase 클라이언트입니다. OpenTSDB를 Bigtable과 함께 사용하면 AsyncHBase가 AsyncBigtable 클라이언트로 구현됩니다.

이 가이드에서는 단일 노드 클러스터가 있는 Bigtable 인스턴스를 사용합니다. 프로덕션 환경으로 이동할 때는 클러스터가 더 큰 Bigtable 인스턴스를 사용하는 것이 좋습니다. 클러스터 크기 선택에 대한 자세한 내용은 Bigtable 성능 이해를 참조하세요.

  1. Cloud Shell에서 Bigtable 클러스터 및 GKE 클러스터와 Bigtable 클러스터에 대한 인스턴스 식별자를 만들 Google Cloud 영역에 대해 환경 변수를 설정합니다.

    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 pod를 배포할 수 있습니다. 이 가이드에서는 GKE와 Kubernetes 포드를 사용하여 OpenTSDB를 실행합니다.

OpenTSDB는 애플리케이션 레이어에서 스토리지를 분리하여, 여러 인스턴스 간에 동시에 배포할 수 있게 해줍니다. 병렬로 실행하면 OpenTSDB가 대량의 시계열 데이터를 처리할 수 있습니다.

  1. Cloud Shell에서 Bigtable 클러스터, GKE 클러스터와 GKE 클러스터의 이름, 노드 유형, 버전을 생성할 Google Cloud 영역의 환경 변수를 설정합니다.

    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 테이블 만들기

OpenTSDB를 사용하여 데이터를 읽고 쓸 수 있으려면 먼저 Bigtable에서 해당 데이터를 저장하기 위해 테이블 만들기를 수행해야 합니다. 테이블을 만들려면 Kubernetes 작업을 만듭니다.

  1. Cloud Shell에서 작업을 시작합니다.

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

    작업이 완료되려면 1분 이상 걸릴 수 있습니다. 작업이 성공적으로 완료되었는지 확인합니다.

    kubectl describe jobs
    

    Pods Statuses1 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 epoch 시간 1497561091
tags 태그가 1개 이상 필요함 쿼리 목적에 맞게 측정을 제한합니다. hostname=www cpu=0 env=prod
value 필수 측정 값 89.3

row key의 측정항목, 타임스탬프, 태그(태그 키 및 태그 값)입니다. 행에 데이터 포인트가 너무 많이 포함되지 않도록 타임스탬프가 1시간으로 정규화됩니다. 자세한 내용은 HBase 스키마를 참조하세요.

OpenTSDB 배포

다음 다이어그램은 GKE에서 실행되는 서비스 및 Bigtable이 스토리지 백엔드로 포함된 OpenTSTB의 배포 아키텍처를 보여줍니다.

2개의 OpenTSDB Kubernetes 배포입니다.

이 가이드에서는 Bigtalbe에 측정항목을 전송하는 배포와 이를 읽는 다른 배포의 두 가지 OpenTSDB Kubernetes 배포를 사용합니다. 2개의 배포를 사용하면 장기적으로 실행되는 읽기 및 쓰기로 인해 서로가 차단되지 않도록 방지합니다. 각 배포의 포드는 동일한 컨테이너 이미지를 사용합니다. OpenTSDB는 각 컨테이너에서 실행되는 tsd라는 데몬을 제공합니다. 단일 tsd 프로세스는 초당 이벤트 처리량이 높습니다. 부하 분산을 위해 이 가이드의 각 배포는 읽기 및 쓰기 pod의 3개 복제본을 만듭니다.

  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 파일에 있습니다.

프로덕션 배포에서는 실행 중인 tsd pod 수를 Kubernetes에서 자동 확장을 사용하여 또는 수동으로 늘릴 수 있습니다. 이와 비슷하게, GKE 클러스터에서 수동으로 또는 클러스터 자동 확장 처리를 사용하여 인스턴스 수를 늘릴 수 있습니다.

OpenTSDB 서비스 만들기

배포에 일관적인 네트워크 연결을 제공하기 위해 2개의 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에 데이터를 쓰기 위한 메커니즘은 여러 가지가 있습니다. 서비스 엔드포인트를 정의한 후에는 프로세스가 데이터 쓰기를 시작하도록 지시할 수 있습니다. 이 가이드에서는 클러스터 메모리 활용(memory_usage_gauge) 및 클러스터 CPU 활용(cpu_node_utilization_gauge)의 두 가지 측정항목을 위해 시연용 시계열 데이터를 제공하는 Python 서비스를 배포합니다.

  • Cloud Shell에서 시계열 측정항목 생성기를 클러스터에 배포합니다.

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

OpenTSDB로 예시 시계열 데이터 검사

이 가이드의 앞부분에서 배포한 opentsdb-read 서비스 엔드포인트를 사용하여 시계열 측정항목을 쿼리할 수 있습니다. 이 데이터는 다음 방식으로 사용할 수 있습니다. 한 가지 일반적인 옵션은 이를 시각화하는 것입니다. OpenTSDB에는 수집하는 측정항목을 시각화하기 위한 기본 인터페이스가 포함되어 있습니다. 이 가이드에서는 측정항목을 시각화하기 위한 일반적인 대안이며 추가 기능을 제공하는 Grafana를 사용합니다.

클러스터에서 Grafana를 실행하려면 OpenTSDB를 설정하기 위해 사용된 것과 비슷한 프로세스가 필요합니다. ConfigMap 및 배포 만들기 외에도 Kubernetes 클러스터에서 실행되는 동안 Grafana에 액세스할 수 있도록 포트 전달을 구성해야 합니다.

  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 포드 이름을 가져오고 이를 사용해서 포트 전달을 설정합니다.

    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 파일은 opentsdb-read 서비스에 연결하고, 익명 인증을 허용하고, 일부 기본 클러스터 측정항목을 표시하도록 Grafana를 구성합니다. 프로덕션 환경에서 Grafana를 배포하기 위해서는 적절한 인증 메커니즘을 구현하고 더 효과적인 시계열 그래프를 사용하는 것이 좋습니다.

정리

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

개별 리소스 삭제

  1. 생성한 모든 아티팩트를 삭제하기 위해 Kubernetes 클러스터를 삭제합니다.

    gcloud container clusters delete GKE_CLUSTER_NAME
    

    Kubernetes 클러스터를 삭제하려면 Y를 입력하여 확인합니다.

  2. Bigtable 인스턴스를 삭제하려면 다음을 수행합니다.

    1. Google Cloud Console에서 Bigtable로 이동합니다.

      Bigtable로 이동

    2. 이전에 만든 인스턴스를 선택한 후 인스턴스 삭제를 클릭합니다.

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계