Google Kubernetes Engine에 OpenTelemetry Collector 배포

이 문서에서는 GKE 클러스터에서 OpenTelemetry Collector를 실행하여 계측된 애플리케이션에서 OTLP 로그, 측정항목, trace를 수집하고 이 데이터를 Google Cloud로 내보내는 방법을 보여줍니다.

시작하기 전에

GKE에서 OpenTelemetry Collector를 실행하려면 다음 리소스가 필요합니다.

  • Cloud Monitoring API, Cloud Trace API, Cloud Logging API가 사용 설정된 Google Cloud 프로젝트

    • Google Cloud 프로젝트가 없으면 다음을 수행합니다.

      1. Google Cloud 콘솔에서 새 프로젝트로 이동합니다.

        새 프로젝트 만들기

      2. 프로젝트 이름 필드에서 프로젝트 이름을 입력한 후 만들기를 클릭합니다.

      3. 결제로 이동:

        결제로 이동

      4. 페이지 상단에서 아직 선택하지 않았으면 바로 전에 만든 프로젝트를 선택합니다.

      5. 기존 결제 프로필을 선택하거나 새 결제 프로필을 만들라는 메시지가 표시됩니다.

      기본적으로 Monitoring API, Trace API, Logging API는 새 프로젝트에 사용 설정되어 있습니다.

    • Google Cloud 프로젝트가 이미 있으면 Monitoring API, Trace API, Logging API가 사용 설정되었는지 확인합니다.

      1. API 및 서비스로 이동합니다.

        API 및 서비스로 이동

      2. 프로젝트를 선택합니다.

      3. API 및 서비스 사용 설정을 클릭합니다.

      4. 이름별로 각 API를 검색합니다.

      5. 검색 결과에서 이름이 지정된 API를 클릭합니다. Monitoring API가 'Stackdriver Monitoring API'로 표시됩니다.

      6. 'API 사용 설정'이 표시되지 않으면 사용 설정 버튼을 클릭합니다.

  • Kubernetes 클러스터가 필요합니다. Kubernetes 클러스터가 없으면 GKE 빠른 시작 안내를 따릅니다.

  • 다음 명령줄 도구:

    • gcloud
    • kubectl

    gcloudkubectl 도구는 Google Cloud CLI의 일부입니다. 설치에 대한 자세한 내용은 Google Cloud CLI 구성요소 관리를 참조하세요. 설치한 gcloud CLI 구성요소를 보려면 다음 명령어를 실행하세요.

    gcloud components list
    

Collector 배포

PROJECT_ID를 Google Cloud 프로젝트 ID로 바꾼 후 다음 명령어를 사용하여 GitHub에서 직접 Collector 파이프라인을 배포할 수 있습니다.

export GCLOUD_PROJECT=PROJECT_ID
kubectl kustomize https://github.com/GoogleCloudPlatform/otlp-k8s-ingest.git/k8s/base | envsubst | kubectl apply -f -

Collector 관찰 및 디버그

OpenTelemetry Collector는 성능을 모니터링하고 OTLP 수집 파이프라인의 지속적인 업타임을 보장하는 데 도움이 되는 자체 관측 가능성 측정항목을 즉시 제공합니다.

Collector를 모니터링하려면 Collector의 샘플 대시보드를 설치합니다. 이 대시보드는 업타임, 메모리 사용량, Google Cloud Observability에 대한 API 호출을 포함하여 Collector의 여러 측정항목에 대한 유용한 정보를 한번에 제공합니다.

대시보드를 설치하려면 다음을 수행합니다.

  1. Google Cloud 콘솔에서  대시보드 페이지로 이동합니다.

    대시보드로 이동

    검색창을 사용하여 이 페이지를 찾은 경우 부제목이 Monitoring인 결과를 선택합니다.

  2. 샘플 라이브러리 탭을 선택합니다.
  3. OpenTelemetry Collector 카테고리를 선택합니다.
  4. 'OpenTelemtry Collector' 대시보드를 선택합니다.
  5.  가져오기를 클릭합니다.

설치 프로세스에 대한 자세한 내용은 샘플 대시보드 설치를 참조하세요.

Collector 구성

자체 관리형 OTLP 수집 파이프라인에는 일관된 GKE 및 Kubernetes 메타데이터가 연결된 대량의 OTLP 측정항목, 로그, trace를 전송하도록 설계된 기본 OpenTelemetry Collector 구성이 포함되어 있습니다. 또한 일반적인 수집 문제가 방지되도록 설계되었습니다.

그러나 기본 구성을 맞춤설정해야 하는 고유한 니즈가 있을 수 있습니다. 이 섹션에서는 파이프라인과 함께 제공되는 기본값과 이러한 기본값을 니즈에 맞게 맞춤설정하는 방법을 설명합니다.

기본 Collector 구성은 GitHub에 config/collector.yaml로 있습니다.

# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

exporters:
  googlecloud:
    log:
      default_log_name: opentelemetry-collector
    user_agent: Google-Cloud-OTLP manifests:0.1.0 otel/opentelemetry-collector-contrib:0.106.0
  googlemanagedprometheus:
    user_agent: Google-Cloud-OTLP manifests:0.1.0 otel/opentelemetry-collector-contrib:0.106.0

extensions:
  health_check:
    endpoint: ${env:MY_POD_IP}:13133
processors:
  filter/self-metrics:
    metrics:
      include:
        match_type: strict
        metric_names:
        - otelcol_process_uptime
        - otelcol_process_memory_rss
        - otelcol_grpc_io_client_completed_rpcs
        - otelcol_googlecloudmonitoring_point_count
  batch:
    send_batch_max_size: 200
    send_batch_size: 200
    timeout: 5s

  k8sattributes:
    extract:
      metadata:
      - k8s.namespace.name
      - k8s.deployment.name
      - k8s.statefulset.name
      - k8s.daemonset.name
      - k8s.cronjob.name
      - k8s.job.name
      - k8s.node.name
      - k8s.pod.name
      - k8s.pod.uid
      - k8s.pod.start_time
    passthrough: false
    pod_association:
    - sources:
      - from: resource_attribute
        name: k8s.pod.ip
    - sources:
      - from: resource_attribute
        name: k8s.pod.uid
    - sources:
      - from: connection
  memory_limiter:
    check_interval: 1s
    limit_percentage: 65
    spike_limit_percentage: 20

  metricstransform/self-metrics:
    transforms:
    - action: update
      include: otelcol_process_uptime
      operations:
      - action: add_label
        new_label: version
        new_value: Google-Cloud-OTLP manifests:0.1.0 otel/opentelemetry-collector-contrib:0.106.0

  # We need to add the pod IP as a resource label so the k8s attributes processor can find it.
  resource/self-metrics:
    attributes:
    - action: insert
      key: k8s.pod.ip
      value: ${env:MY_POD_IP}

  resourcedetection:
    detectors: [gcp]
    timeout: 10s

  transform/collision:
    metric_statements:
    - context: datapoint
      statements:
      - set(attributes["exported_location"], attributes["location"])
      - delete_key(attributes, "location")
      - set(attributes["exported_cluster"], attributes["cluster"])
      - delete_key(attributes, "cluster")
      - set(attributes["exported_namespace"], attributes["namespace"])
      - delete_key(attributes, "namespace")
      - set(attributes["exported_job"], attributes["job"])
      - delete_key(attributes, "job")
      - set(attributes["exported_instance"], attributes["instance"])
      - delete_key(attributes, "instance")
      - set(attributes["exported_project_id"], attributes["project_id"])
      - delete_key(attributes, "project_id")

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: ${env:MY_POD_IP}:4317
      http:
        cors:
          allowed_origins:
          - http://*
          - https://*
        endpoint: ${env:MY_POD_IP}:4318
  prometheus/self-metrics:
    config:
      scrape_configs:
      - job_name: otel-self-metrics
        scrape_interval: 1m
        static_configs:
        - targets:
          - ${env:MY_POD_IP}:8888

service:
  extensions:
  - health_check
  pipelines:
    logs:
      exporters:
      - googlecloud
      processors:
      - k8sattributes
      - resourcedetection
      - memory_limiter
      - batch
      receivers:
      - otlp
    metrics/otlp:
      exporters:
      - googlemanagedprometheus
      processors:
      - k8sattributes
      - memory_limiter
      - resourcedetection
      - transform/collision
      - batch
      receivers:
      - otlp
    metrics/self-metrics:
      exporters:
      - googlemanagedprometheus
      processors:
      - filter/self-metrics
      - metricstransform/self-metrics
      - resource/self-metrics
      - k8sattributes
      - memory_limiter
      - resourcedetection
      - batch
      receivers:
      - prometheus/self-metrics
    traces:
      exporters:
      - googlecloud
      processors:
      - k8sattributes
      - memory_limiter
      - resourcedetection
      - batch
      receivers:
      - otlp
  telemetry:
    metrics:
      address: ${env:MY_POD_IP}:8888

수출업체

기본 내보내기 도구에는 googlecloud 내보내기 도구(로그 및 trace용)와 googlemanagedprometheus 내보내기 도구(측정항목용)가 포함됩니다.

googlecloud 내보내기 도구는 기본 로그 이름으로 구성됩니다. googlemanagedprometheus 내보내기 도구에는 기본 구성이 필요하지 않습니다. 이 내보내기 도구를 구성하는 방법에 대한 자세한 내용은 Google Cloud Managed Service for Prometheus 문서의 OpenTelemetry Collector 시작하기를 참조하세요.

프로세서

기본 구성에는 다음 프로세서가 포함됩니다.

  • batch: 요청당 Google Cloud 최대 항목 수 또는 Google Cloud 최소 간격인 5초마다(둘 중 더 먼저 오는 값) 원격 분석 요청을 일괄 처리하도록 구성됩니다.
  • k8sattributes: Kubernetes 리소스 속성을 원격 분석 라벨에 자동으로 매핑합니다.
  • memory_limiter: 이 수준을 초과하는 데이터 포인트를 삭제하여 메모리 부족 비정상 종료가 방지되도록 Collector 메모리 사용량을 적절한 수준으로 제한합니다.
  • resourcedetection: 클러스터 이름 및 프로젝트 ID와 같은 Google Cloud 리소스 라벨을 자동으로 감지합니다.
  • transform: Google Cloud 모니터링 리소스 필드와 충돌하는 측정항목 라벨의 이름을 바꿉니다.

수신자

기본 구성에는 otlp 수신기만 포함됩니다. 애플리케이션을 계측하여 OTLP trace 및 측정항목을 Collector의 OTLP 엔드포인트로 내보내는 방법에 대한 자세한 내용은 계측 방법 선택을 참조하세요.

다음 단계: 원격 분석 수집 및 보기

이 섹션에서는 샘플 애플리케이션을 배포하고 이 애플리케이션을 Collector의 OTLP 엔드포인트로 가리키며 Google Cloud에서 원격 분석을 보는 방법을 설명합니다. 샘플 애플리케이션은 trace, 로그, 측정항목을 Collector로 내보내는 소형 생성기입니다.

이미 OpenTelemetry SDK로 계측된 애플리케이션이 있으면 애플리케이션을 대신 Collector 엔드포인트로 가리킬 수 있습니다.

샘플 애플리케이션을 배포하려면 다음 명령어를 실행합니다.

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/otlp-k8s-ingest/main/sample/app.yaml

Collector 엔드포인트에서 OpenTelemetry SDK를 사용하는 기존 애플리케이션을 가리키려면 OTEL_EXPORTER_OTLP_ENDPOINT 환경 변수를 http://opentelemetry-collector.opentelemetry.svc.cluster.local:4317로 설정합니다.

몇 분 후 애플리케이션에서 생성된 원격 분석이 Collector를 통해 각 신호의 Google Cloud 콘솔로 전송되기 시작합니다.