일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- eBPF
- CANARY
- Kopf
- Argo
- CI/CD
- Kubernetes 인증
- 카오스 엔지니어링
- nginx ingress
- opensearch
- serving
- gitops
- Kubernetes
- argocd
- knative
- operator
- Pulumi
- Litmus
- opentelemetry
- Continuous Deployment
- tekton
- blue/green
- mlops
- Model Serving
- kubernetes operator
- 오퍼레이터
- Kubeflow
- MLflow
- seldon core
- keda
- xdp
- Today
- Total
Kubernetes 이야기
OpenTelemetry auto-instrumentation 본문
OpenTelemetry에서 애플리케이션의 관찰을 위해 아래와 같은 방법을 사용할 수 있다.
- 수동(명시적) : 소스 코드에 Opentelemetry API를 사용하여 애플리케이션 모니터링
- 자동 : 애플리케이션의 코드 수정 없이 모니터링 ( Java에서 보통 제니퍼나 Scouter 등이 이런 방식이다. )
OpenTelemetry에서 자동으로 애플리케이션에 대한 관찰을 지원하기 위한 Auto instrumentation 방식을 알아보자.
설치
opentelemetry 설치 전 cert-manager가 설치되어 있어야 한다. cert-manager 설치는 다음을 참고한다.
# 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++ 같은 컴파일된 언어도 지원할 예정이라고 한다.
'Kubernetes > 모니터링' 카테고리의 다른 글
Prometheus에서 주요 alert rule (0) | 2022.05.06 |
---|---|
OpenTelemetry (0) | 2022.04.16 |
host 서버에서 pod내부의 외부 통신 상태 (netstat) 조회 (0) | 2022.03.22 |
Robusta 를 활용한 Kubernetes 문제점 해결하기 (0) | 2022.02.27 |
Kyverno 정책 모니터링 (0) | 2022.02.20 |