5.5. 분산 추적 플랫폼(Jaeger)에서 분산 추적 데이터 수집으로 마이그레이션

애플리케이션에 Red Hat OpenShift distributed tracing Platform(Jaeger)을 이미 사용하고 있는 경우 OpenTelemetry 오픈 소스 프로젝트를 기반으로 하는 Red Hat OpenShift distributed tracing 데이터 수집으로 마이그레이션할 수 있습니다.

분산 추적 데이터 수집은 분산 시스템에서 관찰 기능을 용이하게 하기 위해 API, 라이브러리, 에이전트 및 계측 세트를 제공합니다. 분산 추적 데이터 컬렉션의 OpenTelemetry 수집기는 Jaeger 프로토콜을 수집할 수 있으므로 애플리케이션의 SDK를 변경할 필요가 없습니다.

분산 추적 플랫폼(Jaeger)에서 분산 추적 데이터 수집으로 마이그레이션하려면 OpenTelemetry 수집기 및 애플리케이션이 추적을 원활하게 보고하도록 구성해야 합니다. 사이드카 및 사이드카 없는 배포를 마이그레이션할 수 있습니다.

5.5.1. 분산 추적 플랫폼(Jaeger)에서 사이드카를 사용하여 분산 추적 데이터 컬렉션으로 마이그레이션

분산 추적 데이터 수집 Operator는 배포 워크로드에 사이드카 삽입을 지원하므로 분산 추적 플랫폼(Jaeger) 사이드카에서 분산 추적 데이터 수집 사이드카로 마이그레이션할 수 있습니다.

전제 조건

  • Red Hat OpenShift distributed tracing platform(Jaeger)은 클러스터에서 사용됩니다.
  • Red Hat OpenShift distributed tracing 데이터 수집이 설치됩니다.

프로세스

  1. OpenTelemetry 수집기를 사이드카로 구성합니다.

    apiVersion: opentelemetry.io/v1alpha1
    kind: OpenTelemetryCollector
    metadata:
      name: otel
      namespace: <otel-collector-namespace>
    spec:
      mode: sidecar
      config: |
        receivers:
          jaeger:
            protocols:
              grpc:
              thrift_binary:
              thrift_compact:
              thrift_http:
        processors:
          batch:
          memory_limiter:
            check_interval: 1s
            limit_percentage: 50
            spike_limit_percentage: 30
          resourcedetection:
            detectors: [openshift]
            timeout: 2s
        exporters:
          otlp:
            endpoint: "tempo-<example>-gateway:8090" 1
            tls:
              insecure: true
        service:
          pipelines:
            traces:
              receivers: [jaeger]
              processors: [memory_limiter, resourcedetection, batch]
              exporters: [otlp]
    1
    이 끝점은 Tempo Operator를 사용하여 배포된 TempoStack 인스턴스의 게이트웨이를 <example> 가리킵니다.
  2. 애플리케이션 실행을 위한 서비스 계정을 생성합니다.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: otel-collector-sidecar
  3. 일부 프로세서에 필요한 권한에 대한 클러스터 역할을 생성합니다.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: otel-collector-sidecar
    rules:
      1
    - apiGroups: ["config.openshift.io"]
      resources: ["infrastructures", "infrastructures/status"]
      verbs: ["get", "watch", "list"]
    1
    리소스 감지 프로세서에 는 인프라 및 인프라/상태에 대한 권한이 필요합니다.
  4. ClusterRoleBinding 을 생성하여 서비스 계정에 대한 권한을 설정합니다.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: otel-collector-sidecar
    subjects:
    - kind: ServiceAccount
      name: otel-collector-deployment
      namespace: otel-collector-example
    roleRef:
      kind: ClusterRole
      name: otel-collector
      apiGroup: rbac.authorization.k8s.io
  5. OpenTelemetry Collector를 사이드카로 배포합니다.
  6. Deployment 오브젝트에서 "sidecar.jaegertracing.io/inject": "true" 주석을 제거하여 애플리케이션에서 삽입된 Jaeger 에이전트를 제거합니다.
  7. Deployment 오브젝트의 .spec.template.metadata.annotations 필드에 sidecar.opentelemetry.io/inject: "true" 주석을 추가하여 OpenTelemetry 사이드카 자동 삽입을 활성화합니다.
  8. 생성된 서비스 계정을 사용하여 애플리케이션이 배포되면 프로세서가 올바른 정보를 가져와서 추적에 추가할 수 있습니다.

5.5.2. 분산 추적 플랫폼(Jaeger)에서 사이드카 없이 분산 추적 데이터 수집으로 마이그레이션

사이드카 배포 없이 분산 추적 플랫폼(Jaeger)에서 분산 추적 데이터 컬렉션으로 마이그레이션할 수 있습니다.

전제 조건

  • Red Hat OpenShift distributed tracing platform(Jaeger)은 클러스터에서 사용됩니다.
  • Red Hat OpenShift distributed tracing 데이터 수집이 설치됩니다.

프로세스

  1. OpenTelemetry 수집기 배포를 구성합니다.
  2. OpenTelemetry 수집기를 배포할 프로젝트를 생성합니다.

    apiVersion: project.openshift.io/v1
    kind: Project
    metadata:
      name: observability
  3. OpenTelemetry 수집기 인스턴스를 실행하기 위한 서비스 계정을 생성합니다.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: otel-collector-deployment
      namespace: observability
  4. 프로세서에 필요한 권한을 설정하는 클러스터 역할을 생성합니다.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: otel-collector
    rules:
      1
      2
    - apiGroups: ["", "config.openshift.io"]
      resources: ["pods", "namespaces", "infrastructures", "infrastructures/status"]
      verbs: ["get", "watch", "list"]
    1
    k8sattributes 프로세서에Pod네임스페이스 리소스에 대한 권한이 필요합니다.
    2
    리소스 감지 프로세서에인프라 및 인프라/상태에 대한 권한이 필요합니다.
  5. ClusterRoleBinding을 생성하여 서비스 계정에 대한 권한을 설정합니다.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: otel-collector
    subjects:
    - kind: ServiceAccount
      name: otel-collector-deployment
      namespace: observability
    roleRef:
      kind: ClusterRole
      name: otel-collector
      apiGroup: rbac.authorization.k8s.io
  6. OpenTelemetry 수집기 인스턴스를 생성합니다.

    참고

    이 수집기는 추적을 TempoStack 인스턴스로 내보냅니다. Red Hat Tempo Operator를 사용하여 TempoStack 인스턴스를 생성하고 여기에 올바른 끝점을 배치해야 합니다.

    apiVersion: opentelemetry.io/v1alpha1
    kind: OpenTelemetryCollector
    metadata:
      name: otel
      namespace: observability
    spec:
      mode: deployment
      serviceAccount: otel-collector-deployment
      config: |
        receivers:
          jaeger:
            protocols:
              grpc:
              thrift_binary:
              thrift_compact:
              thrift_http:
        processors:
          batch:
          k8sattributes:
          memory_limiter:
            check_interval: 1s
            limit_percentage: 50
            spike_limit_percentage: 30
          resourcedetection:
            detectors: [openshift]
        exporters:
          otlp:
            endpoint: "tempo-example-gateway:8090"
            tls:
              insecure: true
        service:
          pipelines:
            traces:
              receivers: [jaeger]
              processors: [memory_limiter, k8sattributes, resourcedetection, batch]
              exporters: [otlp]
  7. 추적 끝점을 OpenTelemetry Operator를 가리킵니다.
  8. 애플리케이션에서 직접 추적을 Jaeger로 내보내는 경우 API 끝점을 Jaeger 끝점에서 OpenTelemetry 수집기 끝점으로 변경합니다.

    Golang에서 jaegerexporter 를 사용하여 추적 내보내기 예

    exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url))) 1

    1
    URL은 OpenTelemetry 수집기 API 끝점을 가리킵니다.