Kubernetes 이야기

OpenTelemetry auto-instrumentation 본문

Kubernetes/모니터링

OpenTelemetry auto-instrumentation

kmaster 2022. 4. 16. 17:06
반응형

OpenTelemetry에서 애플리케이션의 관찰을 위해 아래와 같은 방법을 사용할 수 있다.

 

  • 수동(명시적) : 소스 코드에 Opentelemetry API를 사용하여 애플리케이션 모니터링
  • 자동 : 애플리케이션의 코드 수정 없이 모니터링 ( Java에서 보통 제니퍼나 Scouter 등이 이런 방식이다. )

OpenTelemetry에서 자동으로 애플리케이션에 대한 관찰을 지원하기 위한 Auto instrumentation 방식을 알아보자.

설치

 

opentelemetry 설치 전 cert-manager가 설치되어 있어야 한다. cert-manager 설치는 다음을 참고한다.

https://kmaster.tistory.com/5

 

cert-manager와 letsencrypt 연동

1. cert-manager cert-manager는 Kubernetes안에서 TLS 인증서를 자동으로 설치하고 관리 (유효기간 만료시 갱신) 기능을 가지고 있다. https://cert-manager.io/docs/ cert-manager Automatically pr..

kmaster.tistory.com

 

# kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
namespace/opentelemetry-operator-system created
customresourcedefinition.apiextensions.k8s.io/instrumentations.opentelemetry.io created
customresourcedefinition.apiextensions.k8s.io/opentelemetrycollectors.opentelemetry.io created
serviceaccount/opentelemetry-operator-controller-manager created
role.rbac.authorization.k8s.io/opentelemetry-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/opentelemetry-operator-manager-role created
clusterrole.rbac.authorization.k8s.io/opentelemetry-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/opentelemetry-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/opentelemetry-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/opentelemetry-operator-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/opentelemetry-operator-proxy-rolebinding created
service/opentelemetry-operator-controller-manager-metrics-service created
service/opentelemetry-operator-webhook-service created
deployment.apps/opentelemetry-operator-controller-manager created
certificate.cert-manager.io/opentelemetry-operator-serving-cert created
issuer.cert-manager.io/opentelemetry-operator-selfsigned-issuer created
mutatingwebhookconfiguration.admissionregistration.k8s.io/opentelemetry-operator-mutating-webhook-configuration created
validatingwebhookconfiguration.admissionregistration.k8s.io/opentelemetry-operator-validating-webhook-configuration createdkubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml

 

배포가 되었으면 opentelemery collertor를 다음과 같이 생성한다.

kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: otel
spec:
  config: |
    receivers:
      otlp:
        protocols:
          grpc:
          http:
    processors:

    exporters:
      logging:

    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: []
          exporters: [logging]
EOF
opentelemetrycollector.opentelemetry.io/otel created

 

OpenTelemetry에서는 Instrumentation CR을 생성하고 namespace 또는 workload annotation을 통해 모니터링을 위한 수집을 한다.

kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: my-instrumentation
spec:
  exporter:
    endpoint: http://otel-collector:4317
  propagators:
    - tracecontext
    - baggage
    - b3
  sampler:
    type: parentbased_traceidratio
    argument: "0.25"
  java:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:latest
  nodejs:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-nodejs:latest
  python:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-python:latest
EOF

 

예제

아래와 같은 workload 를 실행해 보자.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-petclinic
spec:
  selector:
    matchLabels:
      app: spring-petclinic
  replicas: 1
  template:
    metadata:
      labels:
        app: spring-petclinic
      annotations:
        sidecar.opentelemetry.io/inject: "true"
        instrumentation.opentelemetry.io/inject-java: "true"
    spec:
      containers:
      - name: app
        image: springcommunity/spring-framework-petclinic
---
apiVersion: v1
kind: Service
metadata:
  name: spring-petclinic
spec:
  type: NodePort
  selector:
    app: spring-petclinic
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080

 

이제 브라우저에서 PetClinic application을 호출하면 opentelemetry를 통해 모니터링 데이터가 수집될 것이다.

 

Jaeger

설치

 

1) Operator 설치

# kubectl create namespace observability
# kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.33.0/jaeger-operator.yaml -n observability

 

2) CR 생성

cat <<EOF | kubectl apply -f -
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
  name: jaeger
spec:
  ingress:
    enabled: false
EOF
# k get jaegers.jaegertracing.io
NAME     STATUS    VERSION   STRATEGY   STORAGE   AGE
jaeger   Running             allinone   memory    4s

 

jaeger가 설치되었으면 OpenTelemetry 에서 수집된 data를 Jaeger로 export해보자.

kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: otel
spec:
  config: |
    receivers:
      otlp:
        protocols:
          grpc:
          http:
    processors:

    exporters:
      logging:
      jaeger:
        endpoint: "jaeger-collector:14250"
        tls:
          insecure: true

    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: []
          exporters: [logging, jaeger]
EOF

 

이제 Jaeger 화면을 조회하면 아래와 같이 spring-petclinic에 대한 trace 로그를 조회할 수 있다.

사용자가 조회한 구간별 시간과 Query등을 상세히 조회할 수 있다.

현재 예제는 Java 애플리케이션으로 JVM옵션에 Javaagent를 주입하여 바이트코드를 조작하여 수행됩니다.  ( 다른 언어도 유사한 개념이 도입됩니다. )

 

OpenTelemetry Operator는 Pod 개체가 생성되거나 업데이트될 때 호출되는 mutating admission webhook을 구현하여 사용된다. 웹훅은 자동 계측 라이브러리를 애플리케이션 컨테이너에 삽입하도록 Pod 개체를 수정하고 OpenTelemetry SDK 및 런타임(이 경우 자동 계측을 사용하도록 JVM(Java Virtual Machine)을 구성한다.

 

실제 spring-petclinic pod 로그를 보면

Picked up JAVA_TOOL_OPTIONS:  -javaagent:/otel-auto-instrumentation/javaagent.jar
[otel.javaagent 2022-04-16 11:54:11:398 +0000] [main] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: 1.11.1
2022-04-16 11:54:19.801:INFO::main: Logging initialized @9430ms to org.eclipse.jetty.util.log.StdErrLog
2022-04-16 11:54:19.963:INFO:oeju.TypeUtil:main: JVM Runtime does not support Modules

-javaagent:/otel-auto-instrumentation/javaagent.jar 가 삽입된 것을 볼 수 있다.

 

현재 Java, Python, NodeJS 런타임만 지원되지만 Javascript 뿐만 아니라 Golang이나 C++ 같은 컴파일된 언어도 지원할 예정이라고 한다.

반응형
Comments